Spring利用依赖注入(DI),完成对IOC容器中中各个组件的依赖关系赋值;常用的有如下几个注解
@Autowired,@Qualifier、@Primary、@Resource、@Inject,组合使用,完成对bean 的依赖注入
| 注解名称 | 说明 | 注意 |
|---|---|---|
| @Autowired | 默认优先按照类型去容器中找对应的组件,找到就赋值,如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找,可以使用@Autowired(required=false) | |
| @Qualifier | 可以直接指定装配的bean | 使用@Qualifier指定需要装配的组件的id,而不是使用属性名 |
| @Primary | 可以设置装配的优先级 ,让Spring进行自动装配的时候,默认使用首选的bean,和@Qualifier类似 | |
| @Resource | JSR250规范,可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的, | 不支持@Primary组合使用 |
| @Inject | JSR330 规范 ,需要导入javax.inject的包,和Autowired的功能一样。 | 没有required=false的功能 |
实例:
1.@Autowired
@Repository
public class BookDao {
private String lable = "1";
public String getLable() {
return lable;
}
public void setLable(String lable) {
this.lable = lable;
}
@Override
public String toString() {
return "BookDao [lable=" + lable + "]";
}
}
@Service
public class BookService {
@Autowired
private BookDao bookDao;
public void print(){
System.out.println(bookDao);
}
@Override
public String toString() {
return "BookService [bookDao=" + bookDao + "]";
}
}
@Configuration
@ComponentScan({"top.daocaor.service","top.daocaor.dao","top.daocaor.bean"})
public class MainConfigOfAutowired {
@Bean("bookDao2")
public BookDao bookDao(){
BookDao bookDao = new BookDao();
bookDao.setLable("2");
return bookDao;
}
}
@Test
public void test1(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);
BookService bookService = applicationContext.getBean(BookService.class);
System.out.println(bookService);
applicationContext.close();
}
结果

修改BookService 类,将bookDao 名称改为bookDao2
@Service
public class BookService {
@Autowired
private BookDao bookDao2;
public void print(){
System.out.println(bookDao2);
}
@Override
public String toString() {
return "BookService [bookDao=" + bookDao2 + "]";
}
}
结果

总结:@Autowired如果找到多个相同类型的组件,将属性的名称作为组件的id去容器中查找
2. @Qualifier
实例:还是刚才的代码,将BookService 进行修改
@Service
public class BookService {
@Qualifier("bookDao")
@Autowired
private BookDao bookDao2;
public void print(){
System.out.println(bookDao2);
}
@Override
public String toString() {
return "BookService [bookDao=" + bookDao2 + "]";
}
}
结果:

总结: @Qualifier可以直接指定对应的bean
3.@Primary
@Service
public class BookService {
@Autowired
private BookDao bookDao;
public void print(){
System.out.println(bookDao);
}
@Override
public String toString() {
return "BookService [bookDao=" + bookDao + "]";
}
}
@Configuration
@ComponentScan({"top.daocaor.service","top.daocaor.dao","top.daocaor.bean"})
public class MainConfigOfAutowired {
@Bean("bookDao2")
@Primary
public BookDao bookDao(){
BookDao bookDao = new BookDao();
bookDao.setLable("2");
return bookDao;
}
}

总结:@Primary 注解在spring注入的时候,默认使用首选的bean
4.@Primary和@Qualifier 一起使用
实例: 修改BookService类
@Service
public class BookService {
@Qualifier("bookDao")
@Autowired
private BookDao bookDao;
public void print(){
System.out.println(bookDao);
}
@Override
public String toString() {
return "BookService [bookDao=" + bookDao + "]";
}
}
结果:

总结:当@Primary和@Qualifier 一起使用时,@Qualifier优先级更高
5.@Resource
实例:
@Service
public class BookService {
@Qualifier("bookDao2")
@Resource(name="bookDao")
private BookDao bookDao;
public void print(){
System.out.println(bookDao);
}
@Override
public String toString() {
return "BookService [bookDao=" + bookDao + "]";
}
}
@Configuration
@ComponentScan({"top.daocaor.service","top.daocaor.dao","top.daocaor.bean"})
public class MainConfigOfAutowired {
@Bean("bookDao2")
@Primary
public BookDao bookDao(){
BookDao bookDao = new BookDao();
bookDao.setLable("2");
return bookDao;
}
}
结果:

总结:
@Resource加载数据的时候,和@Autowired类似,但是 无法和@Qualifier、@Primary配合使用
6.@Inject
实例: 修改BookService类
@Service
public class BookService {
@Inject
private BookDao bookDao;
public void print(){
System.out.println(bookDao);
}
@Override
public String toString() {
return "BookService [bookDao=" + bookDao + "]";
}
}
结果:

总结:@Inject的功能和@Autowired类似,但是通过观察@Inject 接口发现,里面是没有request=false功能的
@Inject 注解源码
@Target({ METHOD, CONSTRUCTOR, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Inject {}

本文深入解析Spring框架中依赖注入(DI)的实现机制,详细介绍了@Autowired、@Qualifier、@Primary、@Resource、@Inject等注解的使用方法及区别,通过具体示例展示了如何在不同场景下选择合适的注解来实现bean的依赖注入。
764

被折叠的 条评论
为什么被折叠?



