Spring Boot 中初始化资源的方式,你知道几种?
作者:小破孩楼主
来源:cnblogs.com/zouhong/p/14415713.html
CommandLineRunner
定义初始化类 MyCommandLineRunner
实现 CommandLineRunner
接口,并实现它的run()
方法,在该方法中编写初始化逻辑注册成Bean,添加 @Component
注解即可示例代码如下:
package cn.zh.controller;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Componentpublic class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("项目初始化---------------11");
}
}
package cn.zh;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ProcApplication {
public static void main(String[] args) {
System.out.println("...start SpringApplication.run");
SpringApplication.run(ProcApplication.class,args);
System.out.println("....end SpringApplication.run");
}
}
ApplicationRunner
定义初始化类 MyApplicationRunner
实现 ApplicationRunner
接口,并实现它的run()
方法,在该方法中编写初始化逻辑注册成Bean,添加 @Component
注解即可示例代码如下:
package cn.zh.controller;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("项目初始化二---------");
}
}
run()
方法中自带的形参不相同,在 CommandLineRunner 中只是简单的String... args
形参,而 ApplicationRunner 则是包含了 ApplicationArguments 对象,可以帮助获得更丰富的项目信息。@Order
ApplicationRunner
接口的初始化类,又有实现了 CommandLineRunner
接口的初始化类,那么会是哪一个先执行呢?测试告诉我们,答案是实现了 ApplicationRunner
接口的初始化类先执行,我想这点倒是不需要大家过分去关注为什么。但如果需要改变两个初始化类之间的默认执行顺序,那么使用 @Order
注解就可以帮助我们解决这个问题。@Component
@Order(1)
public class MyCommandLineRunner implements CommandLineRunner {
/**
* Callback used to run the bean.
*
* @param args incoming main method arguments
* @throws Exception on error
*/
@Override
public void run(String... args) throws Exception {
System.out.println("项目初始化---------------11");
}
}
@Component
@Order(2)
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("项目初始化二---------");
}
@PostConstruct
public void init(){
System.out.println("@PostConstruct初始化");
}
}
@PostConstruct
@PostConstruct
注解同样可以帮助我们完成资源的初始化操作,前提是这些初始化操作不需要依赖于其它Spring beans的初始化工作。@PostConstruct
注解是用在方法上的,写一个方法测试一下吧。@PostConstruct
public void init(){
System.out.println("@PostConstruct初始化");
}
注意:
只有一个非静态方法能使用此注解 被注解的方法不得有任何参数 被注解的方法返回值必须为void 被注解方法不得抛出已检查异常 此方法只会被执行一次 综上,使用
@PostConstruct
注解进行初始化操作的顺序是最快的,前提是这些操作不能依赖于其它Bean的初始化完成。通过添加@Order
注解,我们可以改变同层级之间不同Bean的加载顺序。
InitializingBean
@Component
public class MyListener1 implements InitializingBean {
@Autowired
private ShopInfoMapper shopInfoMapper;
@Override
public void afterPropertiesSet() {
//使用spring容器中的bean
//System.out.println(shopInfoMapper.selectById("1").getShopName());
System.out.println("项目启动OK");
}
}
ApplicationListener
@Component
public class MyListener1 implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
//打印出每次事件的名称
System.out.println(applicationEvent.toString());
if (applicationEvent instanceof ApplicationReadyEvent) {
System.out.println("项目启动OK");
}
}
}
推荐阅读:
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
朕已阅