【spring】第一篇 IOC和DI入门案例

2024-06-02 22:28

本文主要是介绍【spring】第一篇 IOC和DI入门案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Spring到底是如何来实现IOC和DI的,那接下来就通过一些简单的入门案例,来演示下具体实现过程。

目录

前期准备

一、IOC入门案例

思路分析

代码实现

二、DI入门案例

思路分析

代码实现

总结


前期准备

使用IDEA创建Maven项目,首先需要配置好Maven,新建一个Maven项目。

一、IOC入门案例

思路分析

(1)Spring是使用容器来管理bean对象的,那么管什么?

  • 主要管理项目中所使用到的类对象,比如(Service和Dao)

(2)如何将被管理的对象告知IOC容器?

  • 使用配置文件

(3)被管理的对象交给IOC容器,要想从容器中获取对象,就先得思考如何获取到IOC容器?

  • Spring框架提供相应的接口

(4)IOC容器得到后,如何从容器中获取bean?

  • 调用Spring框架提供对应接口中的方法

(5)使用Spring导入哪些坐标?

  • 用别人的东西,就需要在pom.xml添加对应的依赖

代码实现

(1)创建Maven项目,在pom.xml 添加Spring的依赖jar包,

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
</dependencies>

(2)创建BookService,BookServiceImpl,BookDao和BookDaoImpl四个类,

目录如下:

package com.water.dao;public interface BookDao {public void save();
}
package com.water.dao.impl;import com.water.dao.BookDao;public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save ...");}
}
package com.water.server;public interface BookService {public void save();
}
package com.water.server.impl;import com.water.dao.BookDao;
import com.water.dao.impl.BookDaoImpl;
import com.water.server.BookService;public class BookServiceImpl implements BookService {private BookDao bookDao = new BookDaoImpl();public void save() {System.out.println("book service save ...");bookDao.save();}
}

(3)resources下添加spring配置文件applicationContext.xml,并完成bean的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean标签标示配置beanid属性标示给bean起名字class属性表示给bean定义类型--><bean id="bookDao" class="com.water.dao.impl.BookDaoImpl"></bean><bean id="bookService" class="com.water.server.impl.BookServiceImpl"></bean>
</beans>

(4)首先获取IOC容器,使用Spring提供的接口完成IOC容器的创建,创建App类,编写main方法。然后,从容器中获取对象进行方法调用。

package com.water;import com.water.dao.BookDao;
import com.water.server.impl.BookService;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App 
{public static void main( String[] args ) {// 获取IOC容器ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取beanBookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();BookService bookService = (BookService) ctx.getBean("bookService");bookService.save();}
}

运行代码,测试结果为:

Spring的IOC入门案例已经完成,但是在BookServiceImpl的类中依然存在BookDaoImpl对象的new操作,它们之间的耦合度还是比较高,这块该如何解决,就需要用到下面的DI:依赖注入

二、DI入门案例

思路分析

(1)要想实现依赖注入,必须要基于IOC管理Bean

  • DI的入门案例要依赖于前面IOC的入门案例

(2)Service中使用new形式创建的Dao对象是否保留?

  • 需要删除掉,最终要使用IOC容器中的bean对象

(3)Service中需要的Dao对象如何进入到Service中?

  • 在Service中提供方法,让Spring的IOC容器可以通过该方法传入bean对象

(4)Service与Dao间的关系如何描述?

  • 使用配置文件

代码实现

(1)在BookServiceImpl类中,删除业务层中使用new的方式创建的dao对象 。在BookServiceImpl类中,为BookDao提供setter方法。

package com.water.server.impl;import com.water.dao.BookDao;
import com.water.dao.impl.BookDaoImpl;
import com.water.server.BookService;public class BookServiceImpl implements BookService {//删除业务层中使用new的方式创建的dao对象
//  private BookDao bookDao = new BookDaoImpl();private BookDao bookDao;public void save() {System.out.println("book service save ...");bookDao.save();}// 为属性提供setter方法public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}
}

(2)在配置文件中添加依赖注入的配置,

  • name="bookDao"中bookDao的作用是让Spring的IOC容器在获取到名称后,将首字母大写,前面加set找对应的setBookDao()方法进行对象注入

  • ref="bookDao"中bookDao的作用是让Spring能在IOC容器中找到id为bookDao的Bean对象给bookService进行注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean标签标示配置beanid属性标示给bean起名字class属性表示给bean定义类型--><bean id="bookDao" class="com.water.dao.impl.BookDaoImpl"></bean><bean id="bookService" class="com.water.server.impl.BookServiceImpl"><!--配置server与dao的关系--><!--property标签表示配置当前bean的属性name属性表示配置哪一个具体的属性ref属性表示参照哪一个bean--><property name="bookDao" ref="bookDao"></property></bean>
</beans>

(4)运行,测试结果为:

补充:bean基础配置

(1)bean的基础配置

对于bean的基础配置,在前面的案例中已经使用过:

<bean id="" class=""/>

其中,bean标签的功能、使用方式以及id和class属性的作用,我们通过一张图来描述下

(2)bean的别名配置

(3)bean的作用范围

在Spring配置文件中,配置scope属性来实现bean的非单例创建,使用bean的scope属性可以控制bean的创建是否为单例:

  • singleton默认为单例
  • prototype为非单例

介绍完scope属性以后,我们来思考几个问题:

1)为什么bean默认为单例?

bean为单例的意思是在Spring的IOC容器中只会有该类的一个对象。bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高

2)bean在容器中是单例的,会不会产生线程安全问题?

  • 如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,因为所有请求线程共用一个bean对象,所以会存在线程安全问题。

  • 如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,因为方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。

3)哪些bean对象适合交给容器进行管理?

  • 表现层对象

  • 业务层对象

  • 数据层对象

  • 工具对象

4)哪些bean对象不适合交给容器进行管理?

封装实例的域对象,因为会引发线程安全问题,所以不适合。

总结

通过前面两个案例,我们已经学习了bean如何定义配置DI如何定义配置以及容器对象如何获取的内容。

这篇关于【spring】第一篇 IOC和DI入门案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025259

相关文章

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

SpringBoot整合OpenFeign的完整指南

《SpringBoot整合OpenFeign的完整指南》OpenFeign是由Netflix开发的一个声明式Web服务客户端,它使得编写HTTP客户端变得更加简单,本文为大家介绍了SpringBoot... 目录什么是OpenFeign环境准备创建 Spring Boot 项目添加依赖启用 OpenFeig

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