事件监听机制
配置在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>