@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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了