Spring注解驱动开发——自动装配 @Autowired @Qualifier @Primary
Posted mangoubiubiu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring注解驱动开发——自动装配 @Autowired @Qualifier @Primary相关的知识,希望对你有一定的参考价值。
自动装配;
Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值;
1)丶@Autowired: 自动注入
1 默认优先按照类型去容器中找队应的组件:applica.getBean(UserDao.class);找到就赋值
2 如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
applica.getBean("userDao");
3 @Qualifier("bookDao");使用@Qualifier指定需要装配的组件的id,而不是使用属性名
4 自动装配默认一定要将属性赋值好,没有就会报错;
可以使用@Autowired(required=false);作为非必需的
5 @Primary,让Spring进行自动装配的时候,默认使用首选的bean
也可以继续使用@Qualifier指定需要装配的bean的名字
UserService{
@Autowired
UserDao userDao;
}
@Autowired
1 默认优先按照类型去容器中找队应的组件:applica.getBean(UserServiceImpl.class);找到就赋值
配置类
package com.mongoubiubiu.conf; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import com.mongoubiubiu.dao.UserDao; import com.mongoubiubiu.service.serviceImpl.UserServiceImpl; @Configuration @ComponentScan({"com.mongoubiubiu.service","com.mongoubiubiu.dao","com.mongoubiubiu.controller"}) public class MainConfigOfAutowired { }
组件类
package com.mongoubiubiu.service.serviceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; import com.mongoubiubiu.dao.UserDao; import com.mongoubiubiu.service.UserService; @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; public void print(){ System.out.println("userDao:"+userDao); } @Override public String toString() { return "UserServiceImpl [userDao2=" + userDao + "]"; } }
package com.mongoubiubiu.dao; import org.springframework.stereotype.Repository; //名字默认是类名小写 @Repository public class UserDao { }
测试类
package com.mongougbiubiu.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Scope; import com.mongoubiubiu.conf.MainConfigOfAutowired; import com.mongoubiubiu.conf.MainConfigOfLifeCycle; import com.mongoubiubiu.dao.UserDao; import com.mongoubiubiu.service.UserService; import com.mongoubiubiu.service.serviceImpl.UserServiceImpl; public class IOCTest_Autowired { @Test public void Test01(){ //创建ioc 容器 AnnotationConfigApplicationContext applica= new AnnotationConfigApplicationContext(MainConfigOfAutowired.class); UserService userService=applica.getBean(UserServiceImpl.class); userService.print(); System.out.println(userService); } }
结果
因为userDao上有@Repository 加载配置类的时候 又用@ComponentScan 扫描过该包 所以userDao 被注册到了容器中, bean id 为类名首字母小写。
此时再获取bean 发现和 @Autowired自动装配的bean 为同一对象
2 如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找applica.getBean("userDao");
配置类
配置类里注册一个UserDao 此时bean id 为 userDao2
package com.mongoubiubiu.conf; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import com.mongoubiubiu.dao.UserDao; import com.mongoubiubiu.service.serviceImpl.UserServiceImpl; @Configuration @ComponentScan({"com.mongoubiubiu.service","com.mongoubiubiu.dao","com.mongoubiubiu.controller"}) public class MainConfigOfAutowired { @Bean("userDao2") public UserDao userDao(){ UserDao user=new UserDao(); user.setLable("2"); return user; } }
组件类
package com.mongoubiubiu.dao; import org.springframework.stereotype.Repository; //名字默认是类名小写 @Repository public class UserDao { public String lable="1"; public String getLable() { return lable; } public void setLable(String lable) { this.lable = lable; } @Override public String toString() { return "UserDao [lable=" + lable + "]"; } }
package com.mongoubiubiu.service.serviceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; import com.mongoubiubiu.dao.UserDao; import com.mongoubiubiu.service.UserService; @Service public class UserServiceImpl implements UserService { //@Qualifier("userDao") @Autowired private UserDao userDao; public void print(){ System.out.println("userDao:"+userDao); } @Override public String toString() { return "UserServiceImpl [userDao2=" + userDao + "]"; } }
测试类
package com.mongougbiubiu.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Scope; import com.mongoubiubiu.conf.MainConfigOfAutowired; import com.mongoubiubiu.conf.MainConfigOfLifeCycle; import com.mongoubiubiu.dao.UserDao; import com.mongoubiubiu.service.UserService; import com.mongoubiubiu.service.serviceImpl.UserServiceImpl; public class IOCTest_Autowired { @Test public void Test01(){ //创建ioc 容器 AnnotationConfigApplicationContext applica= new AnnotationConfigApplicationContext(MainConfigOfAutowired.class); UserService userService=applica.getBean(UserServiceImpl.class); System.out.println(userService); } }
结果
发现自动装配的是 @Repository 标注的 类 lable 1
再次改变 service
再次测试
是lable 2 可见优先注入的是和 bean id 写的一样的 属性名。
3 自动装配默认一定要将属性赋值好,没有就会报错;可以使用@Autowired(required=false);作为非必需的
配置类
不然userDao 注入到容器中
组件类
也不让userDao 注入到容器中、
测试类
和上边一样
结果
报错
加上 required=false 测试
不会抛异常。@Autowired 默认是required = true
以上是关于Spring注解驱动开发——自动装配 @Autowired @Qualifier @Primary的主要内容,如果未能解决你的问题,请参考以下文章
Spring注解驱动开发第20讲——使用@Autowired@Qualifier@Primary这三大注解自动装配组件,你会了吗?
Springbean的自动装配,使用注解开发,使用Java的方式配置Spring
Spring入门篇——第4章 Spring Bean装配(下)