当前位置: 首页 > news >正文

@Resource 注解的空值处理(默认行为与容器实现)

关于 @Resource空值处理,需要特别注意其默认行为与容器实现的差异:


1. 规范定义(JSR-250 标准)

  • 默认允许空值
    根据 Java 标准规范,@Resource 不强制要求依赖项必须存在
    当找不到匹配的 Bean 时,会注入 null 而不会抛出异常

2. Spring 容器的特殊实现

重要Spring 对 @Resource 的处理覆盖了规范!

  • Spring 实际默认行为:等效于 @Autowired(required=true)
  • 找不到 Bean 时会抛出异常,而非注入 null
验证代码:
@Component
public class TestService {// 不存在的 Bean@Resourceprivate NonExistBean nonExistBean;
}
启动 Spring 时的错误:
No qualifying bean of type 'NonExistBean' found

3. 显式允许空值的写法

若需遵循规范行为(允许 null),需通过 name 属性指定 Bean 并配合 @Nullable

@Resource(name = "optionalBean") // 明确指定 Bean 名称
@Nullable                         // 显式标记可空
private OptionalBean bean;

4. 不同容器的行为对比

容器类型@Resource 默认行为找不到 Bean 时结果
纯 JSR-250 容器允许空值注入 null
Spring 容器禁止空值(等效于 required=true)抛出 NoSuchBeanDefinitionException

关键结论

  1. 在 Spring 中
    @Resource 默认不允许空值(与 @Autowired 默认行为相同),找不到 Bean 会报错。

  2. 强制允许空值的方法

    @Resource(name = "beanName")  // 指定精确名称
    @Nullable                     // 声明可空
    private SomeBean bean;
    
  3. @Autowired 的对比

    注解Spring 默认行为显式允许空值写法
    @Resource禁止空值(报错)@Resource(name = "x") + @Nullable
    @Autowired禁止空值(报错)@Autowired(required = false)

💡 本质原因
Spring 通过 CommonAnnotationBeanPostProcessor 处理 @Resource 时,
annotation.required 属性 硬编码为 true,覆盖了 JSR-250 规范。

http://www.dtcms.com/a/279944.html

相关文章:

  • 冲刺阶段项目进度压力大,如何组织高效冲刺
  • 大屏搭建多个图表不自适应问题
  • H264编码结构和解析
  • 第四章 uniapp实现兼容多端的树状族谱关系图,剩余组件
  • ESP32 OTA升级详解:使用Arduino OTA库实现无线固件更新
  • HTML 文本格式化标签
  • java--ThreadLocal创建以及get源码解析
  • http常见状态码
  • 苦练Python第18天:Python异常处理锦囊
  • 【论文阅读】Masked Autoencoders Are Effective Tokenizers for Diffusion Models
  • rsyslog简单应用
  • STM32F769I-DISCO 串口调试
  • Linux上基于C/C++头文件查找对应的依赖开发库
  • SAP B1认证资料-题目
  • 分布式系统中实现临时节点授权的高可用性与一致性
  • 哈希扩展 --- 海量数据处理
  • CISSP知识点汇总- 通信与网络安全
  • 15.Python 列表元素的偏移
  • Java学习————————ThreadLocal
  • python Gui界面小白入门学习二
  • python高阶调试技巧,替代print
  • 14.推荐使用 dict.get(key) 而不是 dict[key]
  • redis配置(Xshell连接centos7的基础上)
  • Modbus 开发工具实战:ModScan32 与 Wireshark 抓包分析(一
  • Python `WeakValueDictionary` 用法详解
  • 调用 System.runFinalizersOnExit() 的风险与解决方法
  • C语言基础5——控制语句2(循环)
  • TypeScript枚举类型应用:前后端状态码映射的最简方案
  • 深入学习前端 Proxy 和 Reflect:现代 JavaScript 元编程核心
  • Java并发编程之线程池详解