一、名词解释
1、控制反转/ IoC:在配置文件中创建对象
2、IoC容器:spring提供的一个容器,用来创建和管理对象
2、bean:在IoC容器中创建的对象的统称
2.1:id:就是给这个bean起个名字
2.2、class:创建一个什么类型的bean,(包名+类名)
2.3、name:和id具有同样功能,但name可以写多个,中间用空格/逗号/分号隔开
2.4、scope:bean的作用范围
①、singleton单例(确保一个类只有一个实例)
②、prototype非单例(一个类中可以有多个实例)
3、拓展
3.1、静态工厂:指工厂的服务是静态的,即工厂提供的方法是static
①、factory-bean:工厂实例,
3.2、实例工厂:工厂的服务不是静态的,即工厂提供的方法没有static
①、factory-bean:工厂实例
②、factory-method:工厂方法
3、依赖注入/DI:IoC容器中对象的关系的整个过程。即在IoC容器中对有依赖关系的bean进行绑定。
4、依赖注入方式:向一个类传入数据的方式
4.1、setter注入(引用数据类型和简单数据类型)
4.2、constructor注入(引用数据类型和简单数据类型)
二、setter注入(引用数据类型和简单数据类型)
1、新建一个maven项目
2、导入spring坐标并刷新maven——选择pom.xml
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.10.RELEASE</version> </dependency>
3、在java包下新建dao包和service包,并分别在其包下新建接口和类
4、在dao和service包下新建一个UserDao类和方法save()
5、在resource包下新建spring config配置文件,命名为applicationContext.xml
------
如果发现没有这个resource包,直接新建就好 file——project structure——在Java/main上右键——new folder——新建后选中刚刚新建的包,再把上面的resource点击一下——ok
--------------
6、在resource配置文件下,分别创建UserDao和UserService的bean
7、这一步就是配置这两个bean的关系了,比如main调用UserServce,UserService调用UserDao
在UserService类中引用类型名private……并提供setter方法,具体步骤如下:
写好引用数据类型private UserDao userDao,然后右键——Generate——Setter——UserDao——ok
package service.Impl; import dao.UserDao; import service.UserService; public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void save() { System.out.println("setter注入————引用数据类型-----service层"); userDao.save(); } }
建立这两个bean的关系,既然是UserService对象调用UserDao,那就在UserService bean中配置UserDao属性property,name为引用类型名(private……),ref引用对象即UserDao bean的id
--------
重点说一下这里property里的参数
name:是类型名,和UserService里的引用类型名保持一致即private UserDao userDao保持一致
ref:是IoC容器创建的dao层的UserDao的Bean的id值
--------
8、到这里Setter注入--引用类型就完成了,剩下的就是测试了
在test包的新建一个test类
import org.springframework.context.support.ClassPathXmlApplicationContext; import service.UserService; public class SetterTest { public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService)ctx.getBean("UserService"); userService.save(); } }
9、运行结果:
1、现在说一下,setter注入的简单数据类型,简单数据类型和引用数据类型差不多,只不过是
在配置property时将ref替换为value。
这次我们来为Dao层中UserDao类的一个方法使用简单数据类型,然后调用
package dao.Impl; import dao.UserDao; public class UserDaoImpl implements UserDao { public void save() { System.out.println("setter注入!————引用数据类型-----dao层"); } // 简单数据的setter注入方式 private String username; private int age; public void setUsername(String username) { this.username = username; } public void setAge(int age) { this.age = age; } public void simpleType() { System.out.println( username + age ); } }
2、然后就去applicationContext.xml配置文件为UserDao类的两个简单数据类型配置值
<?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 id="UserDao" class="dao.Impl.UserDaoImpl" > <property name="username" value="张三" /> <property name="age" value="12" /> </bean> <bean id="UserService" class="service.Impl.UserServiceImpl"> <property name="userDao" ref="UserDao" /> </bean> </beans>
3、在test包测试
import dao.UserDao; import org.springframework.context.support.ClassPathXmlApplicationContext; import service.UserService; public class SetterTest { public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); // 简单数据类型的setter注入 UserService userService = (UserService)ctx.getBean("UserService"); userService.save(); // 简单数据类型的setter注入 UserDao userDao = (UserDao)ctx.getBean("UserDao"); userDao.simpleType(); } } 三、constructor注入(引用数据类型和简单数据类型)
1、其实构造器注入和setter注入从写代码角度是差不多,只不过在对待私有属性上,setter注入使用setter,构造器注入使用constructor;在bean配置上,setter使用property(name = " " ref/value = " " )属性,而constructor注入使用constructor-org(name = “ ” ref/value = “ ”)属性
2、具体步骤如下,分别在dao和service包下,新建一个BookDao和BookService类 在分别在其下新建constructor()方法
package dao.Impl; import dao.BookDao; public class BookDaoImpl implements BookDao { // 构造器注入————引用数据类型 public void constructor() { System.out.println("构造器注入————引用数据类型————dao层"); } }
package service.Impl; import dao.UserDao; import service.UserService; public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void save() { System.out.println("setter注入————引用数据类型-----service层"); userDao.save(); } }
3、新建一个配置文件,命名为constructorConfig.xml,为dao层和service层下的BookDao和BookService创建bean,并在BookService配置UserDao的属性
<?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 id="BookDao" class="dao.Impl.BookDaoImpl"></bean> <bean id="BookService" class="service.Impl.BookServiceImpl"> <constructor-arg name="bookDao" ref="BookDao" /> </bean> </beans>
4、到这里,constructor注入就完成了,接下来就是调用了
import org.springframework.context.support.ClassPathXmlApplicationContext; import service.BookService; public class constructorTest { public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("constructorConfig.xml"); BookService bookService = (BookService)ctx.getBean("BookService"); bookService.constructor(); } }
-----------------------
接下来就是构造器注入的简单数据类型,在BookDao下测试
1、在dao包下的BookDaoImpl类
package dao.Impl; import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput; import dao.BookDao; public class BookDaoImpl implements BookDao { // 构造器注入————引用数据类型 public void constructor() { System.out.println("构造器注入————引用数据类型————dao层"); } // 构造器注入————简单数据类型 private String username; private int age; public BookDaoImpl(String username, int age) { this.username = username; this.age = age; } public void simpleType() { System.out.println( username + age ); } }
2、进入constructorConfig.xml文件中对BookDao 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 id="BookDao" class="dao.Impl.BookDaoImpl"> <constructor-arg name="username" value="李四" /> <constructor-arg name="age" value="18" /> </bean> <bean id="BookService" class="service.Impl.BookServiceImpl"> <constructor-arg name="bookDao" ref="BookDao" /> </bean> </beans>
3、到这里构造器注入--简单数据类型就已经完成了,
import dao.BookDao; import org.springframework.context.support.ClassPathXmlApplicationContext; import service.BookService; public class constructorTest { public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("constructorConfig.xml"); BookService bookService = (BookService)ctx.getBean("BookService"); bookService.constructor(); BookDao bookDao = (BookDao) ctx.getBean("BookDao"); bookDao.simpleType(); } }
----------------------
关于依赖注入的两种方式已经完成了,其实差不多,但setter注入用的比较多!有什么疑问或质疑请留言,我们一起互相学习进步吧!