setter注入:就是用set方法向类中传递数据。
引用类型:在类中为传入的属性提供对应的set方法,然后在配置文件中使用property标签 name属性指定哪个属性,ref属性注入。传入多个数据时,写多个property标签就可以了。
public class bookServiceImpl implements bookService{ bookDao bookDao; userDao userDao; @Override public void save() { bookDao.save(); System.out.println("bookService...."); } public void setBookDao(bookDao bookDao) { this.bookDao = bookDao; } public void setUserDao(org.example.dao.userDao userDao) { this.userDao = userDao; } }
配置文件:
<bean id="bookDao" class="org.example.dao.impl.bookDaoImpl"/> <bean id="userDao" class="org.example.dao.impl.userDaoImpl"/> <bean id="bookService" class="org.example.service.impl.bookServiceImpl"> <property name="bookDao" ref="bookDao"/> <property name="userDao" ref="userDao"/> </bean>
简单类型:在类中为属性提供set方法,然后配置文件中使用property标签,name属性指定为哪个属性赋值,value属性是值的内容。
package org.example.dao.impl; import org.example.dao.bookDao; public class bookDaoImpl implements bookDao { public bookDaoImpl() { System.out.println("bookDaoImpl被new"); } @Override public void save() { System.out.println("bookDao...."+count+" "+book); } private int count; private String book; public void setCount(int count) { this.count = count; } public void setBook(String book) { this.book = book; } }
配置文件:
<bean id="bookDao" class="org.example.dao.impl.bookDaoImpl" init-method="init" destroy-method="destroy"> <property name="book" value="mysql"/> <property name="count" value="2"/> </bean>
下面是另一种依赖注入的方式:构造器注入:就是用构造方法向类中传递参数
引用类型:把要传入的属性作为形参写入构造方法,在配置文件中bean标签中用constructor-arg标签代替原来的property标签,属性一样。name属性必须为构造方法中形参的名字。
package org.example.service.impl; import org.example.dao.bookDao; import org.example.service.bookService; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; public class bookServiceImpl2 implements bookService{ bookDao bookDao; public bookServiceImpl2(bookDao bookDao) { this.bookDao = bookDao; } @Override public void save() { bookDao.save(); System.out.println("bookService...."); } }
配置文件:
<bean id="bookDao2" class="org.example.dao.impl.bookDaoImpl2"> </bean> <bean id="bookService2" class="org.example.service.impl.bookServiceImpl2"> <constructor-arg name="bookDao" ref="bookDao2"/> </bean>
简单类型:把需要传入的属性作为形参写入构造方法,构造文件中,一样用contructor-arg标签代替property标签,用value属性指明传入的具体的值。
package org.example.dao.impl; import org.example.dao.bookDao; public class bookDaoImpl2 implements bookDao { private int count; private String book; public bookDaoImpl2(int count, String book) { this.count = count; this.book = book; } @Override public void save() { System.out.println("bookDao...."+count+" "+book); } }
配置文件:
<bean id="bookDao2" class="org.example.dao.impl.bookDaoImpl2"> <constructor-arg name="book" value="mysql2"/> <constructor-arg name="count" value="10"/> </bean>
因为这种注入依赖的方式name属性必须要与set方法的方法名或者构造方法中形参的属性名一致,所以我们可以用type属性来替换name属性
<bean id="bookDao2" class="org.example.dao.impl.bookDaoImpl2"> <constructor-arg type="java.lang.String" value="mysql2"/> <constructor-arg type="int" value="10"/> </bean>
type属性用于指明要赋值的属性的基本类型。
要用type属性进行赋值,前提是形参中各个属性的基本类型都不一样。
如果想解决多个属性的基本类型不能重复的问题,用位置来解决参数匹配
<bean id="bookDao2" class="org.example.dao.impl.bookDaoImpl2"> <constructor-arg index="1" value="mysql2"/> <constructor-arg index="0" value="10"/> </bean>
index属性来告诉它参数的位置,第一个参数的位置为0。
依赖注入方式选择:
1、强制依赖使用构造器进行,使用setter注入有概率不进行导致null对象的出现。强制依赖指的是该bean运行必须要有的依赖。
2、可选依赖使用setter注入,灵活性强。
3、spring倡导使用构造器
4、有必要时可以俩者同时使用,构造器完成强制依赖注入,setter注入完成可选依赖注入。
5、自己开发的模块推荐使用setter注入。(重点)