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

Spring依赖注入:@Resource与@Autowired详解及避免空指针的最佳实践

@Resource 是 Java 中的一个依赖注入(Dependency Injection, DI)注解,用于自动装配(自动注入)Spring 容器管理的 Bean。在你的代码中:

@Resource
private StringRedisTemplate stringRedisTemplate;

@Resource 的作用:

  1. 自动注入依赖
  • Spring 会查找容器中类型为 StringRedisTemplate 的 Bean,并自动注入到 stringRedisTemplate 变量中。
  • 如果容器中有多个 StringRedisTemplate 实例,可以结合 @Qualifier 指定具体的 Bean。
  1. @Autowired 的区别
  • @Resource 是 Java 标准注解(javax.annotation.Resource),而 @Autowired 是 Spring 特有的注解。
  • @Resource 默认按名称(byName) 注入,如果找不到匹配的名称,则回退到按类型(byType)注入。
  • @Autowired 默认按类型(byType) 注入,可以配合 @Qualifier 指定名称。
  1. 适用场景
  • 当需要按名称(Bean ID)注入时,@Resource 更直观。
  • 当需要按类型注入时,@Autowired 更常用。

示例说明:

@Resource
private StringRedisTemplate stringRedisTemplate;
  • Spring 会查找名为 stringRedisTemplate 的 Bean(因为变量名和 Bean 名称一致)。
  • 如果找不到,则查找类型为 StringRedisTemplate 的 Bean 并注入。

如果希望显式指定 Bean 名称:

@Resource(name = "myStringRedisTemplate")
private StringRedisTemplate redisTemplate;
  • 这样会强制注入名为 myStringRedisTemplate 的 Bean。

对比 @Autowired

@Autowired
private StringRedisTemplate stringRedisTemplate; // 按类型注入@Autowired
@Qualifier("customRedisTemplate")
private StringRedisTemplate redisTemplate; // 按名称注入

总结:

  • @Resource 是 Java 标准注解,默认按名称注入,适合需要明确指定 Bean 名称的场景。
  • @Autowired 是 Spring 注解,默认按类型注入,适合大多数依赖注入场景。

在你的代码中,@Resource 确保了 StringRedisTemplate 被正确注入,使得你可以直接使用 stringRedisTemplate 操作 Redis。
如果不加 @Resource(或 @Autowired),Spring 不会自动注入 StringRedisTemplate,导致该字段为 null,后续使用时会抛出 NullPointerException


不加 @Resource 的影响

1. 字段不会被自动注入,默认为 null

private StringRedisTemplate stringRedisTemplate; // 未注入,默认是 null
  • 如果直接调用 stringRedisTemplate.opsForValue().set("key", "value"),会抛出:
java.lang.NullPointerException: Cannot invoke "org.springframework.data.redis.core.StringRedisTemplate.opsForValue()" because "this.stringRedisTemplate" is null

2. 必须手动初始化(不推荐)

如果不依赖 Spring 的依赖注入(DI),你需要手动创建 StringRedisTemplate 实例:

private StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(); // 需要配置 Redis 连接等
  • 问题
  • 需要手动管理 Redis 连接工厂(RedisConnectionFactory)。
  • 违背 Spring 的 IoC(控制反转)原则,代码耦合度高。

为什么推荐使用 @Resource@Autowired

  1. 依赖注入(DI)是 Spring 的核心功能
  • Spring 会自动管理 Bean 的生命周期,并注入所需的依赖。
  • 避免手动创建对象,减少代码冗余。
  1. StringRedisTemplate 是 Spring 管理的 Bean
  • 在 Spring Boot 中,StringRedisTemplate 默认已经由 Spring 配置并注册到容器中。
  • 使用 @Resource@Autowired 可以直接获取它,无需手动创建。
  1. 避免 NullPointerException
  • 如果字段未被注入,调用其方法时会直接报 NPE。
  • 使用 @Resource 可以确保 Spring 正确注入依赖。

如何验证是否注入成功?

可以在代码中检查 stringRedisTemplate 是否为 null

@Resource
private StringRedisTemplate stringRedisTemplate;@PostConstruct
public void init() {
if (stringRedisTemplate == null) {
throw new IllegalStateException("StringRedisTemplate 未注入!");
}
System.out.println("StringRedisTemplate 注入成功!");
}
  • 如果启动时抛出异常,说明注入失败。
  • 如果打印 "StringRedisTemplate 注入成功!",说明 Spring 已正确注入。

总结

情况影响解决方案
不加 @ResourcestringRedisTemplatenull,使用时抛 NPE必须手动初始化(不推荐)
@ResourceSpring 自动注入,可直接使用推荐方式
@Autowired功能类似,默认按类型注入也是推荐方式

最佳实践
始终使用 @Resource@Autowired 注入 Spring 管理的 Bean,避免 NullPointerException 和手动管理依赖的麻烦。

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

相关文章:

  • 52Hz——FreeRTOS学习笔记——延时函数
  • 阿里巴巴做网站教程免费网站模板下载大全下载
  • 贪心算法之分数背包问题
  • LLMs之AgentDevP:FastGPT的简介、安装和使用方法、案例应用之详细攻略
  • 贪心算法之船舶装载问题
  • 面试_常见大厂面试题
  • 网站地图怎么建设wordpress文章页样式修改
  • 网站如何做交互热门seo推广排名稳定
  • 【第29话:路径规划】自动驾驶启发式搜索算法(A星搜索算法( A* 搜索算法))详解及代码举例说明
  • React学习教程,从入门到精通,React Router 语法知识点及使用方法详解(28)
  • Docker Compose 从入门到实践
  • D3.js 与数据可视化
  • RNA-seq分析之最佳cutoff(TCGA版)
  • 浏览器直接进入网站的注意事项钢筋网片价格
  • scrapy-redis项目:爬取某网站图书信息
  • (论文速读)DiffBlender:可组合和通用的多模态文本到图像扩散模型
  • 第三方网站测试工具:【Postman使用基础指南】
  • Pytest+requests进行接口自动化测试5.0(5种assert断言的封装 + pymysql)
  • C# MVC 模型绑定全解析:从基础机制到自定义绑定器实战指南
  • 企业网站网页设计专业的团队网站建设
  • 网站建设可上传视频的wordpress 数据库类型
  • 广州南沙区建设和交通局网站个人建立网站要多少钱
  • Vue3 》》vite》》vite-plugin-mock mock 模拟数据 ,loadEnv
  • 宝塔面板搭建RustDesk教程:告别命令行,一键拥有私有远程桌面
  • Docker + IDEA 一键部署!
  • Rust开源HyperSwitch实战指南
  • Chrome性能优化指南
  • Chrome高危类型混淆0-Day漏洞(CVE-2025-10585)技术分析
  • 教做面点的网站广州百度竞价托管
  • 网站推广方案合肥房产网安居客