龙空技术网

「Java框架 4-2」DI-构造器注入

chenxin118 144

前言:

如今咱们对“java中的构造函数”大致比较关怀,看官们都想要分析一些“java中的构造函数”的相关文章。那么小编也在网上收集了一些有关“java中的构造函数””的相关资讯,希望朋友们能喜欢,大家一起来学习一下吧!

4.3 构造器注入

构造器注入即构造方法注入

4.3.1 构造器注入引用数据类型1. 需求

BookServiceImpl类中的 bookDao修改成使用构造器的方式注入。

bookDaosetter方法删除掉添加带有 bookDao参数的构造方法applicationContext.xml 中配置2. 代码实现删除 setter 方法并提供构造方法

 public class BookServiceImpl implements BookService{      // 不用 new 来创建 dao 对象     private BookDao bookDao;      public BookServiceImpl(BookDao bookDao) {         this.bookDao = bookDao;     }      public void save(){         System.out.println("book service save....");         bookDao.save();     } }
配置文件中进行配置构造方式注入
 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" ";> <beans>     <bean id="bookDao" name="dao" class="dao.impl.BookDaoImpl"/>      <bean id="bookService" class="service.impl.BookServiceImpl">         <constructor-arg index="0" ref="bookDao"/>     </bean> </beans>

constructor-arg标签说明:

index属性:其中的数值代表 bookServiceImpl 中的第 k 个属性ref属性:指向 springIOC容器中的其他 bean对象

测试结果:说明 bookDao 已经成功注入

4.3.2 构造器注入多个引用数据类型1. 需求

BookServiceImpl使用构造函数注入多个引用数据类型,比如 userDao

声明 userDao属性生成一个带有 bookDaouserDao参数的构造函数applicationContext.xml 中配置注入2. 代码实现提供多个属性的构造函数

 public class BookServiceImpl implements BookService{      // 不用 new 来创建 dao 对象     private BookDao bookDao;     private UserDao userDao;      public BookServiceImpl(BookDao bookDao, UserDao userDao) {         this.bookDao = bookDao;         this.userDao = userDao;     }      public void save(){         System.out.println("book service save....");         bookDao.save();         userDao.save();     } }
配置文件中配置多参数的注入
 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" ";> <beans>     <bean id="bookDao" name="bookdao" class="dao.impl.BookDaoImpl"/>     <bean id="userDao" name="userDao" class="dao.impl.UserDaoImpl"/>      <bean id="bookService" class="service.impl.BookServiceImpl">         <constructor-arg index="0" ref="bookDao"/>         <constructor-arg index="1" ref="userDao"/>     </bean> </beans>

两个 contructor-arg 的配置顺序的任意

测试结果4.3.3 构造器注入多个简单数据类型1. 需求

BookDaoImpl中,使用构造函数注入 databaseNameconnectionNum两个参数

提供一个包含这两个参数的构造方法applicationContext.xml 中进行注入配置2. 代码实现添加多个简单属性并提供构造方法

 public class BookDaoImpl implements BookDao {      private String dataBaseName;     private int connectionNum;      public BookDaoImpl(String dataBaseName, int connectionNum){         this.dataBaseName = dataBaseName;         this.connectionNum = connectionNum;     }      public void save(){         System.out.println("book dao save.... " + dataBaseName + "," + connectionNum);     } }
配置完成多个属性构造器注入
 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" ";> <beans>     <bean id="bookDao" name="bookdao" class="dao.impl.BookDaoImpl">         <constructor-arg index="0" value="mysql"/>         <constructor-arg index="1" value="666"/>     </bean>     <bean id="userDao" name="userDao" class="dao.impl.UserDaoImpl"/>      <bean id="bookService" class="service.impl.BookServiceImpl">         <constructor-arg index="0" ref="bookDao"/>         <constructor-arg index="1" ref="userDao"/>     </bean> </beans>
测试结果3. 添加 type属性,按照类型注入

index属性,按照索引下标注入的问题:当构造方方法顺序发生变化后,会带来耦合问题

 <bean id="bookDao" name="bookdao" class="dao.impl.BookDaoImpl">     <constructor-arg type="java.lang.String" value="mysql"/>     <constructor-arg type="int" value="666"/> </bean>
可以解决参数顺序变化时带来的耦合问题若构造方法中有类型相同的参数,这种方式就不太好

标签: #java中的构造函数