千家信息网

怎样进行Spring boot 启动层面的开发

发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,本篇文章给大家分享的是有关怎样进行Spring boot 启动层面的开发,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Spring bo
千家信息网最后更新 2025年11月15日怎样进行Spring boot 启动层面的开发

本篇文章给大家分享的是有关怎样进行Spring boot 启动层面的开发,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Spring boot的启动可以主要分为2个阶段,调用AbstractApplicationContext的refresh方法和调用AbstractApplicationContext的refresh。

我们知道AbstractApplicationContext的refresh的方法是一个模板方法。几乎所有类型的ApplicationContext的初始化都是围绕这个refresh方法来进行。

1. refresh方法之前

1.1 ApplicationContextInitializer

这个类Spring boot***进行调用的类,其主要就是初始化一些BeanFactoryPostProcessor(后面会说明),或者一些在Application 初始化的时候就需要做的事情。而这些类通过通过扫描calsspath路径下的:META-INF/spring.factories 文件中的org.springframework.context.ApplicationContextInitializer字来加载类的全路径名,通过反射获取对象,然后调用initialize方法。

1.2 ApplicationListener

这个和ApplicationContextInitializer加载的方式类似,也是从META-INF/spring.factories文件中的配置,主要作用就是在Spring boot的初始化不同阶段会处罚不同的事件(ApplicationEvent及其子类),而这些监听器就会根据自己在不同事件触发的情况下完成自己的处理逻辑。例如,ConfigFileApplicationListener负责加载配置文件。

当然也可以通过其他方式加入beanFactory中,详情可以参照BeanFactoryPostProcessor加入到beanFactory的方法

1.ApplicationListener的有些事件是在ApplicationContextInitializer之前触发的

2.建议不要直接在ApplicationContextInitializer加入自己的BeanFactoryPostProcessor方法,xxxAware是不会帮你注入的。

2. refresh方法

这个就是spring的模板方法,主要有3个比较重要的接口

2.1 BeanFactoryPostProcessor

public interface BeanFactoryPostProcessor {       void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;}

这个方法就是给可以对beanFactory进行一些自定义的操作,例如加入一些bean等。当然前提就是我们定义的bean是在beanFactory中。有许多办法可以做到

  • 在ApplicationContextInitializer中定义加入,例如

public class MyContextInitializer implements ApplicationContextInitializer {public void initialize(ConfigurableApplicationContext applicationContext) {        applicationContext.addBeanFactoryPostProcessor(new MyBeanFactoryPostProcessor());    }}
  • 通过其他BeanFactoryPostProcessor加入,可以通过注解@Import或者加载XML)

例如通过@Import(value={AnnotationBeanDefinitionRegistrar.class})

@Configurationpublic class AnnotationBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {private String BEAN_NAME = "annotationBeanPostProcessor";public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {        List basePackages = getPackagesToScan(importingClassMetadata);if (!registry.containsBeanDefinition(BEAN_NAME)) {            addPostProcessor(registry, basePackages);        }    }private void addPostProcessor(BeanDefinitionRegistry registry, List basePackages) {        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();        beanDefinition.setBeanClass(AnnotationBeanPostProcessor.class);        beanDefinition.getConstructorArgumentValues()                .addGenericArgumentValue(basePackages);        beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);        registry.registerBeanDefinition(BEAN_NAME, beanDefinition);    }private List getPackagesToScan(AnnotationMetadata metadata) {        AnnotationAttributes attributes = AnnotationAttributes.fromMap(                metadata.getAnnotationAttributes(EnableDubbo.class.getName()));        String[] basePackages = attributes.getStringArray("basePackages");return Arrays.asList(basePackages);    }}

这样,就可以加入我们自定义的BeanFactoryPostProcessor,就可以在Bean注册的层面上进行开发

2.2 BeanPostProcessor

public interface BeanPostProcessor {     Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;   Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;}

这个接口主要就是针对在bean实例化前后做一些定制开发。一般只针对某个接口或者某个注解进行批量操作

3. 综述

1. 如果你需要在SpringApplication初始化的时候就做一些事情,使用ApplicationContextInitializer

2. 如果你需要SpringApplication的某个特定阶段做一些事情,使用ApplicationListener(推荐)

3. 如果你需要在beanFactory层面上开发,使用BeanFactoryPostProcessor(推荐)

4. 如果你需要在对某个bean的实例化层面上开发,使用BeanPostProcessor(一般业务上的开发使用InitializingBean或者init-method能够满足)

以上就是怎样进行Spring boot 启动层面的开发,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

方法 开发 就是 层面 不同 事件 事情 接口 文件 阶段 可以通过 实例 方式 时候 是在 更多 模板 注解 知识 篇文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南山网络安全态势周报 宝山区企业网络技术服务问答知识 中国国际关系学院的网络安全 网络安全队会手抄小报 手机方舟服务器不支持怎么办 完成服务器的迁移更换工作 滦州网络营销软件开发常见问题 宝山区网络技术服务生产厂家 网络安全的作文开头排比 5g网络安全风险报告 网络安全讲话稿 崇明区特定软件开发服务密度 考勤制度数据库 河源酒店线上点餐软件开发 怎么登录云服务器的秘钥 服务器厂商维修人员工资 廊坊哪里有软件开发公司电话 数据库管理技术人员能干什么 数据库修改列属性语句 学生网络安全培训总结报告 数据库期末复习题txt 怎么小桌面的软件开发 兰州智联网络技术有限公司 微型服务器是 黑马网络安全 运维视频 总体国家安全观有网络安全吗 网络安全法 国务院和 荆州订制软件开发中心 怎么登录云服务器的秘钥 黄斑变性数据库
0