Spring中怎么定义Bean加载顺序
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这篇文章主要讲解了"Spring中怎么定义Bean加载顺序",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Spring中怎么定义Bean加载顺序"吧!S
千家信息网最后更新 2025年01月31日Spring中怎么定义Bean加载顺序
这篇文章主要讲解了"Spring中怎么定义Bean加载顺序",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Spring中怎么定义Bean加载顺序"吧!
Spring容器载入bean顺序是不确定的,Spring框架没有约定特定顺序逻辑规范。但Spring保证如果A依赖B(如beanA中有@Autowired B的变量),那么B将先于A被加载。
逻辑判断
在业务层自己控制A,B的初始化顺序
构造方法依赖
@Componentpublicclass DemoA { private String name = "demo A"; public DemoA(DemoB demoB) { System.out.println(name); }}@Componentpublicclass DemoB { private String name = "demo B"; public CDemoB() { System.out.println(name); }}这个时候构造A的时候就会先去构造B
使用@DependsOn
Spring 中的@DependsOn可以保证被依赖的bean先于当前bean被容器创建
@DependsOn注解可以定义在类和方法上,意思是我这个组件要依赖于另一个组件,也就是说被依赖的组件会比该组件先注册到IOC容器中。
类上使用注解:package com.spring.master.spring;import org.springframework.stereotype.Component;/** * @author Huan Lee * @version 1.0 * @date 2020-09-22 15:55 * @describtion 业精于勤,荒于嬉;行成于思,毁于随。 */@Componentpublic class EventSource { public EventSource(){ System.out.println("事件源创建"); }}package com.spring.master.spring.dependson;import org.springframework.stereotype.Component;/** * @author Huan Lee * @version 1.0 * @date 2020-09-22 15:56 * @describtion 业精于勤,荒于嬉;行成于思,毁于随。 */@Componentpublic class EventListener { public EventListener(){ System.out.println("监听器创建"); }}package com.spring.master.spring.dependson;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;/** * @author Huan Lee * @version 1.0 * @date 2020-09-22 15:57 * @describtion 业精于勤,荒于嬉;行成于思,毁于随。 */@Configuration@ComponentScan(basePackages = "com.spring.master.spring")public class SpringConfig {}启动服务:事件源创建监听器创建备注:Spring默认扫描包时会根据文件在文件夹的位置先后顺序扫描加载********************************************************************************************使用@DependsOn注解:package com.spring.master.spring;import org.springframework.context.annotation.DependsOn;import org.springframework.stereotype.Component;/** * @author Huan Lee * @version 1.0 * @date 2020-09-22 15:55 * @describtion 业精于勤,荒于嬉;行成于思,毁于随。 */@Component@DependsOn(value = {"eventListener"})public class EventSource { public EventSource(){ System.out.println("事件源创建"); }}启动服务:监听器创建事件源创建
方法上使用注解:package com.spring.master.spring;import org.springframework.context.annotation.DependsOn;import org.springframework.stereotype.Component;/** * @author Huan Lee * @version 1.0 * @date 2020-09-22 15:55 * @describtion 业精于勤,荒于嬉;行成于思,毁于随。 *///@Component//@DependsOn(value = {"eventListener"})public class EventSource { public EventSource(){ System.out.println("事件源创建"); }}package com.spring.master.spring.dependson;import org.springframework.stereotype.Component;/** * @author Huan Lee * @version 1.0 * @date 2020-09-22 15:56 * @describtion 业精于勤,荒于嬉;行成于思,毁于随。 *///@Componentpublic class EventListener { public EventListener(){ System.out.println("监听器创建"); }}package com.spring.master.spring.dependson;import com.spring.master.spring.EventSource;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.DependsOn;/** * @author Huan Lee * @version 1.0 * @date 2020-09-22 15:57 * @describtion 业精于勤,荒于嬉;行成于思,毁于随。 */@Configuration@ComponentScan(basePackages = "com.spring.master.spring")public class SpringConfig { @Bean @DependsOn(value = {"eventListener"}) public EventSource eventSource(){ return new EventSource(); } @Bean public EventListener eventListener(){ return new EventListener(); }}启动服务输出:监听器创建事件源创建
BeanFactoryPostProcessor
容器加载bean之前:BeanFactoryPostProcessor 可以允许我们在容器加载任何bean之前修改应用上下文中的BeanDefinition
在本例中,就可以把A的初始化逻辑放在一个 BeanFactoryPostProcessor 中。@Componentpublic class ABeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { A.initA(); }}这种方式把A中的初始化逻辑放到了加载bean之前,很适合加载系统全局配置,但是这种方式中初始化逻辑不能依赖bean的状态。
BeanPostProcessor
@Componentpublicclass HDemo1 { private String name = "h demo 1"; public HDemo1() { System.out.println(name); }}@Componentpublicclass HDemo2 { private String name = "h demo 2"; public HDemo2() { System.out.println(name); }}
@Componentpublicclass DemoBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter implements BeanFactoryAware { private ConfigurableListableBeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory) { if (!(beanFactory instanceof ConfigurableListableBeanFactory)) { thrownew IllegalArgumentException( "AutowiredAnnotationBeanPostProcessor requires a ConfigurableListableBeanFactory: ">
请将目标集中在postProcessBeforeInstantiation
,这个方法在某个 bean 的实例化之前,会被调用,这就给了我们控制 bean 加载顺序的机会。
感谢各位的阅读,以上就是"Spring中怎么定义Bean加载顺序"的内容了,经过本文的学习后,相信大家对Spring中怎么定义Bean加载顺序这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
顺序
业精于勤
行成于思
事件
容器
监听器
逻辑
监听
方法
注解
组件
学习
服务
内容
文件
方式
时候
保证
控制
上下
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
中国联通网络技术大会陈丰伟
车辆积分数据库
数据库的安全性如何保障
如何做好数据库软件销售
数据库直连缺点
网络安全 信息技术
阿里云和腾讯云都有的云服务器
渭南网络技术联系方式
word网络安全海报
西城区信息化网络技术服务优点
小米盒子无法连接服务器
天龙八部目标服务器关闭
地理信息学什么数据库
佳发流媒体服务器
班会稿网络安全
新冠病毒 网络技术
数据库登录表单
米泉新华互联网科技怎么样
金山区品牌软件开发服务哪个好
通讯管理服务器
保障服务器运行安全吗
中国联通网络技术大会陈丰伟
网络安全维护去哪个城市
上海软件软件开发公司
杨浦区软件开发包括哪些
数据库安全中注意的问题
内部数据库包括
生物信息学数据库构建概述
虚拟主机和数据库
凯乐科技 互联网医疗