В последнее время разбираю публичный стартовый контент компании, а так же хочу написать статью о стартере, чтобы более несведущие партнеры могли освоить этот основной навык
В статье проектируется стартер с нуля до единицы, приводятся такие инструкции, как подключаемый стартер и конфигурация метаданных, а также сравнивается с zuul с открытым исходным кодом с точки зрения подключаемости.Я надеюсь, что мои друзья что-то получат после прочтения.
Схема статьи следующая:
- starter
- стартовое определение
- Преимущества для начинающих
- пользовательский стартер
- стартер нейминг
- Создайте проект SpringBoot
- конфигурация зависимости pom
- класс автоконфигурации
- spring.factories
- Упаковочный склад
- тестовый стартер
- Сменный стартер
- Индивидуальный сменный стартер
- zuul реализует подключаемый принцип
- метаданные конфигурации
- Вывод
Статья впервые опубликована из публичного аккаунта[Кружок интереса к исходному коду], впервые обратите внимание на общедоступную учетную запись, чтобы получить базовые базовые знания, была выпущена【45】статьиОригинальный технический пост в блоге
starter
стартовое определение
Стартер springboot похож на подключаемый механизм, отказываясь от предыдущей громоздкой конфигурации и интегрируя сложные зависимости в стартер.
Все зависимые модули следуют обычной конфигурации по умолчанию и позволяют нам настраивать эти конфигурации, то есть следовать концепции «соглашение важнее конфигурации».
Преимущества для начинающих
Появление starter значительно помогло разработчикам освободиться от громоздкой настройки фреймворка, чтобы они могли больше сосредоточиться на бизнес-коде.
И Springboot официально предоставляет начальные модули зависимостей для разных сценариев в дополнение к проектам корпоративного уровня, которые можно легко интегрировать в проект.
Например, проект springboot должен зависеть от redis, нам нужно только добавить зависимость spring-boot-starter-data-redis и настроить некоторую необходимую информацию о подключении.
Пользователям нужно только обратиться к начальным зависимостям, и Springboot может автоматически загружать зависимости конфигурации, необходимые для проекта, полностью избавляясь от различных ссылок на библиотеки зависимостей и проблем с версиями.
пользовательский стартер
стартер нейминг
Есть официальные требования к ArtifactId, определенные стартовым пакетом, конечно, вы можете их не соблюдать (ведь вы хозяин своего проекта)
Официальный стартер, предоставляемый Spring, обычно называется spring-boot-starter-{name}, например:
spring-boot-starter-web, spring-boot-starter-activemq и т. д., вот часть официального списка, подробности см. в стартовом списке springboot
Spring официально рекомендует, чтобы имя неофициально предоставленного стартера соответствовало формату {name}-spring-boot-starter.
Например, производства mybatis: mybatis-spring-boot-starter
Создайте проект SpringBoot
Стартер также создается на основе проекта Springboot, поэтому первым шагом должно быть создание проекта Springboot.
После создания проекта удалите ненужные файлы, каталог выглядит следующим образом:
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── cn
│ │ └── machen
│ │ └── starter
│ │ └── demospringbootstarter
│ └── resources
конфигурация зависимости pom
Зависимости в pom.xml очень лаконичны, за исключением основной информации о проекте и ссылки на родительский класс, просто обратитесь к spring-boot-starter.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.11.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.machen.starter</groupId>
<artifactId>demo-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
класс автоконфигурации
Создайте класс обслуживания, зарегистрированный как компонент Spring, и предоставьте метод sayHello для последующего тестирования.
public class ServiceBean {
public String sayHello(String name) {
return String.format("Hello World, %s", name);
}
}
Создайте класс автоматической конфигурации, объявите ServiceBean как bean-компонент и доставьте его в контейнер spring ioc после сканирования.
@Configuration
public class AutoConfigurationTest {
@Bean
public ServiceBean getServiceBean() {
return new ServiceBean();
}
}
spring.factories
Создайте новую папку META-INF в каталоге ресурсов проекта, а затем создайте файл spring.factories.
Определенный в файле autoconfigure указывает, что класс конфигурации является автоматически подключаемой конфигурацией.
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.machen.starter.demospringbootstarter.AutoConfigurationTest
Почему вы хотите указать ресурсы/META-INF для записи spring.factories? Нельзя так писать
SpringFactoriesLoader#loadFactories отвечает за завершение загрузки классов автоматической сборки, и именно этот переменный файл сканируется
Вы можете написать это, если вы не соблюдаете правила.Если вы не можете сканировать свой класс автоматической настройки, вы можете настроить его.Остановите это.
Упаковочный склад
На предоставляемый нами стартер должны ссылаться третьи стороны или другие наши проекты, поэтому нам необходимо упаковать проект и опубликовать его на складе.
Здесь давайте поговорим о знаниях команд maven.Как правило, команды, которые мы больше используем при упаковке, — это package, install и deploy.
Дело в том, что эти три команды можно запаковать, в чем разница?
упаковка:
Эта команда завершает три процесса компиляции проекта, модульного тестирования и упаковки функций.
установить:
Добавлен новый шаг в рамках команды package для развертывания нового типизированного пакета в локальном репозитории maven.
развертывать:
Добавлен новый шаг в предпосылке команды установки для развертывания нового типа пакета в удаленном хранилище (эквивалентно одновременному развертыванию одной копии локального и удаленного хранилищ).
И мы обращаемся только к локальному складу, нам нужно только выполнить команду установки Два метода: плагин maven или команда выполнения терминала.mvn clean install
Вы можете перейти к соответствующим координатам склада, чтобы проверить, успешно ли развернута банка.
тестовый стартер
Как мы проверяем, успешно ли создан новый стартер? Создайте новый проект для ссылки на координаты начального проекта.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.11.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.machen.starter</groupId>
<artifactId>demo-test-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 引入 starter 包 -->
<dependency>
<groupId>cn.machen.starter</groupId>
<artifactId>demo-spring-boot-starter</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
Поскольку это испытание,Какому стандарту он соответствует?
В соответствии с кодом, определенным в нашем стартере, пока проект демо-тестаОбратитесь к ServiceBean, чтобы распечатать соответствующую информацию.успех
Используйте проект в каталоге src-main-test для создания собственного тестового класса.
@SpringBootTest
class DemoTestSpringBootStarterApplicationTests {
@Autowired
private ServiceBean serviceBean;
@Test
void contextLoads() {
System.out.println(serviceBean.sayHello("machen"));
}
}
Запустите тестовый метод contextLoads, окончательный результатHello World, machen
Вы думали, что это закончилось? Нет нет нет, хардкор и сухие знания только начинаются
Сменный стартер
Индивидуальный сменный стартер
стартер есть стартер, как называетсяПодключаемый
Так называемый подключаемый модуль буквально означает, что, хотя я представил ваш стартовый пакет jar, вы можете судить, загружать ли вашу функцию через условия
Если условия соблюдены, загрузите соответствующую конфигурацию этой банки, если не устраивает, она будет прохладной и отдыхающей.
Существует много способов реализовать подключаемость с помощью префиксов ключей файла конфигурации или пользовательских аннотаций и т. д., но они не могут обойти условные аннотации Springboot.
Статья выполнена в виде заказная аннотация + условная аннотация.Остальное здесь не указано.Вы можете поискать в сети самостоятельно.
demo-spring-boot-starter
1) Сначала создайте пользовательскую аннотацию в проекте
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnableAutoConfigTest { }
2) Добавьте условные аннотации в класс AutoConfigurationTest, а затем переупакуйте его на локальный склад
@Configuration
@ConditionalOnBean(annotation = EnableAutoConfigTest.class)
public class AutoConfigurationTest {
@Bean
public ServiceBean getServiceBean() {
return new ServiceBean();
}
}
demo-test-spring-boot-starter
1) Обратитесь к аннотации @EnableAutoConfigTest в основной программе.
@EnableAutoConfigTest
@SpringBootApplication
public class DemoTestSpringBootStarterApplication {
public static void main(String[] args) {
SpringApplication.run(DemoTestSpringBootStarterApplication.class, args);
}
}
Проверьте подключаемый стартер
Запустите программу в тестовом классе выше, такая рутинная операция, естественно, может нормально напечатать наш Hello World
Тот, кто запускает программу, работает только нормально, верно? Удалите @EnableAutoConfigTest и попробуйте, чтобы убедиться, что это то, что нас приветствует.
Unsatisfied dependency expressed through field 'serviceBean'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'cn.machen.starter.demospringbootstarter.ServiceBean' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Конечно, в формальной обстановке не может быть так грубо, но идеи те же.
Перед тем, как принять участие в запуске бизнес-пакета поиска компании, он был завершен с использованием приведенной выше пользовательской аннотации в сочетании с условной аннотацией.
На самом деле, помимо подключаемой реализации в тексте, у springcloud zuul тоже подобная идея, потому что просто эта штука, цветком не поиграешь
zuul реализует подключаемый принцип
Обычно мы включаем функцию внедрения Zuul, настроив аннотацию zuul @EnableZuulProxy в классе конфигурации.
Об аннотации @Import в предыдущей статье# Глубокое понимание различных способов регистрации bean-компонентов Spring @Import.было подробно обсуждено
Взгляните на роль красного класса на картинке.
Узнайте из аннотаций к классу:
Отвечает за добавление маркерных компонентов для запуска активации {@link ZuulProxyAutoConfiguration}.
На самом деле, здесь уже очень ясно, но в соответствии с хорошим качеством быть ответственным до конца, продолжайте следить за
В соответствии с идеей нашего пользовательского подключаемого стартера выше, подключаемые функции реализуются через тег
Разница в том, что zuul использует бессмысленный bean-компонент для обозначения, а аннотацию, которую мы используем,
метаданные конфигурации
Я не знаю, есть ли у моих друзей сомнения в том, как этого добиться, когда они видят смарт-подсказку при вводе в файл конфигурации проекта?
Взяв в качестве примера server.xxx, откройте spring-configuration-metadata.json в исходном пакете springboot с сомнениями.
См. значение по умолчанию и знакомое описание? Разве это не значение по умолчанию и запрашиваемая выше информация?
Как появился этот файл? Есть два способа
- Создавая файл META-INF/spring-configuration-metadata.json, разработчики вручную настраивают
- Другой способ — автоматически генерировать, аннотируя @ConfigurationProperties.
Те, которые генерируются автоматически, нужно использовать в первую очередь, все-таки я такой ленивый человек. Для реализации конфигурации метаданных требуется всего три простых шага в стартовом пакете.
1) Добавьте пакет spring-boot-configuration-processor в ссылку pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
2) Напишите класс конфигурации Properties, используя пример swagger
@Data
@Configuration
@ConfigurationProperties(prefix = "swagger")
public class SwaggerProperties {
/**
* 文档扫描包路径
*/
private String basePackage = "";
/**
* title 示例: 订单创建接口
*/
private String title = "平台系统接口详情";
/**
* 服务条款网址
*/
private String termsOfServiceUrl = "https://www.xxxx.com/";
/**
* 版本号
*/
private String version = "V_1.0.0";
}
3) Наконец, выполните команду упаковки, чтобы обновить пакет jar локального хранилища.
mvn clean install
Затем обновите ссылку в проекте demo-test-spring-boot-starter, а затем протестируйте ее в application.properties.
Этот вид снаряжения x оружие необходимо популяризировать среди родственников и друзей [собачья голова]
Как реализован mybatis starter
Давайте процитируем связанные зависимости пакета pom.Если вы не можете найти связанные зависимости, вы можете выполнить поиск в общедоступном репозитории.
Адрес общего склада:mvnrepository.com/
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
Посмотрите, что входит в стартовый пакет mybatis, соответствует ли он нашей настройке
Зачем? Почему нет метаинформации о классе конфигурации, которая должна быть там? Щелкните файл pom.xml, который может найти ответ, и посмотрите.
Вы можете видеть, что pom.xml содержит зависимости mybatis-spring-boot-autoconfigure, mybatis, mybatis-spring.
И секрет действительно глобальной инициализации mybatis находится в mybatis-spring-boot-autoconfigure
Здесь очень ясно, что mybatis-spring-boot-autoconfigure содержит класс конфигурации инициализации MybatisAutoConfiguration, в котором выполняется инициализация, связанная с mybatis.
Чем конструкция стартера mybatis отличается от индивидуального стартера, о котором мы говорили выше?
mybatis starter ничего не делает, он просто комбинирует зависимости.Пакет autoconfigure играет роль инициализации.
Springboot тоже та же идея, но это унифицированное открытие реализации autoconfigure всех пакетов.Вы поймете, когда посмотрите на spring-boot-autoconfigure-xxx.jar
В нашем пользовательском стартере нет необходимости полагаться на пакет автонастройки.Они не имеют ничего общего с правильным или неправильным, а являются просто воплощением разных дизайнов.Здесь нет никаких предложений, это зависит от личных предпочтений.
Какие? Вы сказали следовать мейнстриму и строго реализовывать идею Springboot?
Я ожидал, что вы так думаете, поэтому мы также переместили игроков-тяжеловесов в netflix.
Те, кто понимает, поймут естественно и реализуют стартер по настроению Интернет-люди, которые целыми днями пишут баги~
Вывод
Прошла неделя с момента публикации последней статьи, за это время было сделано три вещи, а именно:
- Понимание концепций DevOps и оптимизация части компонентов DevOps компании
- Завершено создание сайта личного технического блога
- Открыта функция сообщения путем переноса официальной учетной записи
DevOps
Раньше у автора не было большого контакта с DevOps, поэтому потребовалось некоторое время, чтобы понять концепцию с самого начала.
- Что такое каскадное развитие? Каковы плюсы и минусы?
- Что такое гибкая разработка? Каковы плюсы и минусы?
- Что такое DevOps? Что такое CI/CD?
После этих нескольких дней понимания, создания и использования основных компонентов мастерство стало намного лучше, чем раньше, и урожая все еще довольно много.
Зачем создавать личный блог?
Считается, что иметь личный технический блог — это идея многих программистов, и я, конечно, не исключение, в апреле 2019 года я построил статическую систему блогов через hexo.
Но в то время в блоге было полно наворотов, а сейчас я предпочитаю более простой стиль, как показано на рисунке:
Добро пожаловать в гостиblog.machen.me/
Сообщение публичного аккаунта
Официальный аккаунт зарегистрирован в 18 лет, и функции сообщения нет, но мне так больше нравится
Потому что, оставив сообщение, вы можете лучше распознать контент, который нужно улучшить или неправильно, благодаря отзывам читателей и друзей.
После переноса функции сообщения с официального аккаунта, это первая опубликованная статья, если вы это видите, вы можете оставить сообщение и протестировать его.
Рекомендуемое чтение:
- [Настоятельно рекомендуется] Используйте новую функцию ParallelStream JDK 8 с осторожностью.
- [Настоятельно рекомендуется] Быстро понять, как Redisson реализует принцип распределенных блокировок.
- [Настоятельно рекомендуется] Поговорим о ReentrantLock и AQS.
- [Вопросы интервью с Дачангом] Как быстро выполнять задачи, не превышая максимальное количество потоков в пуле потоков JDK
- [Вопросы интервью с Дачангом] Как пул потоков JDK гарантирует, что основные потоки не будут уничтожены
Автор Ма Хуа — программист-Дева, который координирует разработку серверной части Java в Imperial Capital, вдохновляющий программист-Дева, который фокусируется на высоком уровне параллелизма, базовом исходном коде фреймворка и распределенном обмене знаниями.