@AutoWired(自动装配)
常用有两种模式
- byName: 根据属性名自动配置
- byType: 根据属性类型自动配置(Spring默认)
@AutoWired自动装配默认是按类型匹配的,当且仅有一个匹配的Bean时,spring将其注入到@AutoWired标注的变量中
在ApplicationContext.xml中配置
<!--扫描包-->
<context:component-scan base-package="xxx.xx.xx.XX" />
spring会自动扫描xxx路径下的注解。
//@Autowired注入不需要getter/setter方法
@AutoWired
private UserDao userDao
就去applicationContext.xml下寻找一个userDao的bean
<bean id="userDao" class="com.imooc.dao.UserDao" />
为了配合@AutoWired注解使用,一般不需要去配置bean,而是在需要配置bean的类加上@Component注解,说明当前类是一个bean
@Component("userDao")
public class UserDaoImpl implements UserDao {
public void addUser() {
System.out.println("添加用户");
}
}
有一个细节的问题**:
假如bean里面有两个property,在User类中又去掉了属性的getter/setter并使用@AutoWired注解标注这个属性那会怎么样???
答案是:Spring会按照xml优先的原则去User类中寻找这个两个属性的getter/setter,找不到,导致的结果就是初始化bean报错
@Qualifier(指定注入Bean的名称)
如果一个容器有一个以上的匹配的bean,则可以通过@Qualifier注解准确找指定的Bean
图中就是UserDao接口有两个实现类,UserDaoImpl和UserDaoImpl2,在用@AutoWired注解的时候,就会遇到这样的困惑,这样注入的是哪个实现类的bean呢,如果不指定注入bean的名称,就会发生错误
//在UserDaoImpl类中
@Component("userDao1")
public class UserDaoImpl implements UserDao {
public void addUser() {
System.out.println("添加用户");
}
}
//在UserDaoImpl2类中
@Component("userDao2")
public class UserDaoImpl2 implements UserDao {
public void addUser() {
System.out.println("添加新的学生");
}
}
//这样配置没指定bean名称是会出错的
@Autowired
private UserDao userDao;
//所以要@Qualifier指定bean名称
@Autowired
@Qualifier("userDao1")
private UserDao userDao;
//运行结果
九月 19, 2019 10:22:51 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
添加用户