Spring Boot -- файл конфигурации yml/properties и некоторый исходный код

Spring Boot
Spring Boot -- файл конфигурации yml/properties и некоторый исходный код

личный блог:aaatao66.github.io/

Среда разработки:

  • win10
  • jdk1.8
  • idea2019
  • maven 3.2.5
  • Spring Boot v2.1.5.RELEASE (версия)

1. Обзор синтаксиса файла yml:


person:
  lastNAME: carson
  age: 18
  boss: true
  birth: 1234/12/12
  #map写法: {k: v,k2: v2}
  maps: {k1: v1,k2: v2}
  #数组写法:  -值
  lists:
    - lisi
    - zhangsan
    - wangwu
    - zhaoliu
  dog:
    name: 小狗
    age: 3

spring:
   mvc:
     view:
       prefix: /WEB-INF/views/
       suffix: .jsp
   datasource:
     url: jdbc:mysql:///ssm
     username: root
     password: root
     driver-class-name: com.mysql.jdbc.Driver
   jpa:
     hibernate:
       ddl-auto: update

server:
  port: 9090

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

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

Вы можете получить значение любым способом:

  • Если нам просто нужно получить определенное значение в файле конфигурации в определенной бизнес-логике, используйте @Value
  • Если мы специально напишем javaBean для сопоставления с файлом конфигурации; @ConfigurationProperties

@Validated

@Value

@Getter@Setter
@ToString
@Component
//@ConfigurationProperties (prefix = "person")
@Validated // 来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
public class Person {

    // @Email
    @Value("${person.lastNAME}")
    private String lastNAME;
    @Value("#{3*3}")
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;

    private Dog dog;
}

3. @PropertySource&@ImportResource

Поскольку @ConfigurationProperties является глобальной аннотацией, если вы хотите указать

  • @PropertySource: вы можете указать файл @PropertySource("classpath: xxx.properties)

@ImportResource: импортируйте файл конфигурации Spring, чтобы содержимое файла конфигурации вступило в силу.

  • Создайте класс HelloService
    • Если нет аннотации
<?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 id="helloService" class="com.carson.springboot.service.impl.HelloService"></bean>
</beans>
	 @Autowired
    ApplicationContext ioc;

    @Test
    public void testHelloService(){
        // 是否是包含 这个 bean
        boolean b = ioc.containsBean("helloService");
        System.out.println(b);//false
    }

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

Если вы хотите, чтобы файл конфигурации Spring вступил в силу, загрузите его;поставить @importResourceАннотация к классу конфигурации

  • основной класс
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }

}
	 @Autowired
    ApplicationContext ioc;

    @Test
    public void testHelloService(){
        // 是否是包含 这个 bean
        boolean b = ioc.containsBean("helloService");
        System.out.println(b);//true
    }

SpringBoot рекомендует способ добавления компонентов в контейнер:

Используйте @Bean

  • 1, класс конфигурации ====== Файл конфигурации Spring
    • Создайте конфигурацию пакета, посвященную классу конфигурации: MyAppConfig

/**
 * @Configuration: 指明当前类是一个配置类;就是来代替之前的Spring配置文件
 *
 * 以前配置文件总 用 <bean></bean> 标签添加组件
 */
@Configuration
public class MyAppConfig {

    // 将方法的返回值添加到容器中,容器中这几个组件默认的id就是方法名
    @Bean
    public HelloService helloService(){
        return new HelloService();
    }
}

Не забудьте удалить аннотацию @ImportResource предыдущего основного класса!

输出结果:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.5.RELEASE)

