setter注入:
一、 简单类型:
1.提供对应的set方法
public class BookDaoImpl implements BookDao {
public String databaseName;
public int num;
public void setDatabaseName(String databaseName) {
this.databaseName = databaseName;
}
public void setNum(int num) {
this.num = num;
}
public void save() {
System.out.println("BookDao save!"+databaseName+num);
}
}
2,配置value
<bean id= "bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<property name="databaseName" value="mysql"></property>
<property name="num" value="10"></property>
</bean>
二、 引用类型:
1.提供对应的set方法
2.配置url
构造器注入:
简单类型
1.construct
public class BookDaoImpl implements BookDao {
public String databaseName;
public int num;
public BookDaoImpl(String databaseName, int num) {
this.databaseName = databaseName;
this.num = num;
}
public void save() {
System.out.println("BookDao save!"+databaseName+num);
}
}
2.配置
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<constructor-arg name="databaseName" value="mysql"></constructor-arg>
<constructor-arg name="num" value="10"></constructor-arg>
</bean>
由于name表示的是形参的名字
通过以下方法减少耦合度
1.使用type
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<constructor-arg type="java.lang.String" value="mysql"></constructor-arg>
<constructor-arg type="int" value="10"></constructor-arg>
</bean>
2.使用index
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<constructor-arg index="0" value="mysql"></constructor-arg>
<constructor-arg index="1" value="10"></constructor-arg>
</bean>
引用类型
1.
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
private BookDao bookDao ;
public BookServiceImpl(BookDao bookDao) {
this.bookDao = bookDao;
}
}
2.配置
name是BooServiceImpl构造方法中的形参名字
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
</bean>
依赖注入方式选择
1.强制依赖使用构造器,使用setter注入有概率不进行注入导致null对象出现
2.可选依赖使用setter注入进行,灵活性强
3.Spring框架倡导使用构造器
4.如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
5.实际开发中,如果受控对象没有提供setter方法就必须使用构造器注入
6.自己开发的模块推荐使用setter
依赖自动装配
自动装配优先级低于setter注入与构造器注入,同时出现自动装配配置失效
- 按类型:推荐使用,必须保证容器相同类型的bean唯一
- 按名称
- 按构造方法
- 不启用自动装配
1.还需要使用setter方法
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void save() {
System.out.println("BookService Save!");
bookDao.save();
}
}
2.配置
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>
3.运行
public static void main(String[] args) {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
BookService bookService = (BookService) applicationContext.getBean("BookService");
bookService.save();
}