ApplicationContextInitializer接口
用来初始化Spring ConfigurableApplicationContext应用上下文的回调接口,是在ConfigurableApplicationContext.refresh()以前调用。该接口典型的应用场景是web应用中须要编程方式对应用上下文作初始化。好比,注册属性源(property sources)或者针对上下文的环境信息environment激活相应的profilejava
代码实现
默认的application.properties文件(默认指定为生产环境)
test.name=defaultspring.profiles.active=prd
web
spring
application-dev.properties文件
test.name=dev
编程
application-prd.properties文件
test.name=prd
微信
自定义MyApplicationContextInitializer实现ApplicationContextInitializer接口,重写initialize方法
package com.yxj.spring.Initializer;import com.yxj.spring.SpringBootTestRun;import org.springframework.context.ApplicationContextInitializer;import org.springframework.context.ConfigurableApplicationContext;/** * @ProjectName: springBootDemo * @Package: com.yxj.spring.Initializer * @Description: * @Author: 阿杰 * @CreateDate: 2019/1/25 22:39 * @UpdateUser: 暂无 * @UpdateDate: 2019/1/25 22:39 * @UpdateRemark: The modified content * @Version: 1.0 */public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { /** * 1.springBoot执行ApplicationContextInitializer refresh方法以前会先执行 * 2.在方法中设置活动配置文件为dev(该结果能够从其余途径去获取,这里给定默认值dev) * 3.在启动类最后获取name,查看最终结果 * @param applicationContext */ @Override public void initialize(ConfigurableApplicationContext applicationContext) { applicationContext.getEnvironment().setActiveProfiles("dev"); System.out.println("-------初始化---------"); }}
app
ide
svg
测试
flex
springBoot启动类
package com.yxj.spring;import com.yxj.spring.Initializer.MyApplicationContextInitializer;import com.yxj.spring.monitor.MyApplicationListener;import com.yxj.spring.monitor.MyEvent;import com.yxj.spring.properties.TestProperties;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ApplicationContextInitializer;import org.springframework.context.ApplicationListener;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.Import;import java.util.List;/** * @ProjectName: springBootDemo * @Package: com.yxj.spring * @Description: * @Author: 阿杰 * @CreateDate: 2019/1/18 20:18 * @UpdateUser: 暂无 * @UpdateDate: 2019/1/18 20:18 * @UpdateRemark: The modified content * @Version: 1.0 */@SpringBootApplicationpublic class SpringBootTestRun { @Value("${test.name}") private String testName; /** * 添加初始化类方式 * 1.springBootTestRun.addInitializers(new MyApplicationContextInitializer()); * 2.经过配置项来指定(context.initiallzer.classes=com.yxj.spring.Initializer.MyApplicationContextInitializer) * 3.spring.factories机制 * 应用: * 当外部程序装配这个模块的时候,就能经过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入 * 在平常工做中,咱们可能须要实现一些SDK或者Spring Boot Starter给被人使用,这个使用咱们就可使用Factories机制。 * Factories机制可让SDK或者Starter的使用只须要不多或者不须要进行配置,只须要在服务中引入咱们的jar包。 * 详细使用参考:http://blog.51cto.com/13836814/2134630 * * @param args */ public static void main(String[] args) { SpringApplication springBootTestRun = new SpringApplication(SpringBootTestRun.class); //springBootTestRun.addInitializers(new MyApplicationContextInitializer()); ConfigurableApplicationContext run = springBootTestRun.run(args); SpringBootTestRun bean = run.getBean(SpringBootTestRun.class); System.out.println("------------分割线------------"); System.out.println(bean.testName); run.close(); }}
测试结果
-------初始化---------------------分割线------------dev
CommandLineRunner和ApplicationRunner接口
CommandLineRunner、ApplicationRunner 接口是在容器启动成功后的最后一步回调。若是但愿在项目启动完成以前,初始化一些操做,可使用这两个接口。
实现
实现CommandLineRunner或者ApplicationRunner接口
实现run方法
经过@Component或者其余方式添加到spring容器管理中
能够实现多个,经过@Order(value = XXX)的方式,能够实现排序
CommandLineRunner接口
第一个CommandLineRunner
package com.yxj.spring.runner;import org.springframework.boot.CommandLineRunner;import org.springframework.core.annotation.Order;import org.springframework.stereotype.Component;import java.util.Arrays;/** * @ProjectName: springBootDemo * @Package: com.yxj.spring.runner * @Description: * @Author: 阿杰 * @CreateDate: 2019/1/25 23:10 * @UpdateUser: 暂无 * @UpdateDate: 2019/1/25 23:10 * @UpdateRemark: The modified content * @Version: 1.0 */@Component@Order(value = 4)public class MyCommandLineRunner1 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("order value is 4 。MyCommandLineRunner1 run. get args : "+Arrays.asList(args)); }}
第二个CommandLineRunner
package com.yxj.spring.runner;import org.springframework.boot.CommandLineRunner;import org.springframework.core.annotation.Order;import org.springframework.stereotype.Component;import java.util.Arrays;/** * @ProjectName: springBootDemo * @Package: com.yxj.spring.runner * @Description: * @Author: 阿杰 * @CreateDate: 2019/1/25 23:10 * @UpdateUser: 暂无 * @UpdateDate: 2019/1/25 23:10 * @UpdateRemark: The modified content * @Version: 1.0 */@Component@Order(value = 1)public class MyCommandLineRunner2 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("order value is 1 。MyCommandLineRunner2 run. get args : "+Arrays.asList(args)); }}
第一个ApplicationRunner
package com.yxj.spring.runner;import org.springframework.boot.ApplicationArguments;import org.springframework.boot.ApplicationRunner;import org.springframework.core.annotation.Order;import org.springframework.stereotype.Component;/** * @ProjectName: springBootDemo * @Package: com.yxj.spring.runner * @Description: * @Author: 阿杰 * @CreateDate: 2019/1/25 23:27 * @UpdateUser: 暂无 * @UpdateDate: 2019/1/25 23:27 * @UpdateRemark: The modified content * @Version: 1.0 */@Component@Order(value = 3)public class MyApplicationRunner1 implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { for(String argsString :args.getOptionNames()){ System.out.println("order value is 3 。MyApplicationRunner1 is ApplicationArguments key : ("+argsString + ") ApplicationArguments value : ("+args.getOptionValues(argsString)+")"); } }}
第二个ApplicationRunner
package com.yxj.spring.runner;import org.springframework.boot.ApplicationArguments;import org.springframework.boot.ApplicationRunner;import org.springframework.core.annotation.Order;import org.springframework.stereotype.Component;/** * @ProjectName: springBootDemo * @Package: com.yxj.spring.runner * @Description: * @Author: 阿杰 * @CreateDate: 2019/1/25 23:27 * @UpdateUser: 暂无 * @UpdateDate: 2019/1/25 23:27 * @UpdateRemark: The modified content * @Version: 1.0 */@Component@Order(value = 2)public class MyApplicationRunner2 implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { for(String argsString :args.getOptionNames()){ System.out.println("order value is 2 。MyApplicationRunner2 is ApplicationArguments key : ("+argsString + ") ApplicationArguments value : ("+args.getOptionValues(argsString)+")"); } }}
springBoot测试启动类
package com.yxj.spring;import com.yxj.spring.Initializer.MyApplicationContextInitializer;import com.yxj.spring.monitor.MyApplicationListener;import com.yxj.spring.monitor.MyEvent;import com.yxj.spring.properties.TestProperties;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.CommandLineRunner;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ApplicationContextInitializer;import org.springframework.context.ApplicationListener;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.Import;import java.util.List;/** * @ProjectName: springBootDemo * @Package: com.yxj.spring * @Description: * @Author: 阿杰 * @CreateDate: 2019/1/18 20:18 * @UpdateUser: 暂无 * @UpdateDate: 2019/1/18 20:18 * @UpdateRemark: The modified content * @Version: 1.0 */@SpringBootApplicationpublic class SpringBootTestRun { @Value("${test.name}") private String testName; public static void main(String[] args) { SpringApplication springBootTestRun = new SpringApplication(SpringBootTestRun.class); ConfigurableApplicationContext run = springBootTestRun.run("测试1","测试2","--key1=测试3","--key2=测试4"); run.close(); }}
测试结果
order value is 1 。MyCommandLineRunner2 run. get args : [测试1, 测试2, --key1=测试3, --key2=测试4]order value is 2 。MyApplicationRunner2 is ApplicationArguments key : (key1) ApplicationArguments value : ([测试3])order value is 2 。MyApplicationRunner2 is ApplicationArguments key : (key2) ApplicationArguments value : ([测试4])order value is 3 。MyApplicationRunner1 is ApplicationArguments key : (key1) ApplicationArguments value : ([测试3])order value is 3 。MyApplicationRunner1 is ApplicationArguments key : (key2) ApplicationArguments value : ([测试4])order value is 4 。MyCommandLineRunner1 run. get args : [测试1, 测试2, --key1=测试3, --key2=测试4]
对比
两个都是在容器启动成功后的最后一步回调
CommandLineRunner的参数是最原始的参数,没有作任何处理。ApplicationRunner的参数是ApplicationArguments,是对原始参数作了进一步的封装。
ApplicationRunner只对--key=value这种形式作解析,CommandLineRunner能够得到传递的全部字符串
长按识别二维码,了解更多
扫描二维码加入技术交流群!
本文分享自微信公众号 - 乱敲代码(lqcoder)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。