Spring注解学习_自动装配1_@Autowired&@Qualifier&@Primary
自动装配:Spring利用依赖注入,完成对IOC容器中各个组件的依赖关系赋值;
¶@Autowired自动注入
- 1️⃣ 默认优先按照类型去容器中找对应的组件,找到就为标注的属性赋值
- 2️⃣ 如果找到了多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
- 注意:
- 默认情况下,一定要在容器中有该组件的情况下才能自动装配,否则就会报错
- 如果我们容器中没有对应组件时不进行装配,应写:@Autowired( required=false )
验证:
BookDao:
@Repository
public class BookDao {
private String label="1";
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
@Override
public String toString() {
return "BookDao{" +
"label='" + label + '\'' +
'}';
}
}
BookService:
@Service
public class BookService {
@Autowired
private BookDao bookDao; //自动装配
@Override
public String toString() {
return "BookService{" +
"bookDao=" + bookDao +
'}';
}
}
配置类:除了ComponentScan将扫描到BookDao(Bean name默认为首字母小写:bookDao)外,我们另外注入名为bookDao2的Bean,看最终Autowired究竟会装配哪一个
@Configuration
@ComponentScan({"com.study.service","com.study.controller","com.study.dao"})
public class MainConfigOfAutowired {
//除了ComponentScan将扫描到BookDao外,我们另外注入名为bookDao2的Bean,看最终Autowired究竟会装配哪一个
@Bean("bookDao2")
public BookDao bookDao(){
BookDao bookDao=new BookDao();
bookDao.setLabel("2");
return bookDao;
}
}
测试
public class IOCTest_Autowired {
@Test
public void test1(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);
BookService bookService = context.getBean(BookService.class);
System.out.println(bookService);
}
}
那我们吧@Autowired标注的BookDao属性名改一改,改成bookDao2看看:
BookService:
@Service
public class BookService {
@Autowired
private BookDao bookDao2;
@Override
public String toString() {
return "BookService{" +
"bookDao=" + bookDao2 +
'}';
}
}
结果:
得证:结论2️⃣ 成立
¶方法、构造器上标注@Autowired实现自动装配
除了在类属性上标注实现自动装配外,@Autowired 还可以标注在方法、构造器上方及它们的参数中,以从容器获取参数组件的值。
-
标在方法位置
public class Color { private Car car; public Car getCar() { return car; } @Autowired public void setCar(Car car) { this.car = car; } }
-
标在构造器上。如果当前类只有一个有参构造器,@Autowired可以省略,参数位置对应的组件还是能被自动装配。
@Component @Data public class Boss { private Car car; @Autowired //Car将从容器中获取,此注解也可以省略 public Boss(Car car){ this.car=car; System.out.println("Boss有参构造器"); } }
-
标注在方法参数位置
¶@Bean标注的方法创建对象时,方法参数的值从容器中获取
@Configuration
@Import(Car.class)
MainConfigOfAutowired{
@Bean
public Color color(Car car){
Color color=new Color();
color.setCar(car); //此Car实例将从容器中获取
return new Color();
}
}
¶@Qualifier
- @Qualifier明确指定需要装配的Bean的ID
验证:
BookService:
@Service
public class BookService {
@Qualifier("bookDao")
@Autowired
private BookDao bookDao2;
@Override
public String toString() {
return "BookService{" +
"bookDao=" + bookDao2 +
'}';
}
}
同刚才测试用例,测试得结果:
BookService:
@Service
public class BookService {
@Qualifier("bookDao2")
@Autowired
private BookDao bookDao2;
@Override
public String toString() {
return "BookService{" +
"bookDao=" + bookDao2 +
'}';
}
}
同刚才测试用例,测试得结果:
¶@Primary
-
标注有@Primary的Bean将成为Spring进行自动装配时的默认首选Bean
-
标注有@Primary的Bean类不能同时标注@Qualifier
基本用不到,实际命名时不应模糊不清。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com
文章标题:Spring注解学习_自动装配1_@Autowired&@Qualifier&@Primary
文章字数:782
本文作者:梅罢葛
发布时间:2020-04-03, 00:06:03
最后更新:2020-04-03, 15:51:08
原始链接:https://qiurungeng.github.io/2020/04/03/Spring%E6%B3%A8%E8%A7%A3%E5%AD%A6%E4%B9%A0-%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D1-Autowired-Qualifier-Primary/