自动装配;
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;
}
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 为同一对象
配置类里注册一个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 写的一样的 属性名。
不然userDao 注入到容器中
也不让userDao 注入到容器中、
和上边一样
报错
加上 required=false 测试
不会抛异常。@Autowired 默认是required = true
Spring注解驱动开发——自动装配 @Autowired @Qualifier @Primary
原文:https://www.cnblogs.com/mangoubiubiu/p/15101350.html