Spring Boot外部配置属性注入
一、命令行参数配置
Spring Boot可以是基于jar包运行的,打成jar包的程序可以直接通过命令运行:java -jar xx.jar
那么就可以通过命令行改变相关配置参数。例如默认tomcat端口8080,那么通过命令行可以进行修改,如下:
java -jar xx.jar --server.port=9090
二、属性注入
1、属性注入常用注解:
2、常规属性配置@Value,以c3p0访问数据库为例说明:
1)引入数据源依赖
2)application.properties增加数据源配置
3)Java配置数据源
Java配置通过@Configuration和@Bean实现。前置声明当前类是一个配置类,相当于一个Spring配置的xml文件,后者注解在方法上,声明当前方法的返回值为一个Bean。
数据源配置使用Spring中的@Value注解对每个属性进行注入,通过@Bean添加到容器中。
4)测试数据源是否成功添加
测试结果:
这个本质就是Spring使用@Value进行属性注入的操作(参考Spring EL和资源调用中基于配置文件部分)。那么Spring Boot有什么改进呢? 使用@ConfigurationProperties。
3、类型安全的属性配置@ConfigurationProperties
@Value注入每个配置在实际项目中会显得格外麻烦,因为配置有许多。Spring Boot通过@ConfigurationProperties将properties属性和一个Bean及其实现关联,实现类型安全的配置。改变如下:
1)application.propterties配置修改
2)数据源配置:
注意@Bean以上部分,删除了@Value相关部分,添加了getter/setter方法(这个必须有)。同时重点关注属性名与properties中保持一致。(默写情况下可以不一致,涉及松散绑定,有机会另外写笔记)。
3)测试部分同常规属性注入,测试结果一样。
4、第三方属性配置
我们查看@ConfigurationProperties注解实现,如下:
可知其除了可以注解类外,还可以在方法上进行注解。那么方法上有什么妙用呢?其与@Bean配合使用,可以将属性绑定到控件之外的第三方组件上。
实操:
1)建一个第三方组件
2)application.properties文件赋值
3)配置类,@Bean的同时直接赋值
4)测试
测试结果如下:
通过以上两例通过@ConfigurationProperties,对于待输入属性均必须有getter/setter方法。可以猜测对该注解Spring Boot应该使用了内省或反射机制。