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
@Qualifier
3 @Qualifier("bookDao");使用@Qualifier指定需要装配的组件的id,而不是使用属性名
配置类 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; } }
组件类 bean id 名 为id 小写
UserDao
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 + "]"; } }
Service @Autowired的规则是 取属性名小写的bean userDao2 @Qualifier("userDao") 是取 bean id 叫 userDao 的bean
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 userDao2; public void print(){ System.out.println("userDao:"+userDao2); } @Override public String toString() { return "UserServiceImpl [userDao2=" + userDao2 + "]"; } }
测试 发现取得bean 是按照 @Qualifier的规则
@Primary
@Primary,让Spring进行自动装配的时候,默认使用首选的bean
配置类 直接在方法上面 标注 表明首选的bean 是 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 { @Primary @Bean("userDao2") public UserDao userDao(){ UserDao user=new UserDao(); user.setLable("2"); return user; } }
组件类
UserDao
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 + "]"; } }
Service
@Autowired 的规则是属性名 取得是 叫做 userDao2 的bean ,此时@Qualifier给注掉了 为了不影响测试
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 + "]"; } }
测试
此时 是 @Qualifier 标注的bean 被自动装配了
@Primary & @Qualifier 优先级
@Qualifier > @Primary
Service
上次测试信息 不变 将 @Qualifier 放开
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 + "]"; } }
测试 取得的
@Qualifier("userDao") 名叫 userDao 的bean
本文作者:KwFruit
本文链接:https://www.cnblogs.com/mangoubiubiu/p/15101350.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步