springboot启动配置原理, 事件监听机制,自定义starter

事件监听机制

配置在META-INF/spring.factories
ApplicationContextInitializer
SpringApplicationRunListener

只需要放在ioc容器中即可
ApplicationRunner
CommandLineRunner

执行顺序是:
1、SpringApplicationRunListener 开始准备环境
2、ApplicationContextInitializer 进行初始化
3、SpringApplicationRunListener监听初始化中的状态
4、ApplicationRunner
5、CommandLineRunner

public class HelloApplicationContextInitializer implements ApplicationContextInitializer <ConfigurableApplicationContext>{
    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        System.out.println("HelloApplicationContextInitializer......"+configurableApplicationContext);
    }
}
public class HelloSpringApplicationRunListener implements SpringApplicationRunListener {
//没有无参构造器,所以要有参。
 public HelloSpringApplicationRunListener(SpringApplication application, String[] args) {
		//可以在此保存需要的数据
    }
    @Override
    public void starting() {
        System.out.println("SpringApplicationRunListener...starting...");
    }

    @Override
    public void environmentPrepared(ConfigurableEnvironment environment) {
        Object o = environment.getSystemProperties().get("os.name");
        System.out.println("SpringApplicationRunListener...environmentPrepared..."+o);
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        //ioc容器已准备好
        System.out.println("SpringApplicationRunListener...contextPrepared...");
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println("SpringApplicationRunListener...contextLoaded...");
    }

    @Override
    public void started(ConfigurableApplicationContext context) {

    }

    @Override
    public void running(ConfigurableApplicationContext context) {

    }

    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {

    }
}

SpringApplicationRunListener,ApplicationContextInitializer这两个需要配置在文件中,在resources下建文件夹META-INF,创建文件spring.factories,然后写上下面的配置

//  \ 斜杠代表换行
org.springframework.context.ApplicationContextInitializer=\
com.example.mytest.listener.HelloApplicationContextInitializer
org.springframework.boot.SpringApplicationRunListener=\
com.example.mytest.listener.HelloSpringApplicationRunListener

ApplicationRunner,CommandLineRunner这2个只需要加入容器中即可,配置注解@Component

@Component
public class HelloApplicationRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("ApplicationRunner....");
    }
}
@Component
public class HelloCommandLineRunner implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("CommandLineRunner...."+ Arrays.asList(args));
    }
}

自定义starter

starter:
1)、这个场景需要使用到的依赖是什么?
2)、如何编写自动配置

@Configuration //指定这个类是一个配置类
@ConditionalOnXXX //在指定条件成立的情况下自动配置类生效
@AutoConfigureAfter //指定自动配置类的顺序
@ConfigurationProperties //结合相关xxxProperties类来绑定相关的配置
@EnableConfigurationProperties //让xxxProperties生效并加入到容器中
@Bean //给容器中添加组件
自动配置类要能加载
将需要启动就加载的自动配置类,配置在META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\

3、模式
启动器(starter),启动器模块是一个空jar文件,仅提供辅助性依赖管理,这些依赖可能用于自动装配或者其他类库
自定义命名空间
后缀:-spring-boot-starter
模式:模块-spring-boot-starter
举例:mybatis-spring-boot-starter
启动器只用来做依赖导入;
专门来写一个自动配置模块;
启动器依赖自动配置;别人只需要引入启动器
自定义启动器开发步骤:
1、创建一个工程
2、在工程里新建2个模块,一个是maven的普通模块,一个是springboot模块
普通模块:用于启动器依赖
springboot模块:用于自定义配置的自动配置逻辑代码的编写

//普通模块 pom.xml
 <!--启动器-->
    <dependencies>
        <!--引入自动配置模块-->
        <dependency>
            <groupId>com.jason</groupId>
            <artifactId>wang-autoconfigurer</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
    //springboot模块 自动配置模块
    <dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
	</dependencies>

自动配置模块代码举例

@ConfigurationProperties(prefix = "com.jason")
public class HelloProperties {
    private String prefix;
    private String suffix;
//省略
}
public class HelloService {
    HelloProperties helloProperties;
    public HelloProperties getHelloProperties() {
        return helloProperties;
    }
    public void setHelloProperties(HelloProperties helloProperties) {
        this.helloProperties = helloProperties;
    }
    //处理逻辑
    public String sayHelloJason(String name){
        return helloProperties.getPrefix() + "_" + name + helloProperties.getSuffix();
    }
}
//自动配置类
@Configuration
@ConditionalOnWebApplication //web应用才生效
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {
    @Autowired
    HelloProperties helloProperties;

    @Bean
    public HelloService helloService(){
        HelloService service = new HelloService();
        service.setHelloProperties(helloProperties);
        return service;
    }
}

然后把自动配置类,配置到文件中,在resources下建立META-INF文件夹,建文件spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.jason.wangautoconfigurer.HelloServiceAutoConfiguration

然后打包安装到maven库
首先选择自动配置模块中maven的lifecycle- install,执行
再执行普通模块中maven的lifecycle- install
然后就可以在其他项目中引入使用

//普通模块中的groupid  artifactid
<dependency>
			<groupId>com.jason</groupId>
			<artifactId>wang-spring-boot-starter</artifactId>
			<version>1.0-SNAPSHOT</version>
</dependency>
发布了31 篇原创文章 · 获赞 1 · 访问量 5676

猜你喜欢

转载自blog.csdn.net/wjs040/article/details/94620994
今日推荐