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注入。(重点)