Что такое Spring Boot
Spring Boot — это, по сути, расширение среды Spring, которое устраняет сложную и рутинную настройку, необходимую для настройки приложения Spring. Когда мы используем среду Spring, мы должны быть подвержены Spring MVC, IOC, DI, AOP и т. д., и эти платформы должны будут настроить много XML в процессе использования или выполнить много утомительной настройки. . Spring Boot может помочь нам быстро создать прикладное решение на основе инфраструктуры Spirng и экосистемы Spring.
Переведем на официальный сайт:
- Создайте отдельное приложение Spring
- Встраивайте Tomcat, Jetty или Undertow напрямую (не нужно развертывать файл WAR), java -jar работает
- Предоставьте начальные зависимости, чтобы упростить вашу собственную конфигурацию
- Autowire Spring и сторонние зависимости, когда это возможно
- Предоставляет готовые к работе функции, такие как метрики, проверки работоспособности и внешние настройки, такие как Actuator.
- Никакой генерации кода и конфигурации XML не требуется.
После прочтения вышесказанного есть два основных момента.соглашение о конфигурациииавтоматическая сборка.
соглашение о конфигурации
Воплощение условности над конфигурацией в основном
- Структура каталогов maven, по умолчанию есть папка ресурсов для хранения файлов конфигурации, а метод упаковки по умолчанию — jar.
- spring-boot-starter-web по умолчанию включает зависимости, связанные с spring mvc, и встроенный контейнер tomcat, что упрощает создание веб-приложения.
- Файл application.properties/yml предоставляется по умолчанию.
- По умолчанию файл конфигурации читается, когда среда выполнения определяется свойством spring.profiles.active.
- EnableAutoConfiguration автоматически подключает зависимые стартеры по умолчанию
автоматическая сборка
Говоря об автопроводке, сначала начнем с аннотаций, мы нажимаем на @SpringBootApplication.Видно, что на самом деле это составная аннотация, четыре верхних — это метааннотации, а три нижних — ключевые точки.
- @Configuration
- @EnableAutoConfiguration
- @ComponentScan
Мы можем использовать эти три аннотации напрямую или запустить приложение Spring Boot, но каждый раз настраивать три аннотации неудобно, поэтому удобнее использовать составную аннотацию напрямую. Ниже приведен скриншот официального сайта, кому просто интересно, могут перевести сами.
@Configuration
Всем следует использовать аннотацию @Configuration — это аннотация, используемая классом конфигурации на основе контейнера Spring IOC в форме JavaConfig. Таким образом, @Configuration отмечен в классе запуска, что означает, что на самом деле это IoC. Класс конфигурации для контейнера.
Приложения Spring в традиционном понимании основаны на xml для настройки зависимостей компонентов. Но начиная с Spring 3 Spring поддерживает два метода конфигурации bean-компонентов, один из которых основан на файлах xml, а другой — JavaConfig.Любое определение класса Java, помеченное @Configuration, является классом конфигурации JavaConfig. В этом классе конфигурации любой метод, помеченный @Bean, его возвращаемое значение будет зарегистрировано в контейнере IoC Spring как определение компонента, а имя метода будет идентификатором компонента по умолчанию. Затем через пружинный контейнер, когда он запустится, положите боб Инициализируйте и, если есть зависимости между bean-компонентами, проанализируйте эти bean-компоненты уже в IoC-контейнере и соберите их в соответствии с зависимостями.
@ComponentScan
@ComponentScan Эта аннотация использовалась всеми, это очень просто, это сканирование пакета, который эквивалентен файлу конфигурации xml.
. Его основная функция — сканировать указанный путь, чтобы идентифицировать класс, который необходимо собрать.
Autowire в контейнер Spring IoC.
Основными формами идентификации классов, которые необходимо собрать, являются: классы, идентифицируемые такими аннотациями, как @Component, @Repository, @Service и @Controller. (Примечание. Нижний уровень @Repository, @Service, @Controller по-прежнему @Component.). По умолчанию ComponentScan сканирует все классы в текущем пакете с соответствующими идентификаторами аннотаций в контейнер IoC.
@EnableAutoConfiguration
Что ж, главный герой уже здесь. @EnableAutoConfiguration — это душа Spring Boot и главный приоритет. Начиная с Spring 3.1 предоставляется ряд аннотаций, начинающихся с @Enable, которые дополнительно улучшены в среде JavaConfig, что позволяет пользователям избегать настройки большого объема кода при использовании сред, связанных со Spring, тем самым снижая сложность использования.
Например, некоторые распространенные аннотации Enable: @EnableWebMvc, @EnableScheduling, @EnableAsync и т. д. Каждая аннотация, связанная с началом Enable, будет аннотирована @Import, и @EnableAutoConfiguration не является исключением.Мы нажимаем и находим ее, как показано в красном поле.
Что означает аннотация @Import? Он соответствует
- Обычный компонент или файл конфигурации с @Configuration
- Реализовать интерфейс ImportSelector для динамического внедрения
- Реализовать интерфейс ImportBeanDefinitionRegistrar для динамического внедрения.
Здесь импортирован второй importSelector, который представляет собой технологию динамического внедрения компонентов Мы нажали AutoConfigurationImportSelector и обнаружили, что он реализует интерфейс ImportSelector.
Найдите метод реализации selectImports, функция этого метода состоит в том, чтобы найти соответствующий Bean для внедрения в контейнер.
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
Затем нажмите в методе getAutoConfigurationEntry, который делает много вещей, то есть исключает, фильтрует и дедуплицирует найденные компоненты Мы можем видеть такие методы, как removeDuplicates, remove и filter.
Откуда берутся эти бины?Мы нажали на метод getCandidateConfigurations и обнаружили шокирующую тайну, то есть здесь находится файл META-INF/spring.factories.
Конечно, это сообщение об ошибке. Мы не смеем сделать вывод, что она здесь.
Значение этой переменной по-прежнему META-INF/spring.factories.Мы были очень взволнованы, увидев это, поэтому я не колеблясь искал этот файл в проекте.Первоначальная функция SpringFactoriesLoader заключается в загрузке соответствующего класса из файла classpath/META-INF/spring.factories в контейнер Spring IoC. по ключу..Когда вы это увидите, маленькие друзья поймут, что это значит загружать так много бинов в Конфигурацию в контейнер.Но но, почему я не могу использовать RabbitMQ и Elasticsearch, почему они добавлены в контейнер, какая пустая трата места и памяти? Не паникуй, дружище, поэтому я с любопытством открыл класс конфигурации RabbitMQ.
Увидев это, я, наконец, вздохнул с облегчением. Вы, ребята, обнаружили, что здесь есть еще несколько условных аннотаций? На самом деле это условные аннотации. Spring Boot не глуп. Он обнаружит, что если нет связанной зависимости в текущая среда пути к классам, это означает, что нет необходимости загружать эти классы. Следовательно, такая условная фильтрация может эффективно сократить количество классов @configuration и тем самым сократить время запуска Spring Boot.
Conditions | описывать |
---|---|
@ConditionalOnBean | когда боб существует |
@ConditionalOnMissingBean | Когда боба не существует |
@ConditionalOnClass | Когда класс определенного типа можно найти в текущем пути к классам |
@ConditionalOnMissingClass | Когда класс определенного типа не может быть найден в текущем пути к классам |
@ConditionalOnResource | Существует ли файл ресурсов в текущем пути к классам |
@ConditionalOnProperty | Содержит ли текущий jvm системное свойство с определенным значением |
@ConditionalOnWebApplication | Является ли текущий весенний контекст веб-приложением |
Что ж, имея столько подготовительных знаний выше, мы можем приступить к написанию собственного стартера. | |
## рукописный стартер | |
### имя начального проекта | |
Стартер — это готовый компонент, который уменьшает ненужное дублирование кода и дублирование конфигурации. Например, если вы хотите использовать Spring и JPA для доступа к базе данных, вы можете сослаться на spring-boot-starter-data-jpa в своем проекте. |
Стартеры, официально определенные Spring, обычно называются в формате spring-boot-starter-{name}, например spring-boot-starter-web. Неофициальные стартовые имена должны иметь формат {имя}-spring-boot-starter, например, dubbo-spring-boot-starter.
необходимость
Напишите плагин сериализации, и вы можете свободно выбирать fastjson или gson.Если не выбрано, по умолчанию выбирается fastjson.
шаг
1. Создайте проект Spring Boot с именем jackformat-spring-boot-starter.
2. Введите зависимости
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<!-- 这个是用来提示用的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
</dependency>
3. Сначала определите форматированный интерфейс и напишите два класса реализации соответственно.
public interface FormatProcessor {
/**
* 定义一个格式化的方法
*
* @param obj
* @param <T>
* @return
*/
<T> String format(T obj);
}
4. Напишите класс конфигурации. Здесь используются условные аннотации. Если существуют классы fastjson и gson, будут загружены соответствующие классы реализации. Поскольку все они указаны в файле pom, они будут загружены здесь. Обратите внимание на @Primary, помеченный красным здесь. При наличии нескольких разных классов реализации для одного и того же интерфейса вводится @Autowired по типу. Не знаю, какой из них выбрать. Согласно второму требованию, если пользователь не выбирает Fastjson выбирается по умолчанию, поэтому реализация fastjson здесь отмечена @Primary.5. Класс конфигурации используется для чтения выбора пользователя.Функция аналогична @Value, но используется префикс jackxu.format, что более удобно.
6. Класс реализации сериализации, который предоставляется пользователям для сериализации.Вы также можете увидеть имя Template, такое как наш часто используемый RedisTemplate, JdbcTemplate, и конкретная реализация напрямую передается в конструктор.7. Ну, теперь самый важный основной класс. Давайте посмотрим на него сверху вниз. Как уже было сказано @Import, импорт класса конфигурации — это внедрение bean-компонентов в классе конфигурации в контейнер. @EnableConfigurationProperties — это свойство Class активация и внедрение в контейнер также могут быть выполнены в виде @Bean @Configuration указывает, что это класс конфигурации. Затем внедряем FormatTemplate в контейнер. Мы видим, что первое — это чтение свойств в классе свойств. Если это fastjson, он вернет реализацию fastjson. Если это gson, он вернет реализацию gson. Если он не читается, используйте предыдущие настройки Реализация @Primary по умолчанию.
8. Последний шаг является наиболее важной настройкой.Создайте файл META-INF/spring.factories в папке ресурсов.Благодаря вышеуказанным знаниям Spring Boot считывает класс конфигурации в файле при запуске, чтобы загрузить Bean в контейнер.
контрольная работа
1. Установите и упакуйте свой стартовый проект
2. Ссылайтесь на свой стартер в тестовом проекте.
3. Написать контроллер, тестовый класс и внедрить в него formatTemplate
4. Установите метод сериализации, который нам нужно сформулировать, здесь мы используем fastjson
5. Запустите проект Spring Boot
6. Через браузерный доступ обнаруживается, что здесь отображается сериализация в режиме fastjson, и она проходит успешно!
7. На пути тестирования gson возвращается реализация дефолтного gson, и тоже успешно!
8. В финальном тесте, если пользователь не выбирает, по умолчанию используется fastjson, и это полный успех!
Пока что это требование успешно выполнено.Я стараюсь рассказывать обо всех техниках, необходимых для написания стартера в процессе его выполнения, и соединять их воедино.Надеюсь всем понравится!
постскриптум
Друзья, Spring Boot используетсяотличныйЭто упрощает нам использование.Я тоже начал использовать SSM после выпуска в 14 лет.В то время разные конфигурации и зависимости,и разные XML были очень противны. Но теперь со Spring Boot мы можем быстро построить проект и запустить его за несколько минут.Времена меняются, и благодаря тому, что мы делаем нас все более и более удобными, в процессе удобства нам все же нужно немного разбираться в основополагающие принципы.Понимание, не плавая на нем, будет только использоваться, иначе будет неудобно найти раз есть проблема.
Эта статья познакомит вас с нижним уровнем Spring Boot, а также с созданием экземпляра SringApplication, установкой инициализаторов и прослушивателей, а также с некоторыми вещами, выполняемыми в методе run.Партнеры проводят собственные исследования. НаконецОригинал не прост, если вы считаете, что это хорошо написано, пожалуйста, поставьте лайк!