Spring Boot (2) — анализ файла конфигурации

Spring Boot Java EE
Spring Boot (2) — анализ файла конфигурации

Это 17-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

   Spring Boot основан на соглашении, поэтому многие конфигурации имеют значения по умолчанию, но если вы хотите заменить конфигурацию по умолчанию своей собственной конфигурацией, вы можете использоватьapplication.properties или application.yml (application.yaml)настроить.   Тип файла конфигурации SpringBoot: Spring Boot загружает ресурсы в каталог по умолчанию.application.propertiesилиapplication.yml(application.yaml)документ.
Согласно порядку чтения файлов в spring-boot-starter-parent, поэтому файл конфигурацииПриоритет: .Properties> .yaml> .yml

 <excludes>
   <exclude>**/application*.yml</exclude>
   <exclude>**/application*.yaml</exclude>
   <exclude>**/application*.properties</exclude>
 </excludes>

Во-первых, файл конфигурации YAML

1. Настройте общие данные

 name: lisi

ps:Перед значением есть пробел,Между ключом и значением есть пробел

Строки по умолчанию не заключаются в кавычки:

" ": двойные кавычки: специальные символы в строке не будут экранированы, а специальные символы будут использоваться как значение, которое они хотят выразить:

Имя: "Zhangsan \ n lisi" ==> Выход: Zhangsan Newline Lisi

' ': одинарные кавычки: специальные символы экранируются, а специальные символы представляют собой обычные строковые данные в конце:

имя: 'zhangsan \n lisi' ==> вывод: zhangsan \n lisi

2. Настройте данные объекта, данные карты

 person:
   name: zhangsan
   age: 18
   addr: 上海
   
 # 或者(注意缩进)
 
 person: {name: zhangsan,age: 18,addr: 上海}

ps: Иерархические отношения представлены количеством пробелов, а один и тот же отступ представляет один и тот же уровень.

3. Настроить массив (список, набор) данных

 city:
 - beijing
 - tianjin
 - shanghai
 - chongqing
 
 # 或者
 
 city: [beijing,tianjin,shanghai,chongqing]
 
 # 集合中的元素是对象形式
 student:
   - name: zhangsan
     age: 18
     score: 100
   - name: lisi
     age: 28
     score: 88
   - name: wangwu
     age: 38
     score: 90

ps:Между значением и - есть пробел

