spring自动装配-@Autowired、@Qualifier、@Primary、@Resource、@Inject组合使用

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

Spring利用依赖注入(DI),完成对IOC容器中中各个组件的依赖关系赋值;常用的有如下几个注解
@Autowired,@Qualifier、@Primary、@Resource、@Inject,组合使用,完成对bean 的依赖注入

注解名称说明注意
@Autowired默认优先按照类型去容器中找对应的组件,找到就赋值,如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找,可以使用@Autowired(required=false)
@Qualifier可以直接指定装配的bean使用@Qualifier指定需要装配的组件的id,而不是使用属性名
@Primary可以设置装配的优先级 ,让Spring进行自动装配的时候,默认使用首选的bean,和@Qualifier类似
@ResourceJSR250规范,可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的,不支持@Primary组合使用
@InjectJSR330 规范 ,需要导入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 {}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值