一、什么是@Autowired(自动注入)?
@Autowired 自动注入,将SpringIOC容器中已经注册好的对象注入到程序员定义的类型中,使其
实例化(相当于new一个对象给定义的类型)并可用, 如:
@Autowired
IAccountDao abc;
那么 @Autowired自动注入的规则是什么呢?
@Autowired 先根据定义类型匹配再根据key匹配并返回
二、@Autowired注入规则:
1、图解
2、详细流程
@Autowired 首先会根据类型去SpringIOC容器中跳过id(key)的匹配,
直接在value中匹配和本身相符的类型,
如果找到的类型是唯一且匹配则返回这个对象并注入到用@Autowired标识的定义类型中。
如这里的IAccountDao类型就应该在SpringIOC容器的value中寻找IAccountDao类型,
由于AccountDao和AccountDao2实现了IAccountDao接口,所以默认AccountDao和AccountDao2
是IAccountDao类型的。这时你们会发现,由于这两个实现类都实现了IAccountDao接口,
很明显匹配到的类型是不唯一的,自然不能返回了。
所以这时我们还有一个筛选依据,
就是根据key来匹配!
那么我们匹配的时候拿什么跟这个key去匹配呢????
没错,就是用 @Autowired 标识定义类型的变量名
@Autowired
IAccountDao abc;
所以我们拿到的是“abc”这个key,
最后我们根据这个key获取到了key为“abc"的value,也就是AccountDao2了
或许有的小伙伴好奇,也不清楚SpringIOC容器中的key是如何定义的:
SpringIOC容器中的key定义有两种方式:
1、默认的:如果@Repository不指定名称,则key就是第一个字母小写的类名
2、@Repository(“abc”)指定这个key叫"abc"
@Repository("abc")
public class AccountDao2 implements IAccountDao{
@Override
public void saveAccount() {
System.out.println("保存账户2");
}
}