javax.annotation.Resource注解

本文详细解析了Spring框架中使用@Resource注解进行依赖注入的过程。包括优先根据name属性查找对应的bean定义,然后尝试通过变量名查找,最后若以上两种方式均未成功,则按类型匹配并注入实现类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Resource(name="accountService2")
 IAccountServicce accountService;

 这时候spring注入IAccountServicce实现类的过程是 :

1:先查找xml中是否有id为accountService2的元素,即Resource中的name属性的值优先查找。

 2:如果没有找到,则看xml是否有id为accountService(引用变量名称)的元素。

 3:否则查找IAccountServicce类型的元素,查找其实现类,如果找2个以上的报错:

  org.springframework.beans.factory.NoUniqueBeanDefinitionException

<think>我们正在讨论javax.annotation.Resource注解的用法和示例。根据用户的问题,他们想了解这个注解的用途和用法,并希望看到示例。根据引用[3],我们知道:-@Resource不是Spring的注解,它来自J2EE(javax.annotation包),但Spring支持这个注解。-它默认按名称(byName)自动注入,有两个重要属性:name和type。-如果不指定name和type,则默认按名称注入;如果找不到匹配的名称,则回退到按类型注入。-建议将@Resource放在setter方法上,但也可以放在字段上。用途:用于依赖注入,可以标注在字段、setter方法或类上,让容器(如Spring)自动装配bean。用法示例:1.按名称注入(指定name属性)2.按类型注入(指定type属性)3.默认方式(既不指定name也不指定type)我们来看几个示例:示例1:按名称注入(使用name属性)```javapublicclassMyService{@Resource(name="myDataSource")privateDataSourcedataSource;}```这里,容器会查找名为"myDataSource"的bean并注入。示例2:按类型注入(使用type属性)```javapublicclassMyService{@Resource(type=DataSource.class)privateDataSourcedataSource;}```容器会查找类型为DataSource的bean并注入。注意,如果同一类型有多个bean,则需配合名称或其他限定符。示例3:默认方式(既不指定name也不指定type)```javapublicclassMyService{@ResourceprivateDataSourcedataSource;}```此时,注入流程如下:-首先按字段名(dataSource)作为bean名称进行查找;-如果找不到,则按类型(DataSource)进行查找。另外,也可以将@Resource用在setter方法上:```javapublicclassMyService{privateDataSourcedataSource;@ResourcepublicvoidsetDataSource(DataSourcedataSource){this.dataSource=dataSource;}}```注意:在Spring中,使用@Resource需要确保已经配置了相应的后处理器(如CommonAnnotationBeanPostProcessor)或者使用了<context:annotation-config/>(XML配置)或@ComponentScan(注解配置)来启用注解驱动。另外,引用[2]提到,如果项目中没有javax.annotation-api,需要添加依赖:```xml<dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version></dependency>```引用[1]中的示例代码也展示了如何使用反射来检查注解,但这并不是@Resource的典型用法,因为@Resource通常由容器处理。因此,用户问题中提到的示例代码(引用[1])实际上是在演示自定义注解(@MyTarget)的反射使用,而不是@Resource的使用。用户真正的需求是关于@Resource的,所以我们应该提供@Resource的用法示例。最后,关于@Resource和@Autowired的区别(引用[3]提到):-@Autowired是Spring的注解,默认按类型注入(byType),如果需要按名称注入,可以配合@Qualifier使用。-@Resource是Java标准注解,默认按名称注入(byName),也可以指定按类型注入。总结:@Resource提供了一种标准化的方式来声明依赖注入,用法灵活,可以通过name或type来精确指定注入的bean。现在,根据用户的问题,我们给出回答并生成相关问题。</think>### javax.annotation.Resource 注解详解 #### **用途** `@Resource` 是 Java EE 标准注解(JSR-250),用于**依赖注入**。它通过名称(`byName`)或类型(`byType`)自动装配 Bean,适用于字段、方法或类。Spring 框架完全支持此注解[^3]。 #### **核心特性** 1. **注入策略**: - 默认按名称(`byName`)注入。 - 支持通过 `name` 或 `type` 属性显式指定注入方式。 - 未指定属性时:先按名称匹配,失败时按类型匹配[^3]。 2. **与 `@Autowired` 区别**: - `@Autowired` 是 Spring 注解,默认按类型注入(`byType`)。 - `@Resource` 是 Java 标准注解,更灵活,支持名称优先策略[^3]。 #### **用法示例** ##### 1. **按字段注入** ```java public class UserService { @Resource(name = "userRepository") // 按名称注入 private UserRepository repository; } ``` ##### 2. **按 setter 方法注入** ```java public class OrderService { private PaymentGateway gateway; @Resource // 默认按字段名(gateway)匹配 public void setPaymentGateway(PaymentGateway gateway) { this.gateway = gateway; } } ``` ##### 3. **按类型注入** ```java public class ReportService { @Resource(type = DataSource.class) // 按类型注入 private DataSource dbSource; } ``` #### **依赖配置** 需添加 Maven 依赖(非 Spring Boot 项目): ```xml <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency> ``` [^2] #### **使用场景** - 需要精确控制注入 Bean 的名称时。 - 项目需兼容非 Spring 容器(如 Java EE 服务器)。 - 避免 Spring 特定注解(保持代码中立性)。 #### **注意事项** - **名称冲突**:多个同类型 Bean 时,必须指定 `name` 属性。 - **作用域**:不能注入原型(Prototype)作用域的 Bean(需配合 `@Scope` 代理)。 - **激活注解**:确保 Spring 配置中启用注解扫描(如 `@ComponentScan` 或 `<context:annotation-config>`)[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值