实现方案
一、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注入后,再执行初始化
// 你的初始化逻辑
}
}五、实现 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("执行静态代码块")
}
}以上就是springboot启动时执行某些操作的8种方式的详细内容,更多关于springboot启动时执行某些操作的资料请关注代码网其它相关文章!
发表评论