личный блог: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 также может загружать конфигурацию из следующих мест, приоритет от высокого к низкому, высокий приоритет имеет приоритет над низким приоритетом, если есть разные конфигурации,будет дополнять
-
аргументы командной строки
java -jar xxx.jar --server.port=8081 --xxx
Разделение нескольких пространств конфигурации: --xxx --xxx
-
Свойства NDI из java:comp/env
-
Системные свойства Java (System.getProperties())
-
переменные среды операционной системы
-
random.* значения свойств, настроенные RandomValuePropertySource
Поиск снаружи пакета jar внутрь пакета jar:
Приоритетная загрузка с профилем
- Файл конфигурации application-{profile}.properties или application.yml (с spring.profile) во «внешней» части пакета jar.
- Файл конфигурации application-{profile}.properties или application.yml (с spring.profile) во «внутри» пакета jar
Затем загрузите его без профиля
- Файл конфигурации application.properties или application.yml (без spring.profile) во «внешнем» пакете jar.
- Файл конфигурации application.properties или application.yml (без spring.profile) во «внутри» пакета jar.
еще есть больше:
- @PropertySource в аннотированных классах @Configuration
- Укажите свойства по умолчанию через 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:
Мы увидим:
а также:
выведет вывод на консоль