在Spring Framework中,有哪些注解可用于注入Bean?并请说明@Autowired与@Resource的区别。
考察说明
考查对Spring依赖注入注解的掌握及@Autowired与@Resource在来源、匹配方式和处理机制上的差异。
回答思路
- 【回答框架 1】常见注入注解包括@Autowired、@Resource、@Inject、@Qualifier、@Value以及构造器注入。@Autowired是Spring原生注解,按类型注入,优先匹配唯一类型,若存在多个候选则按属性名或@Qualifier指定名称,依赖required属性控制是否必须。
- 【回答框架 2】@Resource是JSR-250标准注解,默认按名称注入,名称由属性名或name属性指定,找不到名称时回退到按类型注入,但整体匹配逻辑与@Autowired不同,且不支持构造器注入。@Inject来自JSR-330,功能类似@Autowired但无required属性。
- 【回答框架 3】两者核心差异:来源不同,@Autowired是Spring,@Resource是Java标准;匹配顺序不同,@Autowired先类型后名称,@Resource先名称后类型;字段支持范围不同,@Autowired可用于构造器、方法和字段,@Resource主要用于字段和setter;处理机制不同,@Autowired使用AutowiredAnnotationBeanPostProcessor,@Resource使用CommonAnnotationBeanPostProcessor。
- 【回答框架 4】实际使用中,若存在相同类型的多个Bean,@Autowired需配合@Qualifier或@Primary指定,而@Resource可通过name直接指定,但@Resource对名称敏感,改名后需同步调整。推荐根据团队规范和项目场景选择,一般单个实现时两者均可,多个实现时注意匹配策略。
- 【关键点 1】@Autowired为Spring原生,按类型优先注入;@Resource为JSR-250标准,按名称优先注入。
- 【关键点 2】多个候选Bean时,@Autowired依赖@Qualifier或字段名匹配,@Resource依赖name属性或字段名。
- 【关键点 3】@Autowired支持构造器、字段和方法注入,@Resource主要支持字段和setter,不支持构造器。
- 【关键点 4】两者底层处理处理器不同:@Autowired使用AutowiredAnnotationBeanPostProcessor,@Resource使用CommonAnnotationBeanPostProcessor。
- 【关键点 5】注入方式还包括@Inject、@Value(注入配置值)和构造器注入,构造器注入适合不可变依赖。
- 【易错点 1】不能简单认为@Resource按名称一定可靠,若名称不匹配会回退到类型,可能因类型不唯一而失败。
- 【易错点 2】@Autowired的required默认true,找不到Bean会启动失败,若允许缺失需显式设置required=false。
- 【易错点 3】@Resource在Spring中虽可用,但依赖JSR-250实现,迁移到纯JSR-330环境时可能不受支持。