• Spring(四)DI 相关内容


    (1)向一个类中传递数据的方式有几种?

    1️⃣普通方法(set方法)

    2️⃣构造方法

    (2)依赖注入描述了在容器中建立bean与bean之间的依赖关系的过程,如果bean运行需要的是数字或字符串呢?

    1️⃣引用类型

    2️⃣简单类型(基本数据类型与string)

    Spring 提供了两种注入方式:

    (1)setter注入

    1️⃣简单类型

    2️⃣引用类型

    (2)构造器注入

    1️⃣简单类型

    2️⃣引用类型

    一、setter注入

    1. setter注入——引用类型

    (1)在 bean 中定义引用类型属性,并提供可访问的  set  方法
    1. public class BookServiceImpl implements BookService {
    2. private BookDao bookDao;
    3. private UserDao userDao;
    4. @Override
    5. public void save() {
    6. System.out.println("book service save...");
    7. bookDao.save();
    8. userDao.save();
    9. }
    10. public void setBookDao(BookDao bookDao) {
    11. this.bookDao = bookDao;
    12. }
    13. public void setUserDao(UserDao userDao) {
    14. this.userDao = userDao;
    15. }
    16. }

    (2)配置中使用 property 标签 ref 属性注入引用类型对象

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    6. <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
    7. <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
    8. <property name="bookDao" ref="bookDao"/>
    9. <property name="userDao" ref="userDao"/>
    10. bean>
    11. beans>

    2. setter注入——简单类型

    (1)在 bean 中定义引用类型属性,并提供可访问的  set  方法
    1. public class BookDaoImpl implements BookDao {
    2. private String databaseName;
    3. private int connectionNum;
    4. public void setConnectionNum(int connectionNum) {
    5. this.connectionNum = connectionNum;
    6. }
    7. public void setDatabaseName(String databaseName) {
    8. this.databaseName = databaseName;
    9. }
    10. @Override
    11. public void save() {
    12. System.out.println("book dao save...");
    13. }
    14. }

    (2)配置中使用 property 标签 value 属性注入引用类型对象

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
    6. <property name="databaseName" value="mysql"/>
    7. <property name="connectionNum" value="10"/>
    8. bean>
    9. <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
    10. <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
    11. <property name="bookDao" ref="bookDao"/>
    12. <property name="userDao" ref="userDao"/>
    13. bean>
    14. beans>

    value:后面跟的是简单数据类型。对于参数类型,Spring在注入的时候会自动转换

    二、构造器注入

    1. 构造器注入——引用类型(了解)

    (1)在 bean 中定义引用类型属性,并提供可访问的  构造 方法
    1. public class BookServiceImpl implements BookService {
    2. private BookDao bookDao;
    3. private UserDao userDao;
    4. public BookServiceImpl(BookDao bookDao, UserDao userDao) {
    5. this.bookDao = bookDao;
    6. this.userDao = userDao;
    7. }
    8. @Override
    9. public void save() {
    10. System.out.println("book service save...");
    11. bookDao.save();
    12. userDao.save();
    13. }
    14. }

    (2)配置中使用 constructor-arg 标签 ref 属性注入引用类型对象

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
    6. <constructor-arg name="databaseName" value="mysql"/>
    7. <constructor-arg name="connectionNum" value="100"/>
    8. bean>
    9. <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
    10. <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
    11. <constructor-arg name="bookDao" ref="bookDao"/>
    12. <constructor-arg name="userDao" ref="userDao"/>
    13. bean>
    14. beans>

    2. 构造器注入——简单类型(了解)

    (1)在 bean 中定义引用类型属性,并提供可访问的  构造  方法
    1. public class BookDaoImpl implements BookDao {
    2. private String databaseName;
    3. private int connectionNum;
    4. public BookDaoImpl(String databaseName, int connectionNum) {
    5. this.databaseName = databaseName;
    6. this.connectionNum = connectionNum;
    7. }
    8. @Override
    9. public void save() {
    10. System.out.println("book dao save..." + databaseName + connectionNum);
    11. }
    12. }

    (2)配置中使用 constructor-arg 标签 value 属性注入简单类型数据

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
    6. <constructor-arg name="databaseName" value="mysql"/>
    7. <constructor-arg name="connectionNum" value="100"/>
    8. bean>
    9. <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
    10. <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
    11. <constructor-arg name="bookDao" ref="bookDao"/>
    12. <constructor-arg name="userDao" ref="userDao"/>
    13. bean>
    14. beans>

    3. 依赖注入方式选择

    (1)强制依赖使用构造器进行,使用 setter 注入有概率不进行注入,导致 null 对象出现

    (2)可选依赖使用 setter 注入进行,灵活性强

    (3)Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨

    (4)如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用 setter 注入完成可选依赖的注入

    (5)实际开发过程中还要根据实际情况分析,如果受控对象没有提供 setter 方法就必须使用构造器注入

    (6)自己开发的模块推荐使用 setter 注入

    三、自动装配

    (1)什么是依赖自动装配?
    IoC 容器根据 bean 所依赖的资源在容器中自动查找并注入到 bean 中的过程称为自动装配
    (2)自动装配方式有哪些
    1️⃣按类型(常用)
    2️⃣按名称
    3️⃣按构造方法(不推荐)
    自动装配只需要修改 applicationContext.xml 配置文件即可 :
    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    6. <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>
    7. beans>
    依赖自动装配特征:
    (1)自动装配用于引用类型依赖注入,不能对简单类型进行操作
    (2)使用按类型装配时(byType)必须保障容器中相同类型的 bean 唯一, 推荐使用
    (3)使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
    (4)自动装配优先级低于 setter 注入与构造器注入,同时出现时自动装配配置失效

    四、集合注入

     

     

     

  • 相关阅读:
    独家 | 放弃Jupyter Notebooks吧,教你如何用仪表板展示研究成果
    Openstack部署
    平衡树 Treap & Splay [学习笔记]
    cmd找不到conda
    setTimeout() 和 setIntervale() 小结
    MES系统中的派工单及其关键应用
    云网络与云计算:有什么区别?
    JAVA:实现Disjoint Sets不相交集合算法(附完整源码)
    探花交友_第5章_圈子功能实现(新版)
    力扣(LeetCode)16. 最接近的三数之和(C++)
  • 原文地址:https://blog.csdn.net/yirenyuan/article/details/127688332