说明:
@Autowired
和 @Resource
都是 Spring 框架中的注解,用于实现依赖注入(Dependency Injection,DI)。
区别:
- 来源不同:
@Autowired
来自 Spring IoC 容器,而@Resource
来自于 Java 。@Autowired
通常从构造器方法中的参数获取依赖,而@Resource
则是从另一个类中注入。 - 依赖查找顺序不同:
@Autowired
是先按类型(byType)查找,如果存在多个 Bean,再按名称(byName)进行查找;而@Resource
是先按名称(byName)查找,如果存在多个 Bean,再按类型(byType)进行查找。 - 支持的参数不同:
@Autowired
支持参数为 null,而@Resource
不支持。@Autowired
可以接受多个参数,用于指定多个需要注入的对象;而@Resource
只能接受单个参数,用于指定需要注入的特定属性或方法。 @Autowired
默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false- 方法作用不同:
@Autowired
用于自动装配 Bean,而@Resource
用于将一个类的属性或方法注入到另一个类中。
注意:
@Autowire
和@Qualifier
配合使用效果也是和@Resource
一样。
@Autowired(required = false) @Qualifier("commonExecutorPool")
private ExecutorService commonExecutorPool;
@Resource(name = "commonExecutorPool")
private ExecutorService commonExecutorPool;
@resource注解通常用于以下场景:
- 定义一个 Spring Bean,该 Bean 依赖于其他 Bean。
- 通过注解配置 Bean,避免编写冗长的字符串或使用大括号等占位符。
- 当需要在多个组件之间共享数据源时,可以使用
@Resource
注解指定共享资源。 - 当需要注入一个可序列化的对象(如文件、数据库连接等)时,可以使用
@Resource
注解将其注入到方法或属性上,实现依赖的自动注入。 - 当需要自定义一个可复用的组件时,可以使用
@Resource
注解定义一个共享的静态资源。
总结:
@Autowired
主要用于自动装配 Bean,而 @Resource
主要用于将一个类的属性或方法注入到另一个类中,实现依赖注入。总之,@Resource
注解可以帮助我们简化 Bean 依赖、注入数据源等操作,提高开发效率和代码质量。同时,在使用过程中,也需要根据具体情况选择合适的使用场景和方式,以发挥其最大的价值。