目录
- 实现方案
- 一、ApplicationRunner
- 1. 执行时机
- 2. 核心特点
- 3. 代码示例
- 二、CommandLineRunner
- 1. 执行时机
- 2. 核心特点
- 3. 代码示例
- 三、@PostConstruct 注解
- 1. 执行时机
- 2. 核心特点
- 3. 代码示例
- 四、实现 InitializingBean 接口
- 1. 执行时机
- 2. 核心特点
- 3. 代码示例
- 五、实现 BeanPostProcessor 接口
- 1. 执行时机
- 2. 核心特点
- 3. 代码示例
- 六、实现 BeanFactoryPostProcessor 接口
- 1. 执行时机
- 2. 核心特点
- 3. 代码示例
- 七、实现 ServletContextListener 接口
- 1. 执行时机
- 2. 核心特点
- 3. 代码示例
- 八、static 静态代码块
- 1. 执行时机
- 2. 核心特点
- 3. 代码示例
实现方案
一、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 { // 确保属性dewww.devze.compendency注入后,再执行初始化 // 你的初始化逻辑 } }
五、实现 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实例(可选) } }
六、实现 BeanFactoryPostProcesspythonor 接口
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 还未被创建。android
3. 代码示例
@Component public class MyClass { static { System.http://www.devze.comout.println("执行静态代码块") } }
以上就是SpringBoot启动时执行某些操作的8种方式的详细内容,更多关于SpringBoot启动时执行某些操作的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论