@Resource和@Autowired区别

前言:

@Resource和@Autowired都是做bean的注入时使用

历史:  @Autowired     属于Spring的注解           org.springframework.beans.factory.annotation.Autowired

     @Resource     不属于Spring的注解,JDK1.6支持的注解    javax.annotation.Resource

共同点:装配bean。写在字段上或写在setter方法

不同点:@Autowired  默认按类型装配   

          依赖对象必须存在,如果要允许null值,可以设置它的required属性为false   @Autowired(required=false)

          也可以使用名称装配,配合@Qualifier注解

    @Resource  默认按名称进行装配,通过name属性进行指定

 

举个栗子:

新建一个接口BaseService,两个实现类AServiceImpl、BServiceImpl

public interface BaseService {
    
    void print();

}
复制代码
@Service
public class AServiceImpl implements BaseService {

    @Override
    public void print() {
        System.out.println("aaa");
    }

}
复制代码
复制代码
@Service
public class BServiceImpl implements BaseService {

    @Override
    public void print() {
        System.out.println("bbb");
    }

}
复制代码

再建一个测试类:

复制代码
/**
 * 测试@Resource与@Autowired注入的区别
 * 
 * @author xuwenjin
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = App.class)
public class TestSet {
    
    @Autowired
    private BaseService service;
    
    @Test
    public void test(){
        String className = service.getClass().getName();
        System.out.println(className);
        service.print();
    }

}
复制代码

执行test方法,报错,结果如下:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.xwj.service.BaseService' available: expected single matching bean but found 2: AServiceImpl,BServiceImpl

在@Autowired下增加@Qualifier注解

    @Autowired
    @Qualifier("AServiceImpl")
    private BaseService service;

再执行test方法,成功,结果如下:

com.xwj.service.AServiceImpl
aaa

 

再来试试 @Resource 注解

  @Resource
    private BaseService service;

执行test方法,报错异常跟只用@Autowired情况一样。再加上name属性:

    @Resource(name = "AServiceImpl")
    private BaseService service;

再执行test方法,成功。

 

总结:

  一个接口,多个实现类,Autowired就不知道注入哪一个实现类,而Resource有name属性,可以区分。

  参考资料:https://www.zhihu.com/question/39356740

 

posted @   仅此而已-远方  阅读(921)  评论(1)    收藏  举报
编辑推荐:
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
阅读排行:
· 7 个最近很火的开源项目「GitHub 热点速览」
· DeepSeekV3:写代码很强了
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· Visual Studio 2022 v17.13新版发布:强化稳定性和安全,助力 .NET 开发提
· AI浏览器自动化实战
点击右上角即可分享
微信分享提示