2019-06-29 16:53:48.081  INFO 11084 --- [           main] c.c.s.SpringbootApplicationTests         : Starting SpringbootApplicationTests on DESKTOP-JBSD6AK with PID 11084 (started by My in F:\code\springboot)
2019-06-29 16:53:48.083  INFO 11084 --- [           main] c.c.s.SpringbootApplicationTests         : No active profile set, falling back to default profiles: default
2019-06-29 16:53:52.689  INFO 11084 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-06-29 16:53:53.988  INFO 11084 --- [           main] c.c.s.SpringbootApplicationTests         : Started SpringbootApplicationTests in 7.259 seconds (JVM running for 10.759)
true 
2019-06-29 16:53:54.433  INFO 11084 --- [       Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

также верно

4. ${} в файле конфигурации

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

${random.value}
${random.int}
${random.long}
${random.int(10)}
${random.int[1024,65536]}

${} получает ранее настроенное значение

person:
  lastNAME: bob${random.uuid}
  age: ${random.int}
  boss: true
  birth: 1234/12/12
  maps: {k1: v1,k2: v2}
  lists:
    - lisi
    - zhangsan
    - wangwu
    - zhaoliu
  dog:
    name: ${person.lastNAME}_dog
    age: 3

если

  dog:
name: ${person.lastNAME}_dog

Если lastNAME отсутствует, то

  dog:
name: ${person.lastNAME:hello}_dog

5. Profile

5.1 Несколько файлов профиля

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

Например, я настраиваю 3 порта, один по умолчанию, один dev (разработка), один prod (тест)

Имя основного файла конфигурации может быть application.yml/application.properties.

По умолчанию используется конфигурация application.yml;

5.2 Несколько блоков документов для yml

Отдельные документы с ---

spring:
  profiles:
    active: dev 

server:
  port: 9090
---

server:
  port: 9091
spring:
  profiles: dev 
---

server:
  port: 9092
spring:
  profiles: prod
  • active: указать, какой документ быстрее
  • профили: укажите имя для активного распознавания

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

1. Укажите spring.profiles.active=dev в файле конфигурации

2, командная строка:

Добавьте аргументы запуска > редактирования > программы на функциональной панели идей.

--spring.profiles.active=prod

--spring.profiles.active=dev

3, в cmd введите проект в пакет jar

java -jar (имя пакета jar) --spring.profiles.active=prod

4, параметры виртуальной машины:

Добавьте параметры запуска> редактирования> VM на панели функций идеи.

-Dspring.profiles.active=prod/dev


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

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

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

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

файл: уровень каталога с src

classpath: в каталоге ресурсов

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

1. Упакуйте проект

2. Формат командной строки: java -jar имя пакета --spring.config.location= F:/app/application.properties (абсолютный путь к файлу конфигурации)

После того, как проект будет упакован, вам может понадобиться изменить некоторые конфигурации позже, вы можете использовать этот метод, и старая конфигурация все еще будет существовать, а также будет применена новая конфигурация.

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

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

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

    java -jar xxx.jar --server.port=8081 --xxx

    Разделение нескольких пространств конфигурации: --xxx --xxx

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

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

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

  5. random.* значения свойств, настроенные RandomValuePropertySource

Поиск снаружи пакета jar внутрь пакета jar:

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

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

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

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

еще есть больше:

  1. @PropertySource в аннотированных классах @Configuration
  2. Укажите свойства по умолчанию через SrpingApplication.setDefaultProperties.

Для получения дополнительной информации см. главу 24 документации официального веб-сайта.

8. Принцип автоматической настройки (акцент)

Что умеет автоматическая настройка Как это написать Принцип автоматической настройки:

адрес документа

Посмотреть последнюю главу оглавления X. Приложения

Вот элементы конфигурации

фактически:

  • 1. Запуск SpringBoot загрузит большое количество классов автоконфигурации
  • 2. Посмотрим, есть ли у нужных нам функций классы автоматической настройки, написанные SpringBoot по умолчанию
  • 3. Давайте посмотрим, какие компоненты настраиваются этим классом автоматической настройки (пока есть компоненты, которые мы хотим использовать, нам не нужно их настраивать заново)
  • 4. При добавлении компонентов в класс автоматической конфигурации в контейнере некоторые свойства будут получены из класса свойств, и мы можем указать значения этих свойств в файле конфигурации

xxxxAutoConfigurartion: класс автоматической настройки;

Добавьте компоненты в контейнер

xxxxProperties: связанные свойства в файле конфигурации пакета;

Навык:

идея Дважды щелкните Shift, найдите *AutoConfiguration

Нажмите на автоматическую настройку, связанную с кешем.

Мы увидим следующий исходный код:

@EnableConfigurationProperties({CacheProperties.class})
@AutoConfigureAfter({CouchbaseAutoConfiguration.class, HazelcastAutoConfiguration.class, HibernateJpaAutoConfiguration.class, RedisAutoConfiguration.class})
@Import({CacheAutoConfiguration.CacheConfigurationImportSelector.class})
public class CacheAutoConfiguration {
    public CacheAutoConfiguration() {
    }

ctrl+щелчок левой кнопкой мыши:

@EnableConfigurationProperties({CacheProperties.class})
//点击 CacheProperties

Посмотрим на класс CACHEPROPERTIES:

@ConfigurationProperties(
    prefix = "spring.cache"
)
public class CacheProperties {

Префикс = "Spring.cache": префикс синтаксиса конфигурационного файла YML/Properties.

Какие конкретно вещи можно настроить?

Это оно

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

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

Например, я хочу подключиться к базе данных, позвольте мне поискать

Я увидел нужные нам поля и многие из следующих методов (скриншотов здесь нет)

Следующим шагом является настройка файла конфигурации:

9. Детали

@Условная производная аннотация

Я нашел много @ConditionalOn*** в исходном коде.

На самом деле он использует базовую аннотацию Spring @Conditional.

Функция: только когда условия, указанные @Conditional, будут выполнены, добавьте компоненты в контейнер, и содержимое в классе конфигурации вступит в силу.Если он возвращает false, ничего из того, что вы настраиваете, не вступит в силу.

SpringBoot расширяет аннотацию @Conditional, например:

Так что на самом деле класс автоматической настройки должен срабатывать при определенных условиях

Как узнать какие классы валидные а какие нет?Это очень просто,добавьте в конфигурационный файл:

debug: true	

Затем запустите наш класс Zhu:

Мы увидим:

а также:

выведет вывод на консоль