• 2.spring框架-----spring framework DI依赖注入


    目录

    一、DI依赖注入

    1.setter注入

     1.1setter引用类型注入 

     1.2setter简单类型注入

    2.构造器注入

    2.1构造器引用类型注入 

    2.2构造器多个引用类型注入 

    2.3构造器多个基本类型注入 


    一、DI依赖注入

    Spring提供了两种注入方式,分别是:

    setter注入 简单类型 引用类型

    构造器注入 简单类型 引用类型

    1.setter注入

    添加BookDao、BookDaoImpl、UserDao、UserDaoImpl、BookService和 BookServiceImpl类

    1. public interface BookDao {
    2. public void save();
    3. }
    4. public class BookDaoImpl implements BookDao {
    5. public void save() {
    6. System.out.println("book dao save ...");
    7. }
    8. }
    9. public interface UserDao {
    10. public void save();
    11. }
    12. public class UserDaoImpl implements UserDao {
    13. @Override
    14. public void save() {
    15. System.out.println("user dao save ...");
    16. }
    17. }
    18. public interface BookService {
    19. public void save();
    20. }
    21. public class BookServiceImpl implements BookService {
    22. private BookDao bookDao;
    23. public void save() {
    24. System.out.println("book service save ...");
    25. bookDao.save();
    26. }
    27. public void setBookDao(BookDao bookDao) {
    28. this.bookDao = bookDao;
    29. }
    30. }

    xml文件 

    1. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    2. <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
    3. <property name="bookDao" ref="bookDao"/>
    4. bean>

    运行文件 

    1. public class AppForLifeCycle {
    2. public static void main( String[] args ) {
    3. ApplicationContext ctx = new
    4. ClassPathXmlApplicationContext("applicationContext.xml");
    5. BookService bookService = (BookService) ctx.getBean("bookService");
    6. bookService.save();
    7. }
    8. }

     1.1setter引用类型注入 

    在BookServiceImpl中声明userDao属性,并提供setter方法

    1. public class BookServiceImpl implements BookService {
    2. private BookDao bookDao;
    3. private UserDao userDao;
    4. public void save() {
    5. System.out.println("book service save ...");
    6. bookDao.save();
    7. userDao.save();
    8. }
    9. public void setBookDao(BookDao bookDao) {
    10. this.bookDao = bookDao;
    11. }
    12. public void setUserDao(UserDao userDao) {
    13. this.userDao = userDao;
    14. }
    15. }

    在applicationContext.xml配置文件中使用property标签注入 

    1. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    2. <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
    3. <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
    4. <property name="bookDao" ref="bookDao"/>
    5. <property name="userDao" ref="userDao"/>
    6. bean>

     1.2setter简单类型注入

    1.在BookDaoImpl类中声明对应的简单数据类型的属性

    2.为这些属性提供对应的setter方法

    3.在applicationContext.xml中配置

    在BookDaoImpl类中声明对应的简单数据类型的属性,并提供对应的setter方法

    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. public void save() {
    11. System.out.println("book dao save..."+databaseName+","+connectionNum);
    12. }
    13. }

    在applicationContext.xml配置文件中使用property标签注入

    1. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
    2. <property name="databaseName" value="mysql"/>
    3. <property name="connectionNum" value="10"/>
    4. bean>
    5. <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
    6. <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
    7. <property name="bookDao" ref="bookDao">property>
    8. <property name="userDao" ref="userDao">property>
    9. bean>

    value:后面跟的是简单数据类型,对于参数类型,Spring在注入的时候会自动转换,但是不能写成英文,spring在将英文转换成int类型的时候就会报错。

    引用数据类型使用的是 value=""/>

    简单数据类型使用的是 ref=""/>

    2.构造器注入

    项目中添加BookDao、BookDaoImpl、UserDao、UserDaoImpl、BookService和 BookServiceImpl类

    1. public interface BookDao {
    2. public void save();
    3. }
    4. public class BookDaoImpl implements BookDao {
    5. private String databaseName;
    6. private int connectionNum;
    7. public void save() {
    8. System.out.println("book dao save...");
    9. }
    10. }
    11. public interface UserDao {
    12. public void save();
    13. }
    14. public class UserDaoImpl implements UserDao {
    15. @Override
    16. public void save() {
    17. System.out.println("user dao save ...");
    18. }
    19. }
    20. public interface BookService {
    21. public void save();
    22. }
    23. public class BookServiceImpl implements BookService {
    24. private BookDao bookDao;
    25. public void save() {
    26. System.out.println("book service save ...");
    27. bookDao.save();
    28. }
    29. }

    xml文件 

    1. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    2. <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
    3. <property name="bookDao" ref="bookDao"/>
    4. bean>

    运行文件 

    1. public class AppForLifeCycle {
    2. public static void main( String[] args ) {
    3. ApplicationContext ctx = new
    4. ClassPathXmlApplicationContext("applicationContext.xml");
    5. BookService bookService = (BookService) ctx.getBean("bookService");
    6. bookService.save();
    7. }
    8. }

    2.1构造器引用类型注入 

    1.添加带有bookDao参数的构造方法

    2.在applicationContext.xml中配置

    在BookServiceImpl类中添加带有bookDao参数的构造方法

    1. public class BookServiceImpl implements BookService {
    2. private BookDao bookDao;
    3. public void save() {
    4. System.out.println("book service save ...");
    5. bookDao.save();
    6. }
    7. public BookServiceImpl(BookDao bookDao) {
    8. this.bookDao = bookDao;
    9. }
    10. }

    在applicationContext.xml中配置

     

    name属性对应的值为构造函数中方法形参的参数名,必须要保持一致。

    ref属性指向的是spring的IOC容器中其他bean对象。

    1. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    2. <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
    3. <constructor-arg name="bookDao" ref="bookDao"/>
    4. bean>

    2.2构造器多个引用类型注入 

    在BookServiceImpl声明多个类并提供多个参数的构造函数

    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. public void save() {
    9. System.out.println("book service save ...");
    10. bookDao.save();
    11. userDao.save();
    12. }
    13. }
    1. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    2. <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
    3. <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
    4. <constructor-arg name="bookDao" ref="bookDao"/>
    5. <constructor-arg name="userDao" ref="userDao"/>
    6. bean>

    2.3构造器多个基本类型注入 

    1.提供一个包含这两个参数的构造方法

    2.在applicationContext.xml中进行注入配置

    修改BookDaoImpl类,添加构造方法

    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. public void save() {
    9. System.out.println("book dao save..."+databaseName+","+connectionNum);
    10. }
    11. }

    在applicationContext.xml中进行注入配置 

    1. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
    2. <constructor-arg name="databaseName" value="mysql"/>
    3. <constructor-arg name="connectionNum" value="100"/>
    4. bean>
    5. <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
    6. <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
    7. <constructor-arg name="bookDao" ref="bookDao"/>
    8. <constructor-arg name="userDao" ref="userDao"/>
    9. bean>

     

    当构造函数中方法的参数名发生变化后,配置文件中的name属性也需要跟着变 

    方式一:删除name属性,添加type属性,按照类型注入

    1. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
    2. <constructor-arg type="int" value="10"/>
    3. <constructor-arg type="java.lang.String" value="mysql"/>
    4. bean>

    这种方式可以解决构造函数形参名发生变化带来的耦合问题 但是如果构造方法参数中有类型相同的参数,这种方式就不友好了

    方式二:删除type属性,添加index属性,按照索引下标注入,下标从0开始

    1. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
    2. <constructor-arg index="1" value="100"/>
    3. <constructor-arg index="0" value="mysql"/>
    4. bean>

    这种方式可以解决参数类型重复问题 但是如果构造方法参数顺序发生变化后,这种方式又带来了耦合问题

     

     

  • 相关阅读:
    R语言计算两个向量成对元素的最小值:计算两个向量的平行最小值(parallel minimum)
    Air Quality Index,简称AQI
    Java抽象类和接口
    pytest文档82 - 用例收集钩子 pytest_collect_file 的使用
    知识管理系统如何提升企业核心竞争力
    python求一个数的因子找出10000之内的所有完数
    Linux系统(Centos 7.4)配置与管理DNS服务器复习题
    【开卷数据结构 】平衡二叉树
    Java项目:springboot课程评价系统(计算机毕业设计)
    JAVA反射简介及应用
  • 原文地址:https://blog.csdn.net/qq_46235384/article/details/127454109