SpringBoot启动前中后三个时机执行自定义代码的方式。 学会直接原地起飞

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的方式

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值