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

在spring项目中,@Resource private ListIGoodsActuator goodsActuators , goodsActuators 是 什么时候初始化的

在 Spring 项目中,当你这样声明:

@Resource
private List<IGoodsActuator> goodsActuators;

这个 goodsActuators 字段的初始化(即注入)发生在 Spring 容器创建该 Bean 的依赖注入阶段(population phase),具体来说是在 Bean 实例化之后、初始化回调(如 @PostConstruct)之前


📌 详细时机说明(Bean 生命周期视角)

假设你有一个被 Spring 管理的组件类:

@Service
public class GoodsService {@Resourceprivate List<IGoodsActuator> goodsActuators;@PostConstructpublic void init() {// 此时 goodsActuators 已经被注入System.out.println("Size: " + goodsActuators.size());}
}

Spring 创建 GoodsService Bean 的流程如下:

  1. 实例化:调用 GoodsService 的构造函数,创建对象(此时字段仍为 null)。
  2. 依赖注入(DI)
    • Spring 扫描所有字段和 setter 方法;
    • 发现 @Resource private List<IGoodsActuator> goodsActuators
    • 查找容器中所有类型为 IGoodsActuator 的 Bean(包括其实现类,如 DiscountActuator, StockActuator 等);
    • 将这些 Bean 组装成一个 List,并注入到 goodsActuators 字段中。
  3. 初始化回调
    • 调用 @PostConstruct 标注的方法(如 init());
    • 此时 goodsActuators 已经完成注入,可以安全使用

✅ 因此:goodsActuators@PostConstruct 方法执行前就已经初始化完毕。


🔍 关键行为细节

1. 自动收集所有匹配的 Bean

Spring 对 List<T> 类型的注入有特殊处理:

  • 不管你用的是 @Resource 还是 @Autowired
  • 只要字段类型是 List<SomeInterface>
  • Spring 就会自动将容器中 所有实现了 SomeInterface 的 Bean 注入到该列表中。

⚠️ 注意:虽然 @Resource 按 JSR-250 规范本应“按名称注入”,但 Spring 对集合类型(List/Map)做了扩展,此时它会忽略名称,转而按类型收集所有匹配 Bean。

2. 空列表而非 null

  • 如果没有 IGoodsActuator 的实现类被注册为 Bean,goodsActuators 会被注入为一个 空的 ArrayList不会是 null
  • 这避免了空指针异常(NPE),是 Spring 的安全设计。

3. 顺序可控

  • 默认顺序是 Bean 的注册顺序;
  • 可通过 @Order 注解或实现 Ordered 接口控制执行顺序:
    @Component
    @Order(1)
    public class FirstActuator implements IGoodsActuator { ... }
    

✅ 验证示例

@Component
public class A implements IGoodsActuator { }@Component
public class B implements IGoodsActuator { }@Service
public class MyService {@Resourceprivate List<IGoodsActuator> goodsActuators; // 包含 A 和 B@PostConstructpublic void check() {// 输出:2System.out.println(goodsActuators.size());}
}

🆚 与 @Autowired 的区别?

对于 List<T> 注入,在 Spring 中 @Resource@Autowired 行为几乎一致

@Autowired
private List<IGoodsActuator> goodsActuators; // 效果相同

因为 Spring 在解析集合类型时,会统一走“按类型收集所有 Bean”的逻辑,不再区分注解语义。


✅ 总结

问题 答案
何时初始化? 在当前 Bean 的 依赖注入阶段,早于 @PostConstruct
注入内容? 容器中所有 IGoodsActuator 类型的 Bean(实现类)。
为空怎么办? 注入空 List,永不为 null
顺序是否确定? 默认按注册顺序,可用 @Order 控制。
@Resource 是否按名注入? ❌ 对 List<T>,Spring 忽略名称,按类型自动收集。

💡 最佳实践:在 @PostConstruct 或业务方法中使用 goodsActuators 是安全的,无需判空(除非业务逻辑需要)。

http://www.jsqmd.com/news/37185/

相关文章:

  • 2025年口碑好的绢云母粉厂家最新推荐排行榜
  • java-基础-内存查看
  • 2025年比较好的船用加热管厂家最新权威实力榜
  • 2025年家用交流稳压器权威推荐榜单:三相稳压器/隧道稳压器/机床稳压器源头厂家精选
  • 2025年知名的矿车厂家推荐及选择指南
  • 剑指offer-36、两个链表的第⼀个公共节点
  • 回归与分类算法全解析:从理论到实践 - 实践
  • 2025年知名的VR工厂远程云参观用户满意度榜单
  • 2025年靠谱的日本公共交通票价查询方式通票购买指南榜
  • 2025年评价高的打浆机折叠款行业内口碑厂家排行榜
  • 2025年靠谱的视频号短视频推广热门推荐榜单
  • 2025年稳压器厂家权威推荐榜单:家用稳压器/电梯稳压器/机床稳压器源头厂家精选
  • 2025年知名的大阪机场接送舒适便捷权威榜
  • 2025年热门的不锈钢线条TOP品牌厂家排行榜
  • 详细介绍:机器人 / 仿生 / 机械人身化 AI(Embodied AI) ——制造业智能化转型的关键引擎
  • 2025年口碑好的不锈钢压花最新TOP厂家排名
  • Python3 sys模块和os模块的区别是什么?
  • Redis终极面试题:从基础到原理,从概念到实战的10道“必杀题”
  • 2025年11月数控加工中心推荐:知名厂家排行榜与口碑评价对比指南
  • 2025年11月数控加工中心推荐:知名厂家榜与口碑评价对比指南
  • 2025年口碑好的海绵吸盘热门厂家推荐榜单
  • 快递查询
  • Python3 sys 模块
  • 2025年质量好的马车不锈钢螺栓最新TOP厂家排名
  • 2025年11月摩擦焊机销售厂家推荐:靠谱排行前五生产厂家对比与市场报告
  • 详细介绍:Java-Spring入门指南(二十六)Android Studio下载与安装
  • 2025年靠谱的法兰不锈钢螺栓高评价厂家推荐榜
  • 2025年11月数控铣床推荐:靠谱生产厂家排行榜与热门口碑选择方案
  • debian中打包已安装的库(迁移安装)
  • XMind 2025版 pro 破解版下载及安装使用教程