(1)向一个类中传递数据的方式有几种?
1️⃣普通方法(set方法)
2️⃣构造方法
(2)依赖注入描述了在容器中建立bean与bean之间的依赖关系的过程,如果bean运行需要的是数字或字符串呢?
1️⃣引用类型
2️⃣简单类型(基本数据类型与string)
Spring 提供了两种注入方式:
(1)setter注入
1️⃣简单类型
2️⃣引用类型
(2)构造器注入
1️⃣简单类型
2️⃣引用类型
(1)在 bean 中定义引用类型属性,并提供可访问的 set 方法
public class BookServiceImpl implements BookService { private BookDao bookDao; private UserDao userDao; @Override public void save() { System.out.println("book service save..."); bookDao.save(); userDao.save(); } public void setBookDao(BookDao bookDao) { this.bookDao = bookDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } }(2)配置中使用 property 标签 ref 属性注入引用类型对象
"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="com.itheima.dao.impl.BookDaoImpl"/> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"> <property name="bookDao" ref="bookDao"/> <property name="userDao" ref="userDao"/> bean> beans>
(1)在 bean 中定义引用类型属性,并提供可访问的 set 方法
public class BookDaoImpl implements BookDao { private String databaseName; private int connectionNum; public void setConnectionNum(int connectionNum) { this.connectionNum = connectionNum; } public void setDatabaseName(String databaseName) { this.databaseName = databaseName; } @Override public void save() { System.out.println("book dao save..."); } }(2)配置中使用 property 标签 value 属性注入引用类型对象
"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="com.itheima.dao.impl.BookDaoImpl"> <property name="databaseName" value="mysql"/> <property name="connectionNum" value="10"/> bean> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"> <property name="bookDao" ref="bookDao"/> <property name="userDao" ref="userDao"/> bean> beans>value:后面跟的是简单数据类型。对于参数类型,Spring在注入的时候会自动转换
(1)在 bean 中定义引用类型属性,并提供可访问的 构造 方法
public class BookServiceImpl implements BookService { private BookDao bookDao; private UserDao userDao; public BookServiceImpl(BookDao bookDao, UserDao userDao) { this.bookDao = bookDao; this.userDao = userDao; } @Override public void save() { System.out.println("book service save..."); bookDao.save(); userDao.save(); } }(2)配置中使用 constructor-arg 标签 ref 属性注入引用类型对象
"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="com.itheima.dao.impl.BookDaoImpl"> <constructor-arg name="databaseName" value="mysql"/> <constructor-arg name="connectionNum" value="100"/> bean> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"> <constructor-arg name="bookDao" ref="bookDao"/> <constructor-arg name="userDao" ref="userDao"/> bean> beans>
(1)在 bean 中定义引用类型属性,并提供可访问的 构造 方法
public class BookDaoImpl implements BookDao { private String databaseName; private int connectionNum; public BookDaoImpl(String databaseName, int connectionNum) { this.databaseName = databaseName; this.connectionNum = connectionNum; } @Override public void save() { System.out.println("book dao save..." + databaseName + connectionNum); } }(2)配置中使用 constructor-arg 标签 value 属性注入简单类型数据
"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="com.itheima.dao.impl.BookDaoImpl"> <constructor-arg name="databaseName" value="mysql"/> <constructor-arg name="connectionNum" value="100"/> bean> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"> <constructor-arg name="bookDao" ref="bookDao"/> <constructor-arg name="userDao" ref="userDao"/> bean> beans>
(1)强制依赖使用构造器进行,使用 setter 注入有概率不进行注入,导致 null 对象出现
(2)可选依赖使用 setter 注入进行,灵活性强
(3)Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
(4)如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用 setter 注入完成可选依赖的注入
(5)实际开发过程中还要根据实际情况分析,如果受控对象没有提供 setter 方法就必须使用构造器注入
(6)自己开发的模块推荐使用 setter 注入
(1)什么是依赖自动装配?
IoC 容器根据 bean 所依赖的资源在容器中自动查找并注入到 bean 中的过程称为自动装配
(2)自动装配方式有哪些
1️⃣按类型(常用)
2️⃣按名称
3️⃣按构造方法(不推荐)
自动装配只需要修改 applicationContext.xml 配置文件即可 :
"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="com.itheima.dao.impl.BookDaoImpl"/> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/> beans>
依赖自动装配特征:
(1)自动装配用于引用类型依赖注入,不能对简单类型进行操作
(2)使用按类型装配时(byType)必须保障容器中相同类型的 bean 唯一, 推荐使用
(3)使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
(4)自动装配优先级低于 setter 注入与构造器注入,同时出现时自动装配配置失效
