SpringBoot项目启动前和中执行某段代码
第一种:@PostConstruct
此注解是JAVA自己代码提供的, spring实现了这个注解
该注解被用来修饰一个非静态的void()方法。
被修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行
该注解的方法在整个Bean初始化中的执行顺序:
Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
那么Java提供的@PostConstruct注解,Spring是如何实现的呢?
需要用到BeanPostProcessor这个接口, 子类扫描了这个注解之后进行处理
BeanPostProcessor有个实现类CommonAnnotationBeanPostProcessor,就是专门处理@PostConstruct @PreDestroy注解。
@Configuration
public class MyConfig_1 {
@PostConstruct
public void test() {
System.out.println("=======Service 1==========");
}
}
第二种 实现InitializingBean接口
本接口为spring初始化bean的接口, 如果自己继承了本接口, spring就会调用本实现类的重写方法
@Configuration
public class MyConfig_2 implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("======Service 2======");
}
}
第三种 实现BeanPostProcessor接口
BeanPostProcessor也称为Bean后置处理器,它是Spring中定义的接口,在Spring容器的创建过程中(具体为Bean初始化前后)会回调BeanPostProcessor中定义的两个方法, 记得要返回bean
@Configuration
public class MyConfig_3 implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("========Service 3==============");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
启动运行项目:(目前输出多次的Service3,) 会打印多次 就是会执行多次这段代码
第四种 在启动类run之前执行方法
这种方法不太可取!这在整个项目启动之前就会执行先于项目的启动, 最先执行
@SpringBootApplication
public class BeforRunDemoApplication {
public static void main(String[] args) {
System.out.println("=========Service 5==========");
SpringApplication.run(BeforRunDemoApplication.class, args);
}
}
四种方式的启动先后顺序
启动类前->BeanPostProcessor->@PostConstruct->InitializingBean
或者可以使用Bean的无参构造, 因为后三种都是在spring在实例化这个bean的时候执行的, 所以使用构造器也可以
值得注意的是第三种方式,他可以让实现类里的方法提前执行, 如果想让某一个比其他早执行时候 可以使用第三种的方式
下面两段代码会先输出Service4
@Configuration
public class MyConfig_1 {
@PostConstruct
public void test() {
System.out.println("=========Service 1=========");
}
}
@Configuration
public class MyConfig_4 implements BeanPostProcessor {
@PostConstruct
public void test(){
System.out.println("============Service 4========");
}
}
SpringBoot项目启动之后执行某个方法
在SpringBoot中,有两种接口方式实现启动执行,分别是ApplicationRunner和CommandLineRunner,除了可接受参数不同,其他的大同小异
第一种方式:ApplicationRunner
/**
* 继承Application接口后项目启动时会按照执行顺序执行run方法
* 通过设置Order的value来指定执行的顺序
*/
@Component
@Order(value = 1)
public class StartService implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(new Date());
}
}
第二种方式:CommandLineRunner
@Component
public class MyCommandLineRunner implements
CommandLineRunner,Ordered{
@Override
public int getOrder(){
return 1;//返回执行顺序
}
@Override
public void run(String... var1) throws Exception{
System.out.println(new Date());
}
}
我们也可以设置Order来设定执行的顺序,在上面两个代码中也有,分别是注解@Order(value = 1)和实现接口implements Ordered的方式