在真实项目开发过程中,我们经常会需要在程序启动时执行一些特定的业务操作,比如系统预热、系统初始化等。小编为大家介绍 9 种实现方式。
前言
在真实项目开发过程中,我们经常会需要在程序启动时执行一些特定的业务操作,比如系统预热、系统初始化等。小编为大家介绍 9 种实现方式。
实现方案
一、ApplicationRunner
1. 执行时机
SpringBoot 应用完全启动后。
2. 核心特点
实现 ApplicationRunner 接口,通过 ApplicationArguments 对象访问参数,可以更方便地解析命令行参数(例如获取--key=value形式的参数值)。
如果定义了多个Runner,可以使用 @Order 注解来控制他们的执行顺序,数值越小优先级越高。
3. 代码示例
@Component
@Order(1) // 执行顺序,可选
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
// 这里写你的启动执行逻辑,例如初始化缓存
// args 可以访问应用参数
}
}
二、CommandLineRunner
1. 执行时机
SpringBoot 应用完全启动后。
2. 核心特点
实现 CommandLineRunner 接口,通过 String... args 直接访问命令行原始参数数组。
如果定义了多个Runner,可以使用 @Order 注解来控制他们的执行顺序,数值越小优先级越高。
3. 代码示例
@Component
@Order(2) // 执行顺序,可选
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
// 这里写你的启动执行逻辑
// args 可以访问命令行原始参数
}
}
三、@PostConstruct 注解
1. 执行时机
Bean 初始化时,在对象依赖注入完成后执行。
2. 核心特点
注解在方法上,使用简单。
此时 Spring 容器可能还未完全初始化完毕,部分 Bean 可能尚未就绪,需注意可能的依赖问题。
3. 代码示例
@Component
public class MyInitBean {
@Autowired
private SomeRepository repository; // 假设的仓库类,用于数据访问
@PostConstruct
public void init() {
// 例如,在项目启动时从数据库加载数据到静态变量
List<SomeData> data = repository.findAll();
// ... 其他处理逻辑
}
}
四、实现 InitializingBean 接口
1. 执行时机
Bean 的全部属性被设置之后执行。
2. 核心特点
实现接口的 afterPropertiesSet 方法。
与 @PostConstruct 类似,都是 Bean 生命周期中的初始化方法。
3. 代码示例
@Component
public class MyInitializingBean implements InitializingBean {
@Autowired
private SomeDependency dependency;
@Override
public void afterPropertiesSet() throws Exception {
// 确保属性dependency注入后,再执行初始化
// 你的初始化逻辑
}
}
五、实现 InitializingBean 接口
1. 执行时机
Bean 的全部属性被设置之后执行。
2. 核心特点
实现接口的 afterPropertiesSet 方法。
与 @PostConstruct 类似,都是 Bean 生命周期中的初始化方法。
3. 代码示例
@Component
public class MyInitializingBeanimplementsInitializingBean {
@Autowired
private SomeDependency dependency;
@Override
publicvoidafterPropertiesSet()throws Exception {
// 确保属性dependency注入后,再执行初始化
// 你的初始化逻辑
}
}
六、实现 BeanPostProcessor 接口
1. 执行时机
在 Bean 的初始化前后执行。
2. 核心特点
实现接口的 postProcessBeforeInitialization 与 postProcessAfterInitialization 方法。
这个接口会影响所有的 bean 初始化。
3. 代码示例
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 在初始化之前执行的逻辑
System.out.println("Before Initialization: " + beanName);
return bean; // 返回bean本身或一个新的bean实例(可选)
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 在初始化之后执行的逻辑
System.out.println("After Initialization: " + beanName);
return bean; // 返回bean本身或一个新的bean实例(可选)
}
}
七、实现 BeanFactoryPostProcessor 接口
1. 执行时机
在 Spring 容器初始化时执行,此时容器中所有的 Bean 定义已经加载完,但是 Bean 的实例还未创建。
2. 核心特点
实现接口的 postProcessBeanFactory 方法。
这个接口只会执行一次,执行时机早于 BeanPostProcessor 。
3. 代码示例
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("******************** MyBeanFactoryPostProcessor#postProcessBeanFactory ****************");
System.out.println("******************** bean的数量:[{}] ****************", beanFactory.getBeanDefinitionCount());
BeanDefinition userBeanDef = beanFactory.getBeanDefinition("student");
// 修改bean definition属性信息
}
}
八、实现 ServletContextListener 接口
1. 执行时机
Web 应用启动初期,在初始化任何过滤器或 Servlet 时或者销毁 Web 容器时执行。
2. 核心特点
实现接口的 contextInitialized 和 contextDestroyed 方法。
适用于 Web 环境,监听 Servlet 上下文。
3. 代码示例
@Component
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// 在这里写Web应用启动时的逻辑
// 例如,初始化一些Web应用级别的资源
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// 在这里写Web应用关闭时的清理逻辑
}
}
九、static 静态代码块
1. 执行时机
类被加载时执行。
2. 核心特点
仅仅是类被加载时,Bean 还未被创建。
3. 代码示例
@Component
public class MyClass {
static {
System.out.println("执行静态代码块")
}
}
AI大模型学习福利
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量
3554

被折叠的 条评论
为什么被折叠?



