@Resource注解详细分析

@Resource注解详细分析

  • @Resource是由CommonAnnotationBeanPostProcessor后置处理器处理的。(备注:如果这里有问题可以留言,下次再专门讲解)

  • 在bean依赖注入的时候,会给我们的变量进行赋值,但是赋值的前提要先找到我们的值。
    CommonAnnotationBeanPostProcessor的autowireResource()方法就在根据我们配置寻找

  • 从下面代码可以大致分析得出

    • 如果@Resource没有指定name,但是我们就根据变量名称判断**factory.containsBean(name)**看容器中是否存在我们想要的:
      如果没有就走上面逻辑:根据类型就去容器中查找我们需要的值
      如果有就走下面的逻辑:就根据名称就去容器中查找我们需要的值

    • 如果@Resource指定name,isDefaultName就是false,就走下面的逻辑根据名称去容器中查找我们需要的值。没有找到就是抛出异常NoSuchBeanDefinitionException。

    • 是自己的原创, 如果讲解有误或者不清楚的地方,麻烦各位指出,谢谢大家的支持。

           Resource resource = ae.getAnnotation(Resource.class);
           //获取Resource注解name属性值
		   String resourceName = resource.name();
		   Class<?> resourceType = resource.type();
		   //如果我们name属性有值,就不是默认值就是false,如果没值默认""就是true。
		   this.isDefaultName = !StringUtils.hasLength(resourceName);
    //条件上有两个重要的条件isDefaultName(上面讲解的)和factory.containsBean(name)
   if (this.fallbackToDefaultTypeMatch && element.isDefaultName &&
   			factory instanceof AutowireCapableBeanFactory && !factory.containsBean(name)) {
   		autowiredBeanNames = new LinkedHashSet<String>();
   		//里面的逻辑是根据类型查找的
   		resource = ((AutowireCapableBeanFactory) factory).resolveDependency(
   				element.getDependencyDescriptor(), requestingBeanName, autowiredBeanNames, null);
   	}
   	else {
   	    //里面的逻辑是根据name查找的 
   		resource = factory.getBean(name, element.lookupType);
   		autowiredBeanNames = Collections.singleton(name);
   	}

注意:@Resource按类型查找和@Autowired是一样的逻辑,也会存在匹配不到或者匹配到多个的逻辑,详细可以看@Autowired注解详细分析。

### 解决 Eclipse 中 `@Resource` 注解报错的原因及方法 #### 一、问题分析 在开发过程中,如果遇到 Eclipse 中 `@Resource` 注解报错的情况,通常是因为项目的配置环境存在问题。具体来说,这可能涉及以下几个方面: 1. **Java 版本不匹配** 如果项目使用的 Java 版本较低(例如 JDK 1.5 或更早),而 `javax.annotation.Resource` 是从 JDK 1.6 开始引入的标准注解,则可能导致无法识别该注解[^3]。 2. **依赖库缺失或冲突** 即使使用了较高版本的 JDK,但如果项目中缺少必要的类路径支持(如未正确导入 `javax.annotation.*` 的相关包),也可能引发此错误。 3. **构建路径设置不当** 当前项目的构建路径可能指向了一个过时或者不符合需求的 JRE 系统库。这种情况下,即使代码逻辑无误,也无法正常解析 `@Resource` 注解。 --- #### 二、解决方案 以下是针对上述问题的具体解决措施: 1. **确认并升级 JDK 版本** - 需要确保当前项目所关联的 JDK 至少为 1.6 及以上版本。 - 在 Eclipse 中调整方式如下: - 对项目右键点击 → *Build Path* → *Configure Build Path*; - 转到 *Libraries* 标签页,找到默认的 *JRE System Library*[J2SE-1.5] 并移除它; - 添加新的 *Workspace default JRE*(即更高版本的 JDK),完成修改后保存退出。 2. **验证 Classpath 是否包含必要资源** - 若仍然存在异常提示,需进一步检查是否存在外部 jar 文件覆盖标准 API 定义的现象。 - 清理不必要的第三方依赖项,并重新整理整个工程结构以排除潜在干扰因素。 3. **强制刷新与清理缓存** - 执行菜单栏中的命令:*Project -> Clean...* - 这一步有助于清除旧数据残留影响新改动生效的可能性。 4. **手动添加所需模块声明(适用于某些特殊场景)** - 如果是在较现代框架下运行传统组件组合应用的话,可以尝试通过 pom.xml 显式指定引入对应功能集. ```xml <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency> ``` --- #### 示例代码片段展示如何正确运用@Resource标注成员变量注入服务实例: 假设有一个简单的 Spring Bean 类定义如下所示: ```java import javax.annotation.Resource; public class MyService { private AnotherBean anotherBean; @Resource(name="anotherBeanInstance") // 使用name属性显式指明目标bean名称 public void setAnotherBean(AnotherBean bean){ this.anotherBean = bean; } } ``` 注意这里采用了 setter 方法形式配合@Resource实现DI操作而非直接字段修饰的方式. --- ### 总结说明 综上所述,Eclipse环境下@Resource注解发生编译期警告多半源于基础环境搭建环节出了纰漏所致.按照前述指导逐一排查修正应该能够顺利解决问题.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值