Spring Bean的优先加载方法怎么实现
发表于:2025-02-12 作者:千家信息网编辑
千家信息网最后更新 2025年02月12日,这篇文章主要介绍"Spring Bean的优先加载方法怎么实现",在日常操作中,相信很多人在Spring Bean的优先加载方法怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
千家信息网最后更新 2025年02月12日Spring Bean的优先加载方法怎么实现
这篇文章主要介绍"Spring Bean的优先加载方法怎么实现",在日常操作中,相信很多人在Spring Bean的优先加载方法怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Spring Bean的优先加载方法怎么实现"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
在日常的业务开发中,绝大多数我们都是不关注 bean 的加载顺序,然而如果在某些场景下,当我们希望某个 bean 优于其他的 bean 被实例化时,往往并没有我们想象中的那么简单。
启动类指定方式
在实际的 SpringBoot 开发中,我们知道都会有一个启动类,如果希望某个类被优先加载,一个成本最低的简单实现,就是在启动类里添加上依赖
@SpringBootApplicationpublicclass Application { // 使用构造方法的方式来优先加载DemoBean public Application(DemoBean demoBean) { demoBean.print(); } public static void main(String[] args) { SpringApplication.run(Application.class); }}请注意上面的构造方法,如果我们希望在应用启动之前,demoBean就已经被加载了,那就让 Application 强制依赖它,所以再 Application 的 bean 初始化之前,肯定会优先实例化demoBean
InstantiationAwareBeanPostProcessorAdapter方式
借助InstantiationAwareBeanPostProcessorAdapter来实现在 bean 实例化之前优先加载目标 bean。
publicclass ClientBeanProcessor extends InstantiationAwareBeanPostProcessorAdapter implements BeanFactoryAware { private ConfigurableListableBeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory) { if (!(beanFactory instanceof ConfigurableListableBeanFactory)) { thrownew IllegalArgumentException( "AutowiredAnnotationBeanPostProcessor requires a ConfigurableListableBeanFactory: ">
上面的实现比较简单,借助beanFactory#getBean
来手动触发 bean 的实例,通过实现BeanFactoryAware
接口来获取BeanFactory
,因为实现InstantiationAwareBeanPostProcessor
接口的类会优先于 Bean 被实例,以此来间接的达到我们的目的
接下来的问题就是如何让它生效了,我们这里使用 Import 注解来实现
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Import({ClientAutoConfiguration.class, ClientBeanProcessor.class})public@interface EnableOrderClient {}
package com.spring.master.spring.bean.initbean;import lombok.Getter;import org.springframework.core.env.Environment;import javax.annotation.PostConstruct;/** * @author Huan Lee * @version 1.0 * @date 2020-09-25 11:58 * @describtion 业精于勤,荒于嬉;行成于思,毁于随。 */public class DatasourceLoader { @Getter private String mode; public DatasourceLoader(Environment environment) { this.mode = environment.getProperty("config.save.mode"); System.out.println("init DatasourceLoader for:" + mode); } @PostConstruct public void loadResourcres() { System.out.println("开始初始化资源"); }}package com.spring.master.spring.bean.initbean;import org.springframework.stereotype.Component;/** * @author Huan Lee * @version 1.0 * @date 2020-09-25 12:01 * @describtion 业精于勤,荒于嬉;行成于思,毁于随。 */@Componentpublic class DemoBean { public DemoBean() { System.out.println("demo bean init!"); } public void print() { System.out.println("print demo bean "); }}
package com.spring.master.spring.bean.initbean;import org.springframework.context.annotation.Import;import java.lang.annotation.*;/** * @author Huan Lee * @version 1.0 * @date 2020-09-25 11:59 * @describtion 业精于勤,荒于嬉;行成于思,毁于随。 */@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Import({ClientAutoConfiguration.class, ClientBeanProcessor.class})public @interface EnableOrderClient {}
package com.spring.master;import com.spring.master.spring.bean.initbean.DemoBean;import com.spring.master.spring.bean.initbean.EnableOrderClient;import com.spring.master.spring.bean.lifecycle.Person;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;@EnableOrderClient@SpringBootApplicationpublic class SpringMasterApplication { public SpringMasterApplication(DemoBean demoBean) { demoBean.print(); } public static void main(String[] args) { SpringApplication.run(SpringMasterApplication.class, args); }}启动服务输出:init DatasourceLoader for:null开始初始化资源com.spring.master.spring.bean.initbean.DatasourceLoader@458342d3demo bean init!print demo bean
到此,关于"Spring Bean的优先加载方法怎么实现"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
方法
实例
学习
业精于勤
行成于思
方式
接下来
就是
接口
更多
资源
问题
面的
帮助
开发
实用
最低
业务
场景
实际
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
ftp服务器部署网站
怎样做好网络安全产品的销售
网络安全迫与破 申论
2022首都网络安全日活动主题
上海荔可网络技术有限公司
2网络安全黑板报字体
传奇数据库面巾代码
中国计算机网络安全大会
大华股份软件开发应届生工资
有经验的软件开发人员
中职网络技术专业 云计算方向
银行软件开发面试内容
java数据库备份
穿数据库
网络技术广域网
滨湖区加工软件开发配置
数据库怎么写出生日期
lol皮肤数据库
学计算机软件开发好找工作吗
衡水东网软件开发
怎样做好网络安全产品的销售
深圳网络安全企业
数据库安全性的目标
数据库没有开启远程怎么同步
无线网络安全的手抄报
cad命令后不显示数据库
穿数据库
php修改数据库代码
支付宝一直显示服务器出错
计算机游戏软件开发好就业吗