网上很多人都是一个抄一个,我经过验证发现@Autowired并不是简单地只按照类型注入,如果有多个类型还会进一步以变量名为name来判断一下。
如果需要使用@Autowired并指定变量名,可以搭配@Qualifier
**@Autowired:**自动按照类型注入。只要容器中有唯一的一个bean的类型和要注入的变量类型匹配,就可以注入成功。
如果IOC容器中没有任何bean的类型和要注入的类型匹配,就要报错。
如果IOC容器中有多个类型匹配时,首先按照类型圈定出来可匹配的对象,然后使用变量名称(或者形参名称)作为bean的name,在圈定出的几个对象中来查找,如果有name一样的,就注入,没有就出错。
这里有个隐藏的小知识点,一个可以有多个name ,每个有一个默认的name和id同名
**@Resource**直接按照bean的Name注入,**如果没有指定name,就把id当作name(因为默认的name和id相同),**它可以独立使用,如果能找到对应name就直接注入,如果找不到就回退回按照类型注入,如果只找到一个同类型的,就注入,如果有多个,报错.
空说无凭,来点代码测试一下。
public interface IAccountDao {
void saveAccount();
}
public class AccountDaoImpl1 implements IAccountDao {
public AccountDaoImpl1() {}
@Override
public void saveAccount() {
System.out.println("111保存成功!");
}
}
public class AccountDaoImpl2 implements IAccountDao {
@Override
public void saveAccount() {
System.out.println("222保存成功!");
}
}
public interface IAccountService {
void saveAccount();
}
@Component
public class AccountServiceImpl implements IAccountService {
@Autowired
private IAccountDao accountDao1;
public void saveAccount() {
System.out.println(accountDao1.getClass().getName());
accountDao1.saveAccount();
}
}
public class client {
public static void main(String []args){
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
AccountServiceImpl as= (AccountServiceImpl) ac.getBean("accountServiceImpl");
as.saveAccount();
((ClassPathXmlApplicationContext) ac).close();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<context:component-scan base-package="com.itheima"/>
<bean id="accountDao1" class="com.itheima.dao.impl.AccountDaoImpl1"/>
<bean id="accountDao2" class="com.itheima.dao.impl.AccountDaoImpl2"/>
</beans>
先测@Autowired碰见多个多同类型时以变量名来找的。
直接用上面代码,是可以得到值的
如果把上面AccountServiceImpl的accountDao1改成ad,就会报错如果再再xml中的某个name上加上一个ad,这里我在accountDao2中加,如下
又能取到值了。