Общая конфигурация SpringBoot

 # QUARTZ SCHEDULER (QuartzProperties)
 spring.quartz.jdbc.initialize-schema=embedded # Database schema initialization mode.
 spring.quartz.jdbc.schema=classpath:org/quartz/impl/jdbcjobstore/tables_@@platform@@.
 sql # Path to the SQL file to use to initialize the database schema.
 ​
 spring.quartz.job-store-type=memory # Quartz job store type.
 spring.quartz.properties.*= # Additional Quartz Scheduler properties.
 ​
 # ----------------------------------------
 # WEB PROPERTIES
 # ----------------------------------------
 ​
 # EMBEDDED SERVER CONFIGURATION (ServerProperties)
 server.port=8080 # Server HTTP port.
 server.servlet.context-path= # Context path of the application.
 server.servlet.path=/ # Path of the main dispatcher servlet.
 ​
 # HTTP encoding (HttpEncodingProperties)
 spring.http.encoding.charset=UTF-8 # Charset of HTTP requests and responses. Added to
 the "Content-Type" header if not set explicitly.
 ​
 # JACKSON (JacksonProperties)
 spring.jackson.date-format= # Date format string or a fully-qualified date format
 class name. For instance, `yyyy-MM-dd HH:mm:ss`.
 ​
 # SPRING MVC (WebMvcProperties)
 spring.mvc.servlet.load-on-startup=-1 # Load on startup priority of the dispatcher
 servlet.
 spring.mvc.static-path-pattern=/** # Path pattern used for static resources.
 spring.mvc.view.prefix= # Spring MVC view prefix.
 spring.mvc.view.suffix= # Spring MVC view suffix.
 ​
 # DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
 spring.datasource.driverClassName=###
 spring.datasource.url= # JDBC URL of the database.
 spring.datasource.password= # Login password of the database.
 spring.datasource.username= # Login username of the database.
 ​
 # JEST (Elasticsearch HTTP client) (JestProperties)
 spring.elasticsearch.jest.password= # Login password.
 spring.elasticsearch.jest.proxy.host= # Proxy host the HTTP client should use.
 spring.elasticsearch.jest.proxy.port= # Proxy port the HTTP client should use.
 spring.elasticsearch.jest.read-timeout=3s # Read timeout.
 spring.elasticsearch.jest.username= # Login username.

2. Файл конфигурации

1. Используйте отображение аннотации @Value

Мы можем сопоставить значение в файле конфигурации с полем компонента, управляемого Spring, с помощью аннотации @Value.

 application.yml
 person:
   name: zhangsan
   age: 18
   addr: 上海
 ===================
 @RestController
 public class QuickController {
     @Value("${person.name}")
     private String name;
     @Value("${person.age}")
     private int age;
     @Value("${person.addr}")
     private String addr;
 ​
     @RequestMapping("/ymlTest")
     public String ymlTest(){
         return "SpringBoot访问成功。姓名:" + name + ",年龄:" + age + ",地址:" + addr;
     }

2. Используйте аннотацию @ConfigurationProperties для сопоставления

Аннотируя @ConfigurationProperties (prefix="префикс ключа в файле конфигурации"), конфигурация в файле конфигурации может быть автоматически сопоставлена ​​с сущностьюps: этот метод может автоматически отображать файл конфигурации и поле сущности, но поле должно предоставлять метод set;

И класс должен быть в контейнере (модифицированном с помощью аннотаций, таких как @Component, @Controller)

 // Person类
 @Getter
 @Setter
 @ToString
 @Component
 @ConfigurationProperties(prefix = "person")
 public class Person {
 ​
     public String name;
     public Integer age;
     public Boolean boss;
     public Date birth;
     public String nickName;
 ​
     public Map<String,Object> maps;
     public List<Object> lists;
     public Dog dog;
 ​
 }
 ## application.yml
 person:
   name: 小贱
   age: 22
   boss: false
   birth: 1999/09/30
 ​
   maps: {k1: 博客,k2: 分享网站}
   lists: [123,625,342,803]
   dog:
    name: 小黑
    age: 4
   nick-name: Raining

Роль конфигурационного файла configuration-processor

 <!-- @ConfiguartionProperties的执行器的配置 -->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-configuration-processor</artifactId>
     <optional>true</optional>
 </dependency>

В классе сущностей используйте аннотацию @ConfigurationProperties, чтобы сначала объявить префикс.При записи файла конфигурации yml введите соответствующий префикс, и появится запрос на свойства в классе сущностей.

image-20200803202617490

тестовое задание

 @RunWith(SpringRunner.class)
 @SpringBootTest
 class SpringBootReturn02ApplicationTests {
 ​
     @Autowired
     Person person;
 ​
     @Test
     public void contextLoads() {
         System.out.println(person);
     }
 }

В файле application.properties появляются искаженные символы.

Причина: идея использует кодировку utf-8, люди используют ASCII

Решение: Файл --> Настройка

image-20200803212831336

3. Сравнение @Value и @ConfigurationProperties

@ConfigurationProperties @Value
Функция Массовое внедрение свойств в конфигурационные файлы указать один за другим
свободная привязка (свободный синтаксис, верблюжий регистр, тире) служба поддержки не поддерживается
SpEL не поддерживается служба поддержки
Проверка данных JSR303 служба поддержки не поддерживается
Инкапсуляция сложного типа (карта, объект) служба поддержки не поддерживается

Проверка данных JSR303 (@ConfigurationProperties в качестве примера)

  • импортировать зависимости

     <dependency>
         <groupId>org.hibernate.validator</groupId>
         <artifactId>hibernate-validator</artifactId>
         <version>6.1.5.Final</version>
     </dependency>
    
  • Аннотация класса проверки

     @Getter @Setter @ToString
     @Component
     @ConfigurationProperties(prefix = "person")
     @Validated
     public class Person {
     ​
         @Email
         public String name;
         public Integer age;
         public Boolean boss;
         public Date birth;
         public String nickName;
     ​
         public Map<String,Object> maps;
         public List<Object> lists;
         public Dog dog;
     ​
     }
    
  • тестовое задание

    image-20200803220031450

4. @PropertySource и @ImportResource

@PropertySource (файлы конфигурации yml не поддерживаются по умолчанию! Так что старые практические свойства)
 # person.properties
 ​
 person.name=死侍
 person.age=24
 person.boss=false
 person.birth=1998/3/23
 person.maps.k1=点数
 person.maps.k2=大小
 person.lists=a,s,d
 person.dog.name=小白
 person.dog.age=3
 person.nick-name=小贱贱
 @Getter @Setter @ToString
 @PropertySource(value = {"classpath:person.properties"})
 @Component
 @ConfigurationProperties(prefix = "person")
 public class Person {
 ​
     public String name;
     public Integer age;
     public Boolean boss;
     public Date birth;
     public String nickName;
 ​
     public Map<String,Object> maps;
     public List<Object> lists;
     public Dog dog;
 ​
 }
@ImportResource: импортируйте файл конфигурации Spring, чтобы содержимое файла конфигурации вступило в силу.

В Spring Boot нет файла конфигурации Spring, а файл конфигурации, который мы написали сами, не может быть распознан и эффективен;

Чтобы файл конфигурации Spring был загружен, вступите в силу:@ImportResource аннотируется в классе конфигурации

 @ImportResource(locations = {"classpath:beans.xml"})
 @SpringBootApplication
 public class SpringBootReturn02Application {
 ​
     public static void main(String[] args) {
         SpringApplication.run(SpringBootReturn02Application.class, args);
     }
 ​
 }

Spring Boot рекомендует способ добавления компонентов в контейнер:Рекомендуется использовать полностью аннотированные классы конфигурации.

Класс конфигурации вместо файла конфигурации spring

 @Configuration
 public class MyAppConfig {
 ​
     @Bean
     public HelloService helloService(){ // 这里的方法名就是获取该bean的名称,区分大小写
         System.out.println("配置类注入helloService");
         return new HelloService();
     }
 }
 // 测试类
 @RunWith(SpringRunner.class)
 @SpringBootTest
 class SpringBootReturn02ApplicationTests {
 ​
     @Resource
     ApplicationContext ioc;
 ​
     @Test
     public void testHelloService(){
         boolean b = ioc.containsBean("helloService");   // 区分大小写
         System.out.println(b);
     }
 ​
 }

5. Заполнители файла конфигурации

Может использоваться как неопределенное значение в файле конфигурации

  • случайное число

     ${random.value}、${random.int}、${random.long}
     ${random.int(10)}、${random.int[1024,65535]}
    
  • Заполнитель получает значение конфигурации, если нет значения по умолчанию, можно указать

     person.name=张三${random.uuid}
     person.age=${random.int}
     person.boss=false
     person.birth=1998/3/23
     person.maps.k1=点数
     person.maps.k2=大小
     person.lists=a,s,d
     person.dog.name=${person.nick-name}_小白
     person.dog.age=3
     person.nick-name=${person.hello:你好}     // 指定默认值
    

6. Profile

(1) Несколько файлов профиля

Когда мы пишем основной файл конфигурации, имя файла может быть application-{profile}.properties/yml

Использовать конфигурацию application.properties по умолчанию.

(2) yml поддерживает многодокументный быстрый режим

 # application.yml
 ​
 server:
   port: 8082
 spring:
     profiles:
       active: dev
 ​
 ---
 server:
   port: 8083
 ​
 spring:
   profiles: dev
   
 ---
 server:
   port: 8084
 spring:
   profiles: prod
 ​

(3) Активировать указанный профиль

  • Укажите в основном профиле: spring.profiles.active=dev

  • Командная строка:--spring.profiles.active=dev

    • В поле параметров запуска проекта «Редактировать конфигурации» -> поле «Аргументы программы» заполните --spring.profiles.active=dev

    • Активировать при запуске пакета jar

      java -jar spring-boot-return02-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

  • Параметры виртуальной машины

    -Dspring.profiles.active=dev

    В поле параметров запуска проекта в столбце Edit Configurations --> VM option заполните -Dspring.profiles.active=dev

7. Место загрузки файла конфигурации

При запуске Spring Boot сканируются файлы application.properties или application.yml в следующих местах в качестве файлов конфигурации Spring Boot по умолчанию.

  • file:./config
  • file:./
  • classpath:/config
  • classpath:/

-- файл представляет расположение проекта, путь к классам представляет папку ресурсов

-- Вышеизложенное основано наприоритет от высокого к низкомуЗаказ,Содержимое конфигурации с высоким приоритетом имеет приоритет над содержимым конфигурации с низким приоритетом.; Spring Boot загрузит все основные файлы конфигурации из этих четырех мест:Дополнительная конфигурация

-- Мы также можем настроить--spring.config.locationизменить конфигурацию по умолчанию;После упаковки проекта используйте форму параметров командной строки, указать новое расположение файла конфигурации при запуске проекта; указанный файл конфигурации и загруженный по умолчанию файл конфигурации работают вместе, чтобы дополнить конфигурацию

 java -jar spring-boot-return03-config-0.0.1-SNAPSHOT.jar --spring.config.location=F:/application.properties

8. Порядок загрузки внешней конфигурации

SpringBoot также может загружать конфигурации из следующих расположений: приоритет от высокого к низкому; конфигурации с высоким приоритетом имеют приоритет над конфигурациями с низким приоритетом, и все конфигурации будут формировать дополнительные конфигурации.

1. Параметры командной строки

Все конфигурации можно указать в командной строке

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc

Несколько конфигураций разделяются пробелами; --configuration item=value

2. Свойства JNDI из java:comp/env

3. Системные свойства Java (System.getProperties())

4. Переменные среды операционной системы

5. Значение свойства random.* конфигурации RandomValuePropertySource

Поиск снаружи упаковки банки внутрь упаковки банки;

Приоритетная загрузка с профилем

6. Файл конфигурации application-{profile}.properties или application.yml (с spring.profile) вне пакета jar.

7. Файл конфигурации application-{profile}.properties или application.yml (с spring.profile) внутри пакета jar.

Затем загрузить без профиля

8. Конфигурационные файлы Application.properties или Application.properties или Application.profile (без Spring.profile).

9. Файл конфигурации application.properties или application.yml (без spring.profile) внутри пакета jar

10. @PropertySource в аннотированных классах @Configuration

11. Свойства по умолчанию, указанные SpringApplication.setDefaultProperties

Все поддерживаемые источники загрузки конфигурации;

Обратитесь к официальной документации

3. Журнал

1. Структура журнала

Фреймворки для логирования на рынке;

JUL, JCL, Jboss-логирование, logback, log4j, log4j2, slf4j....

Бревенчатый фасад (слой абстракции для бревен) реализация журнала
JCL (ведение журнала Джакартского сообщества)SLF4j (простой фасад ведения журнала для Java)jboss-logging Log4j JUL (java.util.logging) Log4j2 (самый мощный)Logback

Выберите фасад (абстрактный слой) слева и реализацию справа;

Бревенчатый фасад: SLF4J;

Реализация журнала: Logback;

SpringBoot: нижний уровень — это среда Spring, а среда Spring по умолчанию использует JCL;

SpringBoot использует SLF4j и логбэк;

2. Использование SLF4J

1. Как использовать SLF4j в системеwww.slf4j.org

В будущей разработке вызов метода ведения журнала должен не вызывать напрямую класс реализации журнала, а вызывать метод на уровне абстракции журнала;

Импортируйте jar-пакет slf4j и jar-пакет реализации logback в систему;

 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 ​
 public class HelloWorld {
   public static void main(String[] args) {
     Logger logger = LoggerFactory.getLogger(HelloWorld.class);
     logger.info("Hello World");
   }
 }

Значок:

concrete-bindings

Каждая структура реализации журнала имеет свой собственный файл конфигурации.После использования slf4j,Файл конфигурации по-прежнему вносится в файл конфигурации самой структуры реализации журнала.;

2. Унаследованные проблемы

Когда проект интегрирует несколько фреймворков, и каждый фреймворк зависит от конкретного фреймворка ведения журналов, как мы можем единообразно использовать выбранный фреймворк ведения журналов?

приложение (slf4j+logback): Spring (журналирование общих ресурсов), Hibernate (логирование jboss), MyBatis, xxxx

Унифицированное ведение журнала, даже если другие фреймворки используют slf4j вместе со мной для вывода?

legacy

Как сделать все логи в проекте едиными для slf4j:

 1. 将项目中其他日志框架先排除出去;
  1. Замените исходную структуру ведения журнала промежуточным пакетом;
  2. Импортируем другие реализации slf4j

3. Связь с журналом Spring Boot

SpringBoot использует его для логирования:

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-logging</artifactId>
 </dependency>

Базовые отношения:

image-20200804143102376

Суммировать:

  1. Нижний уровень Spring Boot также использует slf4j + logback для ведения журнала;

  2. Spring Boot также заменяет другие журналы на slf4j, используйте промежуточные пакеты замены, такие как: log4j-to-slf4j, jul-to-slf4j;

  3. Если вы хотите представить другие фреймворки, обязательно удалите зависимость журнала по умолчанию от этого фреймворка.

    Фреймворк Spring использует ведение журнала общих ресурсов;

     <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-core</artifactId>
         <exclusions>
             <exclusion>
                 <groupId>commons-logging</groupId>
                 <artifactId>commons-logging</artifactId>
             </exclusion>
         </exclusions>
     </dependency>
    

SpringBoot может автоматически адаптироваться ко всем логам, а нижний слой использует slf4j+logback для записи логов.При введении других фреймворков нужно только исключить фреймворк логов, от которого зависит этот фреймворк;

4. Использование журналов

1. Конфигурация по умолчанию

Spring Boot по умолчанию настраивает для нас журнал:

 // 测试类
 ​
 @SpringBootTest
 class   SpringBootReturn05LoggingApplicationTests {
 ​
     // 记录器
     Logger logger = LoggerFactory.getLogger(getClass());
 ​
     @Test
     void contextLoads() {
         // 日志的级别
         // 由低到高 ,trace < debug < info < warn < error
         // 可以调整输出的日志级别,日志就只会在这个级别及以后的高级别生效
         logger.trace("这是Trace");
         logger.debug("这是debug日志");
         // Spring Boot 默认给我们使用的是info级别的,可自行设置,没有设置使用默认级别
         logger.info("这是info日志");
         logger.warn("这是warn日志");
         logger.error("这是error日志");
     }
 }
 # application.properties
 ​
 # 配置日志输出级别,没有该配置,使用默认级别info
 logging.level.com.xiaojian=trace
 ​
 # 输出日志 springboot.log 文件
 # 可以指定完整路径;不指定路径会在当前项目下生成日志文件
 #logging.file.name=F:/springboot.log
 ​
 # 两者冲突,只能写其中一个,两个都写时,使用 file
 ​
 # 在当前磁盘下的根路径下创建 spring 文件夹,和 log 子文件夹,并使用 spring.log 为默认文件
 #logging.file.path=/spring/log
 ​
 ​
 # 在控制台输出的日志格式
 logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
 # 指定文件中日志输出的格式
 loggin.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} === %msg%n
 ​
logging.file logging.path Example Description
(none) (none) Выход только в консоли
Укажите имя файла (none) my.log Вывод журнала в файл my.log
(none) указанный каталог /var/log Вывод в файл spring.log в указанном каталоге

2. Укажите конфигурацию

Просто поместите собственный файл конфигурации каждой среды ведения журнала в путь к классам; SpringBoot не использует его конфигурацию по умолчанию.

Logging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

logback.xml: он напрямую распознается фреймворком ведения журнала;

logback-spring.xml: структура журнала не загружает напрямую элементы конфигурации журнала,Разбор конфигурации журнала с помощью Spring Boot, вы можете использовать расширенную функцию профиля SpringBoot

 <springProfile name="staging">
     <!-- configuration to be enabled when the "staging" profile is active -->
     可以指定某段配置只在某个环境下生效
 </springProfile>

Используя расширенную функцию профиля Spring Boot,Если это файл logback.xml, он сообщит об ошибке, потому что используется springProfile

Настройте среду разработки в файле application.properties или application.yml.

 <!--logback-spring.xml,如果是logback.xml文件就会报错,因为使用了 springProfile-->
 ​
 <!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->
     <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
         <!--
         日志输出格式:
             %d表示日期时间,
             %thread表示线程名,
             %-5level:级别从左显示5个字符宽度
             %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 
             %msg:日志消息,
             %n是换行符
         -->
         <layout class="ch.qos.logback.classic.PatternLayout">
             <springProfile name="dev">
                 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ->>>>>>>>>>>>>>> [%thread] %-5level %logger{50} - %msg%n</pattern>
             </springProfile>
             <springProfile name="!dev">
                 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} -=============== [%thread] %-5level %logger{50} - %msg%n</pattern>
             </springProfile>
         </layout>
     </appender>

5. Переключите структуру ведения журнала

Сопутствующее переключение может быть выполнено в соответствии со схемой адаптации журнала slf4j;

способ slf4j+log4j;

 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
   <exclusions>
     <exclusion>
       <artifactId>logback-classic</artifactId>
       <groupId>ch.qos.logback</groupId>
     </exclusion>
     <exclusion>
       <artifactId>log4j-over-slf4j</artifactId>
       <groupId>org.slf4j</groupId>
     </exclusion>
   </exclusions>
 </dependency>
 ​
 <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
 </dependency>

переключатель log4j2

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
     <exclusions>
         <exclusion>
             <artifactId>spring-boot-starter-logging</artifactId>
             <groupId>org.springframework.boot</groupId>
         </exclusion>
     </exclusions>
 </dependency>
 ​
 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-log4j2</artifactId>
 </dependency>