在平时做项目的时候经常会用到一些配置文件的信息,那么spring boot是如何去加载这些配置文件,并且获取到相应的值呢?下面说一下我了解到的几种方式:
(1) 通用的environment类加载;
(2)通过@value注解的方式加载;
(3)通过创建配置信息类去加载配置文件信息;
一、通过environment类加载.properties文件
Environment是一个通用的读取应用程序运行时的环境变量的类,可以读出.properties,命令行输入参数,系统属性,操作系统环境变量等。该类的的bean会被spring自动注入。当程序要调用此类时,直接用@Autowired引入即可。比如我有一个spark.properties配置文件,如下:
# spark配置
spark.spark-home: you
spark.spark-name: wordCountLocal
spark.master: local
environment类可以通过key-value键值对的方式获取到配置文件信息,java代码如下:
@RestController
public class SparkController implements Serializable
{
private static final long serialVersionUID = 1L;
private static Logger logger = LoggerFactory.getLogger(SparkController.class);
// 引入Environment 依赖
@Autowired
private Environment environment;
@RequestMapping(value="/you/top10",method=RequestMethod.GET)
public Map<String, Object> calculateTopTen() {
logger.info("=================连接成功===================");
String appName = environment.getProperty("spark.spark-name");
System.out.println("==============输出的appName是============"+appName);
String master = environment.getProperty("spark.master");
System.out.println("==============输出的master是=============="+master);
return null;
}
}
启动spring boot主程序类,访问/you/top10地址,打印结果如下:
2019-06-15 14:57:00.227 INFO 101840 --- [nio-8081-exec-1] com.huaxia.zhike.spark.SparkController : =================连接成功===================
==============输出的appName是============wordCountLocal
==============输出的master是==============local
成功获取到配置文件的基本信息,需要注意的是: Environment类依赖的包是 org.springframework.core.env.Environment
我一开始引入包的时候就引入错误,运行出现了bug;
二、通过@value注解获取配置文件信息
1. 在有些时候,我们并不需要全局获取某个配置文件信息,比如在controller的某个类中单独获取配置信息,那么使用@value注解就很方便了。不过@value注解只能给普通变量注入值,给静态变量是不能注入值的,尽管给静态变量使用注解时,在编译和运行上不会报错,但是给变量注入的值为空。但是是有办法解决的,解决spring boot使用@value不能给静态变量赋值问题。
2.@value既可以读取.yml文件还可以读取.properties文件,并且经常和@PropertySource一起使用,但是有时候也不一定使用@PropertySource注解;那么什么时候用什么时候不用呢?下面来做下分析:
(1)如果.properties或者.yml文件是application命名的,不管是放在src/main/resources下还是src/main/resources的config目文件夹中,都是不用使用@PropertySource注解;
(2)反之,如果不是用application命名的,不管是放在src/main/resources下还是src/main/resources的config目文件夹中,都要使用@PropertySource注解;
3.@value的具体使用方法如下:
@Value("${my.name}")
private String myName;
如果需要用到 @PropertySource注解,将@PropertySource注解加到类上就可以了;java代码如下:
@RestController
@PropertySource(value ={"classpath:/config/spark.properties"})
public class SparkController implements Serializable
{
private static final long serialVersionUID = 1L;
private static Logger logger = LoggerFactory.getLogger(SparkController.class);
@Value("${spark.spark-name}")
private String appname;
@Value("${spark.master}")
private String master;
@RequestMapping(value="/you/top10",method=RequestMethod.GET)
public Map<String, Object> calculateTopTen() {
logger.info("=================连接成功===================");
System.out.println("==============appname============="+appname);
System.out.println("==============master============="+master);
return null;
}
}
打印结果如下:
2019-06-15 16:39:30.374 INFO 104704 --- [nio-8081-exec-1] com.huaxia.zhike.spark.SparkController : =================连接成功===================
==============appname=============wordCountLocal
==============master=============local
比如我们开发项目时常常会有几种环境,比如dev环境,test环境等等,不同的环境某些参数就会不一样,配置文件不一样,这个时候就会用到@value注解了,具体怎么使用自行百度吧!要勤动手
三、创建一个配置类使用@ConfigurationProperties注解实现
使用@ConfigurationProperties获取配置文件信息的话,前提要就上下面的依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
@ConfigurationProperties是springboot新加入的注解,主要用于配置文件中的指定键值对映射到一个java实体类上。需要注意的是,如果配置实体类上只是用这一个@ConfigurationProperties注解,是没有把实体类注入spring容器中的。@Component()和其一起使用可以实现注入。而且它还需要@PropertySource注解指定配置文件的路径,具体实现步骤如下:
1.创建配置实体类SparkContextBean
//加上注释@Component将此类注入到spring容器中,可以直接在其他地方使用@Autowired来创建其实例化对象
@Component("sparkConfig")
@PropertySource(value ={ "classpath:/config/spark.properties" }) // 加载文件的路径
@ConfigurationProperties(prefix = "spark") // 配置 文件的前缀
public class SparkContextBean implements Serializable
{
private static final long serialVersionUID = 1L;
private String sparkHome;
private String sparkName;
private String master;
public String getSparkHome()
{
return sparkHome;
}
public void setSparkHome(String sparkHome)
{
this.sparkHome = sparkHome;
}
public String getSparkName()
{
return sparkName;
}
public void setSparkName(String sparkName)
{
this.sparkName = sparkName;
}
public String getMaster()
{
return master;
}
public void setMaster(String master)
{
this.master = master;
}
@Override
public String toString()
{
return "SparkContextBean [sparkHome=" + sparkHome + ", sparkName=" + sparkName + ", master=" + master + "]";
}
}
2.将 SparkContextBean引入需要调用的类中,并且通过get或者set的方法获取配置文件的值,java 代码如下:
* @ClassName: SparkController
* @Description: spark 测试程序
* @author you
* @date 2019年6月12日
*
*/
@RestController
public class SparkController implements Serializable
{
private static final long serialVersionUID = 1L;
private static Logger logger = LoggerFactory.getLogger(SparkController.class);
@Autowired
private SparkContextBean sparkContextBean;
@RequestMapping(value="/you/top10",method=RequestMethod.GET)
public Map<String, Object> calculateTopTen() {
logger.info("=================连接成功===================");
System.out.println("====================sparkName==============="+sparkContextBean.getSparkName());
System.out.println("====================master==============="+sparkContextBean.getMaster());
return null;
}
}
以前是我总结的几种方法,有啥需要改正的地方,欢迎大家指出!