前言:当我们学习自动装配时,通过@Autowired来实现对象的自动创建,这时可以将setter方法删除
可以删除setter方法的原因:
- 自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值
- 普通反射只能获取public修饰的内容
- 暴力反射除了获取public修饰的内容还可以获取private修改的内容
- 所以此处无需提供setter方法
问题:@Autowired是按照类型注入,那么对应BookDao接口如果有多个实现类,比如添加
BookDaoImpl2
@Repository
public class BookDaoImpl2 implements BookDao {
public void save() {
System.out.println("book dao save ...2");
}
}
此时,系统会报错,现实无法区分到底注入哪个对象
解决方案: 按照名称注入
1. 先给两个Dao类分别起个名称
1 @Repository("bookDao")
2 public class BookDaoImpl implements BookDao {
3 public void save() {
4 System.out.println("book dao save ..." );
5 }
6 }
7 @Repository("bookDao2")
8 public class BookDaoImpl2 implements BookDao {
9 public void save() {
10 System.out.println("book dao save ...2" );
11 }
12 }
2. @Qualifier注解实现按照名称注入
当根据类型在容器中找到多个bean,注入参数的属性名又和容器中bean的名称不一致,这个时候该如
何解决,就需要使用到@Qualifier来指定注入哪个名称的bean对象。
@Service
public class BookServiceImpl implements BookService {
@Autowired
@Qualifier("bookDao1")
private BookDao bookDao;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
@Qualifier注解后的值就是需要注入的bean的名称。
注意:@Qualifier不能独立使用,必须和@Autowired一起使用