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

Springbean(二)@Component及其派生注解自动注入(2)使用注意和加载问题

一、加载顺序

1、扫描顺序

Spring 在 @ComponentScan 或者 @SpringBootApplication 默认的包扫描路径下,会按照类路径扫描所有的 @Component 及其派生注解(如 @Service, @Repository, @Controller)的 Bean,并将其注册到 Spring 容器中。

  • 默认情况下,扫描的顺序是不确定的,因为 Spring 使用反射扫描类路径,而类路径的顺序通常依赖于底层文件系统或者 ClassLoader 的实现。

  • 但如果 @ComponentScan 通过 basePackages 指定了多个包路径,Spring 会按声明的顺序扫描这些包。

2、依赖关系的影响

如果一个 @Component 需要依赖另一个 Bean,Spring 会确保 先初始化被依赖的 Bean,再初始化依赖它的 Bean。如:

@Component
public class A {public A(B b) {System.out.println("A initialized");}
}@Component
public class B {public B() {System.out.println("B initialized");}
}输出:
B initialized
A initialized
3、顺序调整问题
(1)@DependsOn显示指明顺序
@Component
@DependsOn("c")
public class D {public D() {System.out.println("D initialized");}
}@Component
public class C {public C() {System.out.println("C initialized");}
}输出:
C initialized
D initialized
 (2)@Order影响 ListSet 类型的 Bean

如果多个 @Component 实现了同一个接口,并且注入为 ListSet 类型,Spring 会根据 @Order 注解的值来决定顺序:

@Component
@Order(2)
public class First implements MyInterface { }@Component
@Order(1)
public class Second implements MyInterface { }

当它们被注入 List<MyInterface> 时,顺序会是 SecondFirst

但**@Order 只影响 List/Set 注入的顺序,不影响 Bean 的初始化顺序**。

 (3)@Primary@Qualifier 影响注入选择

如果多个 @Component 适用于相同类型的注入:

  • @Primary 标注的 Bean 会优先被注入。

  • @Qualifier 可以精确指定要注入哪个 Bean,但不影响初始化顺序。

(4)懒加载 @Lazy 可能会延迟初始化

如果 @Component 标注了 @Lazy,它的 Bean 只有在被使用时才会初始化,而不是在 Spring 容器启动时初始化:如果该 Bean 没有被使用,它就不会初始化。

@Component
@Lazy
public class LazyBean {public LazyBean() {System.out.println("LazyBean initialized");}
}

二、加载原理对比

1、@configuration和@component

使用@component+@Bean与@configuration+@Bean,加载的区别很大

(1)@component+@Bean

不会被Spring代理,会直接获取一个全新的Bean对象实例所以全局会有多个Bean对象的实例;而

(2)@configuration注解的@Bean

   全局只有一个Bean对象。

Spring 容器在启动时,会加载默认的一些PostProcessor,其中就有ConfigurationClassPostProcessor,这个后置处理程序专门处理带有@Configuration注解的类,这个程序会在bean 定义加载完成后,在bean初始化前进行处理。主要处理的过程就是使用cglib动态代理增强类,而且是对其中带有@Bean注解的方法进行处理。

Spring发现方法所请求的Bean已经在容器中,那么就直接返回容器中的Bean。所以全局只有一个SimpleBean对象的实例。


http://www.mrgr.cn/news/96151.html

相关文章:

  • HarmonyOS之深入解析跳转支付宝小程序完成操作后如何自动返回App
  • 设计秒杀系统(高并发的分布式系统)
  • node-ddk,electron,主进程通讯,窗口间通讯
  • 为AI聊天工具添加一个知识系统 之152 当今AI模型和AI工具应用中的核心矛盾
  • cesium中label样式修改为圆角
  • Ubuntu24.04 离线安装 MySQL8.0.41
  • 软考《信息系统运行管理员》- 5.3 信息系统数据资源备份
  • 在Cesium中创建渐变色墙体效果
  • [二值图像处理] 骨架线提取、骨架端点、交叉点提取
  • Ollama未授权访问
  • 力扣:回溯算法
  • AS400==WINDOWS开发COBOL/安装DB2/连接DB2
  • 学有所记——初探向量数据库Weaviate
  • 深度学习入门1 基于Python的理论与实现
  • kubeadm部署k8s-1.32版本集群(1个master,1个worker)
  • 电机控制常见面试问题(二十)
  • 每日一题-力扣-2829. k-avoiding 数组的最小总和 0326
  • gz sim机器人SDF模型 [持续更新]
  • [unity 点击事件] 区域响应点击事件,排除子节点区域,Raycast Target 应用
  • Android实践开发制作小猴子摘桃小游戏