>

Springboot使用一个全局的配置文件,决定配置哪些

- 编辑:澳门博发娱乐官网 -

Springboot使用一个全局的配置文件,决定配置哪些

1、配置文件里到底都能写哪些属性?

配置文件能配置的属性参照

PS:这些东西都随用随查,没人能把全部都记下来。

图片 1

从其他框架来看 我们都有自己的配置文件, hibernate有hbm,mybatis 有properties, 同样, Spring boot 也有全局配置文件。

在之前我们分析SpringBoot的自动化配置原理的时候,分析了freemarker的自动化配置类FreeMarkerAutoConfiguration,这个自动化配置类需要classloader中的一些类需要存在并且在其他的一些配置类之后进行加载。

首先,我们来简单统计一下SpringBoot核心工程的源码java文件数量:

1、@SpringBootApplication

@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 {}

PS:自动配置全靠@EnableAutoConfiguration注解

←←←←←←←←←←←← 快!点关注

Springboot使用一个全局的配置文件,而且配置文件的名字是固定的。 有两种

但是还存在一些自动化配置类,它们需要在使用一些注解开关的情况下才会生效。比如spring-boot-starter-batch里的@EnableBatchProcessing注解、@EnableCaching等。

我们cd到spring-boot-autoconfigure工程根目录下。执行

2、@EnableAutoConfiguration

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import({EnableAutoConfigurationImportSelector.class})public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class<?>[] exclude() default {}; String[] excludeName() default {};}

PS:@Import({EnableAutoConfigurationImportSelector.class})引入了一个类,这个类负责加载注入哪些配置。

相信接触过 SpringBoot 的朋友都知道 SpringBoot 有各种 starter 依赖,想要什么直接勾选加进来就可以了。想要自定义的时候就直接在配置文件写自己的配置就好。但你们有没有困惑,为什么 SpringBoot 如此智能,到底配置文件里面能写什么呢?

  • application.properties
  • application.yml

在分析这些开关的原理之前,我们来看一个需求:

$ tree | grep -c .java$

3、EnableAutoConfigurationImportSelector

@Deprecatedpublic class EnableAutoConfigurationImportSelector extends AutoConfigurationImportSelector {}

PS:可以发现:

1、没任何卵用,其实不然,用途在父类里。一会我们看下。

2、被丢弃了,是因为SpringBoot2.0版本已经用其他类代替此类了,代码都差不多。

带着这个疑问,我翻了下 SpringBoot 官网看到这么一些配置样例:

springboot 配置文件的作用是用来 修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好; 像我们Tomcat 启动 默认配置端口是8080 . 如果要修改, 我们就在这两个文件的一种中来修改,

定义一个Annotation,让使用了这个Annotaion的应用程序自动化地注入一些类或者做一些底层的事情。
模块 java文件数
spring-boot 551
spring-boot-actuator 423
spring-boot-autoconfigure 783
spring-boot-devtools 169
spring-boot-cli 180
spring-boot-tools 355

4、AutoConfigurationImportSelector

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware,BeanFactoryAware, EnvironmentAware, Ordered { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return NO_IMPORTS; } try { AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader .loadMetadata(this.beanClassLoader); AnnotationAttributes attributes = getAttributes(annotationMetadata); List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); configurations = removeDuplicates(configurations); configurations = sort(configurations, autoConfigurationMetadata); Set<String> exclusions = getExclusions(annotationMetadata, attributes); checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations = filter(configurations, autoConfigurationMetadata); fireAutoConfigurationImportEvents(configurations, exclusions); return configurations.toArray(new String[configurations.size; } catch (IOException ex) { throw new IllegalStateException; } }}

重点看如下:

