springBoot学习(四)项目初始化的开始和结束
时间:2022-06-24
本文章向大家介绍springBoot学习(四)项目初始化的开始和结束,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
ApplicationContextInitializer接口
用来初始化Spring ConfigurableApplicationContext应用上下文的回调接口,是在ConfigurableApplicationContext.refresh()之前调用。 该接口典型的应用场景是web应用中需要编程方式对应用上下文做初始化。比如,注册属性源(property sources)或者针对上下文的环境信息environment激活相应的profile
代码实现
默认的application.properties文件(默认指定为生产环境)
test.name=default
spring.profiles.active=prd
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("-------初始化---------");
}
}
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
*/
@SpringBootApplication
public 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
*/
@SpringBootApplication
public 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可以获得传递的所有字符串
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- OpenGL ES for Android 深度测试
- OpenGL ES for Android 绘制旋转的地球
- [Hei.Captcha] Asp.Net Core 跨平台图形验证码实现
- Asp.Net Core 3.1 获取不到Post、Put请求的内容 System.NotSupportedException Specified method is not supported
- OpenGL ES for Android 播放视频
- Centos 7 在线安装 离线安装 最新 Docker-compose 的正确姿势 实践笔记
- OpenGL ES for Android 视频缩放、旋转、平移
- OpenGL ES for Android 相机预览
- OpenGL ES for Android 相机预览适配不同分辨率的手机
- Flutter Widgets 之 Container
- Flutter Widgets 之 Row和Column
- Flutter Widgets 之 SafeArea
- Flutter Widgets 之 Wrap
- Flutter Widgets 之 Expanded和Flexible
- 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践