SpringBoot(二) 主程序详解和配置文件如何配置
SpringBoot主程序详解
1 /** 2 * @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用 3 */ 4 @SpringBootApplication 5 public class HelloWorldMainApplication { 6 7 public static void main(String[] args) { 8 9 // Spring应用启动起来 10 SpringApplication.run(HelloWorldMainApplication.class,args); 11 } 12 }
上段程序是一个SpringBoot主程序,入口方法。
@SpringBootApplication:Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication {}
@SpringBootConfiguration:Spring Boot的配置类,标注在某个类上,表示这是一个Spring Boot的配置类。
@EnableAutoConfiguration:开启自动配置功能。
@EnableAutoConfigurationImportSelector:导入哪些组件的选择器。将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中。有了自动配置类,免去了我们手动编写配置注入功能组件等的工作。
SpringBoot 配置
Spring Boot使用了一个全局的配置文件application.properties,放在src/main/resources目录下或者类路径的/config下。
Sping Boot的全局配置文件的作用:修改SpringBoot自动配置的默认值。SpringBoot在底层都会给我们自动配置好。
名称是固定的:application.properties 或者 application.yml
yml是YAML(YAML Ain’t Markup Language)语言。它是以数据为中心的语言,它比json、xml更适合做配置文件。
配置实例:
<!-- xml形式配置 --> <server> <port>8081</port> </server> <!-- properties形式配置 --> server.port=8081 <!-- yml形式配置 --> server: port: 8081
YML语法 自定义属性
1.基本语法
书写形式 k: v ==> 表示一对键值对(冒号和v之间的空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的。
属性值的英文大小写敏感。
server: port: 8081 path: /hello
2.字面量
普通的值(数字,字符串,布尔): k: v ==> v 直接编写数字,字符串,布尔等值。如果是字符串添加双引号,则不会进行转义。使用单引号会进行转义。
对象: k : v
friends:
lastName: zhangsan
age: 20
//也可以和ajax一样编写
friends: {lastName: zhangsan,age: 18}
数组(list、set等):
pets: - cat - dog - pig //或者 pets: [cat,dog,pig]
3.使用配置文件中的值
1 //配置文件 2 person: 3 lastName: hello 4 age: 18 5 boss: false 6 maps: {k1: 11,k2: 12} 7 list: 8 - lisi 9 - wangwu 10 dog: 11 name: 小狗 12 age: 12 13 14 15 16 /** 17 * 将配置文件中配置的每一个属性的值,映射到这个组件中 18 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定. 19 * prefix = "person":配置文件中哪个下面的所有属性进行一一映射 20 * 21 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能; 22 * 23 */ 24 @Component 25 @ConfigurationProperties(prefix = "person") 26 public class Person { 27 28 private String lastName; 29 private Integer age; 30 private Boolean boss; 31 private List<Object> list; 32 private Dog dog; 33 } 34 35 36 //pom.xml文件添加属性 37 <!--导入配置文件处理器,配置文件进行绑定就会有提示--> 38 <dependency> 39 <groupId>org.springframework.boot</groupId> 40 <artifactId>spring-boot-configuration-processor</artifactId> 41 <optional>true</optional> 42 </dependency>
还需要在spring Boot入口类加上@EnableConfigurationProperties并指明要加载哪个bean,如果不写ConfigBean.class,在建好的类那边添加。最后在Controller中引入ConfigBean使用即可。注意使用自动注入的注解。
在1.5的版本之后,需要添加@Configuration和@PropertySource(“classpath:xxxxxx.properties”)后才可以读取。
1 /** 2 * 将配置文件中配置的每一个属性的值,映射到这个组件中 3 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定; 4 * prefix = "person":配置文件中哪个下面的所有属性进行一一映射 5 * 6 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能; 7 * @ConfigurationProperties(prefix = "person")默认从全局配置文件中获取值; 8 * 9 */ 10 @PropertySource(value = {"classpath:person.properties"}) 11 @Component 12 @ConfigurationProperties(prefix = "person") 13 //@Validated 14 public class Person {}
4.使用配置文件生成随机数
在配置文件中${random} 可以用来生成各种不同类型的随机值,例如 生成 int 值、long 值或者 string 字符串。
secret=${random.value} number=${random.int} longnumber=${random.long} uuid=${random.uuid}
@Value和@Validated
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
配置文件yml还是properties他们都能获取到值。
书写形式: @Value("${配置文件中的key}")。注意key要全称。
例如:@Value("${person.age}"),@Value("${person.dog.name}")
计算: @Value("#{12*2}") ==> 对应的值就是24
数据校验:@Valiadated注解自动校验。
1 @Component 2 @ConfigurationProperties(prefix = "person") 3 @Validated 4 public class Person { 5 //lastName必须是邮箱格式 6 @Email 7 private String lastName; 8 //@Value("#{11*2}") 9 private Integer age; 10 //@Value("true") 11 private Boolean boss; 12 13 private Date birth; 14 private Map<String,Object> maps; 15 private List<Object> lists; 16 private Dog dog; 17 }
配置文件读取优先级
application.properties和application.yml文件可以放在一下四个位置:
- 外置,在相对于应用程序运行目录的/congfig子目录里。
- 外置,在应用程序运行的目录里
- 内置,在config包内
- 内置,在Classpath根目录
按照优先级排序,src/main/resources/config下application.properties覆盖src/main/resources下application.properties中相同的属性
另外,如果在相同优先级位置同时有application.properties和application.yml,那么application.yml里面的属性就会覆盖application.properties里的属性。
Profile多环境配置
当应用程序需要部署到不同运行环境时,一些配置细节通常会有所不同,尤其是开发过程中的开发环境和生产环境的配置文件。
如果按照以前的做法,就是每次发布的时候替换掉配置文件,这样太麻烦了,Spring Boot的Profile就给我们提供了解决方案,命令带上参数就搞定。
在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如: application-test.properties:开发环境 application-prod.properties:生产环境
想要使用对应的环境,只需要在application.properties中使用spring.profiles.active属性来设置,值对应上面提到的{profile},也就是上述代码的test、prod这2个。
server: port: 8081 spring: profiles: active: prod --- server: port: 8083 spring: profiles: test --- server: port: 8084 spring: profiles: prod #指定属于哪个环境