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

                    
                



                
            
        
浙公网安备 33010602011771号