List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);return configurations.toArray(new String[configurations.size;

PS:大概意思就是读取出一个配置集合,并将此集合返回。

getCandidateConfigurations()方法

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { List<String> configurations = SpringFactoriesLoader.loadFactoryNames( getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader; Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you " + "are using a custom packaging, make sure that file is correct."); return configurations;}

图片 2SpringBoot 配置样例

- YML (也叫YAML : YAM Ain't Markup Language)

YAML Ain't Markup Language 这是一个递归写法 ;

  1. YAMLA Markup Language:是一个标记语言
  2. YAMLisn't Markup Language:不是一个标记语言;

标记语言:

我们以前用的配置文件,大多都使用 xxxx.xml 文件 ;

YAML : 是一种以数据为中心的配置文件, 比json,xml 等更适合做配置文件

举个栗子:

以 修改端口为例 : yml : server:  port: 8081
xml :<server>    <port>8081</port></server>
xml 配置 将太多的浪费在了标签上面。

我们会使用Spring提供的@Import注解配合一个配置类来完成。

我们可以看到有783个java文件。spring-boot核心工程有551个java文件。从上面的java文件数量大致可以看出,SpringBoot技术框架的核心组成部分:

loadFactoryNames()方法

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) { String factoryClassName = factoryClass.getName(); try { Enumeration ex = classLoader != null?classLoader.getResources("META-INF/spring.factories"):ClassLoader.getSystemResources("META-INF/spring.factories"); ArrayList result = new ArrayList(); while(ex.hasMoreElements { URL url = ex.nextElement(); Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource; String factoryClassNames = properties.getProperty(factoryClassName); result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames))); } return result; } catch (IOException var8) { throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() + "] factories from location [" + "META-INF/spring.factories" + "]", var8); }}

PS:可以发现:

1、扫描所有jar包类路径下的META-INF/spring.factories文件。

2、把这些文件里的内容遍历包装成properties对象。

3、从properties对象里获取EnableAutoConfiguration.class类对应的值,然后把它们添加在容器中。(很明显了,只有key是EnableAutoConfiguration.class类的才会放到list中)

[图片上传失败...(image-9e7ece-1527478594104)]

我们先看第一个jar包下的META-INF/spring.factories文件。

# PropertySource Loadersorg.springframework.boot.env.PropertySourceLoader=org.springframework.boot.env.PropertiesPropertySourceLoader,org.springframework.boot.env.YamlPropertySourceLoader# Run Listenersorg.springframework.boot.SpringApplicationRunListener=org.springframework.boot.context.event.EventPublishingRunListener………………

没有key为EnableAutoConfiguration.class类的

我们再来看第二个jar包下的META-INF/spring.factories

[图片上传失败...(image-8307e-1527478594104)]

我们可以发现如下:

# Auto Configureorg.springframework.boot.autoconfigure.EnableAutoConfiguration=org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration

每一个这样的xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置。

发现 SpringBoot 可配置的东西非常多,上图只是节选。有兴趣的查看这个网址:

yml 基本语法:

k:v:表示一对键值对;

以 空格 的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的

server:    port: 8081    path: /hello

属性和值也是大小写敏感;

值的写法:

  • ### 字面量:普通的值(数字,字符串,布尔)

k: v:字面直接来写;

字符串默认不用加上单引号或者双引号;

"":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思

    name:   "zhangsan n lisi":输出;zhangsan 换行  lisi

'':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据

name:   ‘zhangsan n lisi’:输出;zhangsan n  lisi
  • ### 对象、Map:

k: v:在下一行来写对象的属性和值的关系;注意缩进

​对象还是k: v的方式

friends:lastName: zhangsanage: 20行内写法:friends: {lastName: zhangsan,age: 18}
  • ###   数组:

用 - 值表示数组中的一个元素

pets: - cat - dog - pig

行内写法
pets: [cat,dog,pig]
  • ###   配置文件注入

我们以一个最简单的例子来完成这个需求:定义一个注解EnableContentService,使用了这个注解的程序会自动注入ContentService这个bean。

spring-boot-autoconfigurespring-bootspring-boot-tools

5、小结

大概流程我们已经搞明白了,我们知道最终是由org.springframework.boot:spring-boot-autoconfigure:1.5.10.RELEASE里的META-INF/spring.factories决定配置哪些类。

那我们还不知道到底是怎么自动配置的那些类的,下面我们来举个例子:

这里我拿之前创建过的 SpringBoot 来举例讲解 SpringBoot 的自动配置原理,首先看这么一段代码:

图片 3

javaBean :

图片 4

可以导入配置文件处理器依赖,以后编写配置就会有代码提示;

图片 5

代码展示配置文件注入属性值 :

 1 package com.example.webservice.bean; 2  3 import org.springframework.boot.context.properties.ConfigurationProperties; 4 import org.springframework.stereotype.Component; 5  6 import java.util.Date; 7 import java.util.List; 8 import java.util.Map; 9 10 /**11  *12  * ConfigurationProperties(prefix ="person") 将本类中的所有属性和配置文件中的相关配置进行绑定13  * prefix ="person  表示对哪个文件进行绑定14  * Component 表示这是一个容器, 只有在容器中  ConfigurationProperties 才能使用15 */16 @Component17 @ConfigurationProperties(prefix = "person")18 public class Person {19 20      private String name;21      private Integer age;22      private boolean man;23      private Date birth;24      private Map<String,Object>map;25      private List<Object>list ;26      private Son son ;27 28 .....省略get/set  以及toString 方法 29 30 }31 32 33 package com.example.webservice.bean;34 35 public class Son {36 37     private String name;38     private Integer age ;39 40     public String getName() {41         return name;42     }43 44     public Integer getAge() {45         return age;46     }47 48     public void setName(String name) {49         this.name = name;50     }51 52     public void setAge(Integer age) {53         this.age = age;54     }55 56     @Override57     public String toString() {58         return "Son{" + "name='" + name + ''' + ", age=" + age + '}';59     }60 }61 62 63 properties文件绑定的写法 64 #注释方法 Ctrl + /65 person.name=爸爸66 person.age=4567 person.man=true68 person.birth=2019/8/869 person.map.k1=h170 person.map.k2=h271 person.list=a,1,son72 person.son.name=儿子73 person.son,age=2074 75 76 yml 文件绑定的写法: 77 78 person:79   name: 爸爸80   age: 2581   birth: 2018/2/882   man: true83   list:84     - a85     - 286     - son87   map: {key1:value1,key2:value2}88   son:89     name: 儿子90     age: 5


测试类 : 
在我们的test 文件夹下 :

package com.example.webservice;

import com.example.webservice.bean.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class WebserviceApplicationTests {

    @Autowired
     Person person;

    @Test
    public void contextLoads() {   // 直接运行这个方法 ,而不是运行整个程序

        System.out.println;

        System.out.println("********************************************************");
    }

控制台打印结果 (使用的 yml 配置文件)

图片 6

properties配置文件在idea中默认utf-8可能会乱码 。因为spring properties 默认是ASCII 码 ,所以需要将properties 默认编码改为UTP-8 ,再√上旁边的 将其运行时转换为ASCII码;再输入中文就好了

图片 7

都改成utf-8 ,再输入中文就好了。

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Import(ContentConfiguration.class)public @interface EnableContentService {}public interface ContentService { void doSomething();}public class SimpleContentService implements ContentService { @Override public void doSomething() { System.out.println("do some simple things"); }}

我们把SpringBoot源码导入IntelliJ IDEA,查看artifact的全部依赖关系。

1、以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理

// 表示这是一个配置类,Spring的注解。跟以前编写的配置文件一样,也可以给容器中添加组件。@Configuration// 启动指定类的ConfigurationProperties功能,将配置文件中对应的值和HttpEncodingProperties绑定起来;并把HttpEncodingProperties加入到ioc容器中。@EnableConfigurationProperties(HttpEncodingProperties.class)// Spring底层@Conditional注解的扩展,根据不同的条件,若满足指定条件,整个配置类里面的配置就会失效;// 此注解是判断当前应用是否是web应用,若是,则当前配置类生效,否则不生效。@ConditionalOnWebApplication// 判断当前项目有没有CharacterEncodingFilter这个类,若有才加载,否则不加载。@ConditionalOnClass(CharacterEncodingFilter.class)// 判断配置文件中是否存在某个配置// 若spring.http.encoding.enabled不存在(matchIfMissing = true)或者值为true则生效。@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)public class HttpEncodingAutoConfiguration { // 他已经和SpringBoot的配置文件映射了。 private final HttpEncodingProperties properties; // 只有一个有参构造的情况下,有参的值就会从容器中去拿。 public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) { this.properties = properties; } @Bean // 判断若没有CharacterEncodingFilter这个类,则给他配置一个类。 @ConditionalOnMissingBean(CharacterEncodingFilter.class) public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset; filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE)); return filter; }}
@SpringBootApplicationpublic class JpaApplication { public static void main(String[] args) { SpringApplication.run(JpaApplication.class, args); }}

- @Value获取值和@ConfigurationProperties获取值比较

| | @ConfigurationProperties | @Value |
| 功能 | 批量注入配置文件中的属性| 一个个指定|
| 松散绑定 | 支持 | 不支持|
| SpEL | 不支持 | 支持|
| JSR303数据校验 | 支持 | 不支持|
| 复杂类型封装 | 支持 | 不支持|

配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

  • ### 配置文件注入值数据校验
@Component@ConfigurationProperties(prefix = "person")@Validatedpublic class Person {    /**     * <bean >     *      <property name="name" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>     * <bean/>     */   //name必须是邮箱格式    @Email    //@Value("${person.name}")    private String name;    //@Value("#{11*2}")    private Integer age;    //@Value    private Boolean boss;    private Date birth;    private Map<String,Object> maps;    private List<Object> lists;    private Dog dog;。。。。。get/set /toString 
  • ### @PropertySource&@ImportResource&@Bean

@PropertySource:加载指定的配置文件;

/** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定; *      prefix = "person":配置文件中哪个下面的所有属性进行一一映射 * * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能; *  @ConfigurationProperties(prefix = "person")默认从全局配置文件中获取值; * */@PropertySource(value = {"classpath:person.properties"})@Component@ConfigurationProperties(prefix = "person")//@Validatedpublic class Person {    /**     * <bean >     *      <property name="name" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>     * <bean/>     */   //name必须是邮箱格式   // @Email    //@Value("${person.name}")    private String name;    //@Value("#{11*2}")    private Integer age;    //@Value    private Boolean boss;```
  • ### @ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;想让Spring的配置文件生效,加载进来;就要将 @ImportResource 标注在一个配置类上@ImportResource(locations = {"classpath:beans.xml"})//类路径上添加配置类的路径导入Spring的配置文件让其生效
不来编写Spring的配置文件  ,下面这就是我们通常的Spring配置类文件

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">    <bean  class="com.example.webservice.controller.Hello"></bean></beans>

SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式1、配置类**@Configuration**------>Spring配置文件2、使用@Bean给容器中添加组件/** * @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件 * * 在配置文件中用<bean><bean/>标签添加组件 * */@Configurationpublic class MyAppConfig {    //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名    @Bean    public HelloService helloService02(){        System.out.println("配置类@Bean给容器中添加组件了...");        return new HelloService();    }}

然后在应用程序的入口加上@EnableContentService注解。

IDEA有个Maven Projects窗口,一般在右侧能够找到,如果没有可以从菜单栏打开:View>Tool Windows>Maven Projects;

2、真相大白

就是判断容器有没有此bean,若没有则注册一个bean到容器中,bean的属性都写到xxxProperties配置文件中。

毫无疑问这里只有 @SpringBootApplication 值得研究,进入 @SpringBootApplication 的源码:

- 配置文件占位符

1、随机数

1 ${random.value}、${random.int}、${random.long}2 ${random.int}、${random.int[1024,65536]}

2、占位符获取之前配置的值,如果没有可以是用:指定默认值

 1 properties 2 person.name=张三${random.uuid} 3 person.age=${random.int} 4 person.birth=2017/12/15 5 person.boss=false 6 person.maps.k1=v1 7 person.maps.k2=14 8 person.lists=a,b,c

// 如果没有hello这个属性, 则会直接输出

${person.hello} , 如果加了

${person.hello:hello}_dog   则会直接赋值 输出

hello_dog 

 9 person.dog.name=${person.hello:hello}_dog  

10 person.dog.age=15

3、Profile
1、多Profile文件
我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml
默认使用application.properties的配置;

然后在配置文件中 激活自定义的环境配置文件就可以了

在配置文件中指定 spring.profiles.active=dev

图片 8图片 9

2、yml支持多文档块方式

 1 server: 2   port: 8081 3 spring: 4   profiles: 5     active: prod  表示当前激活使用哪个环境  --- 表示环境的分割 ,分成不同的文档块。 6 --- 7 server: 8   port: 8083 9 spring:10   profiles: dev11 ---12 server:13   port: 808414 spring:15   profiles: prod  #指定属于哪个环境

4、激活指定profile
​ 1、在配置文件中指定spring.profiles.active=dev
​2、命令行:
​java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
​可以直接在测试的时候,配置传入命令行参数 ,打包好的项目运行的时候指定我们的环境:

图片 10

​3、虚拟机参数; 在运行的时候 选择Editor configrations

图片 11

图片 12

-Dspring.profiles.active=dev

5、配置文件加载位置

springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件–file:./config/–file:./–classpath:/config/–classpath:/

优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;**互补配置;
我们还可以通过spring.config.location来改变默认的配置文件位置
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties

6、外部配置加载顺序
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
1.命令行参数
所有的配置都可以在命令行上进行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087--server.context-path=/abc
多个配置用空格分开; --配置项=值
2.来自java:comp/env的JNDI属性
3.Java系统属性(System.getProperties
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值

由jar包外向jar包内进行寻找;

优先加载带profile

7.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件

8.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件

再来加载不带profile

9.jar包外部的application.properties或application.yml(不带spring.profile)配置文件

10.jar包内部的application.properties或application.yml(不带spring.profile)配置文件

11.@Configuration注解类上的@PropertySource

12.通过SpringApplication.setDefaultProperties指定的默认属性

所有支持的配置加载来源;

[参考官方文档]

这样的话,ContentService就被注入进来了。 SpringBoot也就是用这个完成的。只不过它用了更加高级点的ImportSelector。

选择要分析的maven module(idea的module相当于eclipse的project),右击show dependencies,会出来该module的全部依赖关系图,非常清晰细致。

本文由胜博发-编程发布,转载请注明来源:Springboot使用一个全局的配置文件,决定配置哪些