Spring Boot(十二)扩展分析 Initializer 和 Runner

 1.Spring容器执行refreshed之前的回调


    1.ApplicationContextInitializer 接口


        1.使用步骤


            1.写一个类,实现ApplicationContextInitializer接口

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("bean count="+applicationContext.getBeanDefinitionCount());
    }
}

            2.注册ApplicationContextInitializer


        2.注册方法


            0.直接纳入到Spring容器中,不能实现注册
                如 使用 @Component 注解
            1.SpringApplication.addInitializers

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication app=new SpringApplication(App.class);
        app.addInitializers(new MyApplicationContextInitializer());
        ConfigurableApplicationContext context=app.run(args);
        context.close();
    }
}

            2.通过配置项context.initializer.classes 指定,可以指定多个 ,用逗号 隔开
                在 application.properties 配置文件中 添加 context.initializer.classes=实现pplicationContextInitializer的类的全局名称 


(如:context.initializer.classes=com.edu.spring.springboot.SpringBoot12_ExtendAnalysis.MyApplicationContextInitializer)

            3.可以通过spring.factories机制(这次listener监听器,也可以使用这种方法)
                1.新创建一个maven项目
                2.创建ApplicationContextInitializer 的实现类
                3.在 resources/META-INF/spring.factories 里 
                    添加 ApplicationContextInitializer的全局名称=ApplicationContextInitializer 实现类的全局名称


(如:org.springframework.context.ApplicationContextInitializer=com.edu.spring.initializer.EchoApplicationContextInitializer)


                4.通过maven把新建的项目的依赖添加到旧的项目里

 2.pring容器启动成功后紧接着执行的回调


    1.CommandLineRunner/ApplicationRunner 接口


        1.使用步骤


            1.写一个类,实现CommandLineRunner/ApplicationRunner
                
            2.把该类纳入到Spring容器的管理之中

        2.注意:可以使用 @Order() 注解 或 Order接口 来控制执行顺序 。数值越小,越先执行

@Order(1)
@Component
public class ServiceSuccessReport implements CommandLineRunner{}

        3.CommandLineRunner/ApplicationRunner 区别


            1.区别在于参数不一样
                1.CommandLineRunner的参数是最原始的参数,没有做任何处理
                2.ApplicationRunner的参数是ApplicationArguments,是对原始数据做了进一步的封装
                    1.ApplicationArguments是对参数(main方法)做了进一步处理
                    2.可以解析--name=value的启动参数,我们可以通过name来获取value

@Component
public class StartedApplicationRunner implements ApplicationRunner {
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("name  value=" + args.getOptionValues("name"));
    }
}

猜你喜欢

转载自blog.csdn.net/lzj470612639/article/details/81410838