[SpringBoot2.x] — ядро ​​Spring Boot (принцип и реализация кода)

Spring Boot

Код реализует github:GitHub.com/ccAsk Me-Contact/SPR…

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

Как работает SpringBoot:

  • Начальный класс и @SpringBootApplication
  • Starter pom

Основные примечания:

  • Разбор аннотаций
  • настроить

Базовая конфигурация:

  • конфигурация баннера
  • Файлы конфигурации Spring Boot (свойства, yaml)
  • конфигурация xml-файла

Внешняя конфигурация:

  • Конфигурация параметров командной строки
  • Общая конфигурация свойств, типобезопасная конфигурация

Конфигурация журнала:

  • Поддерживает Log4J, Log4J2 и Logback (по умолчанию)

Конфигурация профиля:

  • Разные среды соответствуют разным конфигурациям: application-{profile}.properties

Базовая конфигурация

конфигурация баннера

Создайте новый файл banner.txt в папке src/main/resources. Banner.txt можно передать черезПерсонажи, созданные веб-сайтомГенерируется автоматически. Код для запуска выключения выглядит следующим образом:

@SpringBootApplication
public class BaseSpringBootApplication {

    public static void main(String[] args) {

        //关闭banner
        SpringApplication application = new SpringApplication(BaseSpringBootApplication.class);
        //application.setBannerMode(Banner.Mode.OFF);
        application.run();
        //使用fluent API修改
       /* new SpringApplicationBuilder(BaseSpringBootApplication.class)
                .bannerMode(Banner.Mode.OFF)
                .run();*/

    }
}

Файлы конфигурации Spring Boot (свойства, yaml)

Файл конфигурации application.properties или application.yml можно использовать и поместить в любой каталог в каталоге src/main/resources. Как показано ниже:

конфигурация xml-файла

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

//导入Spring的配置文件,让配置文件里面的内容生效
@ImportResource(locations = {"classpath:base.xml"})
@Configuration
public class LoadXmlFileConfiguration {
//加载base.xml文件下的bean到IOC容器中
}

Внешняя конфигурация

Конфигурация параметров командной строки

Его можно настроить непосредственно через командную строку при запуске следующим образом:

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

Более подробное использование параметров можно просмотреть.

Общая конфигурация свойств, типобезопасная конфигурация

Чтобы вводить значения через @Value, вам нужно только определить свойства в свойствах или файле yaml и использовать @Value для прямого внедрения.Вы также можете связать свойства или свойства yaml с bean-компонентом и его свойствами через @ConfigurationProperties для достижения типа -безопасная конфигурация. Код выглядит следующим образом:

//通过@ConfigurationProperties加载properties文件属性
//可使用perfix前缀指定加载properties文件属性,通过location加载指定文件
@ConfigurationProperties(prefix = "project")
@Configuration
public class AutoConfigurationProperties {
    @Value("${project.name}")
    private String projectName;
    @Value("project.author")
    private String projectAuthor;

    public String getServerInfo() {
        System.out.println("projectName:" + projectName + "projectAuthor:" + projectAuthor);
        return "projectName:" + projectName  +" ----" + "projectAuthor:" + projectAuthor;
    }
}

конфигурация журнала

Spring Boot по умолчанию использует Logback в качестве среды ведения журнала, а также поддерживает Java Util Logging, Log4J и Log4J2.

журнал с высокого на низкий уровень:

  • Уровень OFF: самый высокий уровень, используемый для отключения всех
  • Уровень FATAL: Указывает, что каждая серьезная ошибка приведет к завершению работы приложения.
  • Уровень ERROR: указывает на то, что хотя событие ошибки и происходит, оно все же не влияет на дальнейшую работу системы.
  • Уровень ПРЕДУПРЕЖДЕНИЯ: Указывает на возможную ошибочную ситуацию.
  • Уровень INFO: запущенный процесс приложения
  • Уровень DEBUG: уровень отладки приложения.
  • TRACE : журнал сообщений о событиях
  • ALL: это самый низкий уровень, который используется для включения всех журналов.

Конфигурация журнала следующая:

<?xml version="1****.0" encoding="UTF-8"?>
<Configuration status="WARN">
	<Properties>
		<Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
		<Property name="LOG_LEVEL_PATTERN">%5p</Property>
		<Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
		<Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{%pid}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
		<Property name="FILE_LOG_PATTERN">%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} %pid --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
	</Properties>
	<Appenders>
		<Console name="Console" target="SYSTEM_OUT" follow="true">
			<PatternLayout pattern="${sys:CONSOLE_LOG_PATTERN}" />
		</Console>
	</Appenders>
	<Loggers>
		<Logger name="com.cn.ccww.*" level="info" />
		<Root level="info">
			<AppenderRef ref="Console" />
		</Root>
	</Loggers>
</Configuration>

Конфигурация профиля

Разным средам соответствуют разные конфигурации: application-{profile}.properties, а также установка в application.properties spring.profiles.active=prod, чтобы указать активный профиль. Как показано ниже:

Как работает SpringBoot

Начальный класс и @SpringBootApplication

  Обычно определяют класс XXXApplication и используют аннотацию @SpringBootApplication в качестве класса запуска, в классе входа есть основной метод и используют SpringApplication.run (XXXApplication.class, args) для запуска проекта приложения Spring Boot.

  @SpringBootApplication — это основная аннотация Spring Boot, это Составная аннотация, основная функция которой обеспечивается аннотацией @EnableAutoConfiguration и импортируется в класс EnableAutoConfigurationImportSelector с помощью аннотации @Import для достижения автоматической настройки.

Исходный код @SpringBootApplication:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM,
				classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    ....
}

Подробный исходный код @SpringBootApplication можно посмотреть в статьеКраткий и понятный анализ исходного кода аннотации @SpringBootApplication]

Starter pom

  Spring Boot предоставляет нам начальный pom, который упрощает большинство сценариев разработки на уровне предприятия. Техническая конфигурация будет устранена, и мы сможем получить автоматически настроенные bean-компоненты, предоставляемые Spring Boot.

Общие стартеры:

имя описывать
spring-boot-starter Стартер ядра Spring Boot, включая автоматическую настройку, ведение журнала, поддержку файла конфигурации yaml
spring-boot-starter-activemq Использование Apache ActiveMQ для JMS
spring-boot-starter-amqp Использование Spring AMQP, Rabbit MQ
spring-boot-starter-aop Аспектно-ориентированное программирование через Spring AOP, AspectJ
spring-boot-starter-cache Поддержка кэширования с использованием кэширования Spring
spring-boot-starter-data-cassandra Используя распределенную базу данных Cassandra, Spring Data Cassandra
spring-boot-starter-data-elasticsearch Использование Elasticsearch, аналитического движка, Spring Data Elasticsearch
spring-boot-starter-data-jdbc Использование JDBC с пулом соединений Tomcat JDBC
spring-boot-starter-data-jpa Использование Spring Data JPA с Hibernate (Spring-data-jpa зависит от Hibernate)
spring-boot-starter-data-mongodb Используйте базу данных хранилища файлов MongoDB, Spring Data MongoDB
spring-boot-starter-data-neo4j Использование графовой базы данных Neo4j, Spring Data Neo4j
spring-boot-starter-data-redis Используйте базу данных хранилища ключей Redis через Spring Data Redis, клиент Jedis
spring-boot-starter-data-rest Предоставление репозиториев Spring Data REST полностью с использованием Spring Data REST
spring-boot-starter-data-solr Использование поисковой системы Apache Solr с Spring Data Solr
spring-boot-starter-freemarker Сделать так, чтобы веб-приложения MVC поддерживали FreeMarker, аналогично JSP.
spring-boot-starter-groovy-templates Включение веб-приложений MVC для поддержки шаблонов Groovy
spring-boot-starter-integration Используйте Spring Integration, API, созданный Spring Framework для интеграции корпоративных приложений (EAI).
spring-boot-starter-json Чтение и запись с использованием Json
spring-boot-starter-mail Отправка поддержки с помощью Java Mail, электронной почты Spring
spring-boot-starter-oauth2-client Подключайте клиентов, используя OAuth2 или OpenID Spring Security.
spring-boot-starter-quartz Использование планировщика Quartz
spring-boot-starter-security Использование среды безопасности Spring Security
spring-boot-starter-test Протестируйте приложения Spring Boot, включая JUnit, Hamcrest, Mockito.
spring-boot-starter-thymeleaf Включить веб-приложения MVC для поддержки Thymeleaf, аналогично JSP
spring-boot-starter-validation Использование Java Bean Validation через Hibernate Validator, Bean Validation — это спецификация проверки данных; Hibernate Validator — это среда проверки данных.
spring-boot-starter-web Создавайте веб-сайты, включая фреймворк в стиле RESTful SpringMVC и встроенный контейнер Tomcat по умолчанию.
spring-boot-starter-webflux Поддержка создания приложений WebFlux с использованием Reactive Web Spring Framework.
spring-boot-starter-websocket Создание приложений WebSocket с помощью Spring WebSocket

Для более подробных стратегов вы можете просмотреть официальную документацию13.5 Starters

пользовательский стартер

  Пользовательский стартер можно посмотреть[SpringBoot] -- пользовательский стартер (принцип и реализация кода)]

основная аннотация

  Условные аннотации основных аннотаций находятся в пакете org.springframwork.boot.autoconfigure.condition, которые объединены метааннотацией @Conditional.Дополнительные сведения об аннотации см. в статье[Рекомендуемая серия коллекций: Spring boot 2.x Annotation Daquan (постоянно обновляется....)].

аннотация Разобрать
@ConditionalOnBean Когда в контейнере есть указанный компонент.
@ConditionalOnClass Когда в пути к классам есть указанный класс.
@ConditionalOnExpression На основе выражения SpEL в качестве условия суждения.
@ConditionalOnJava На основе версии JVM в качестве условия суждения.
@ConditionalOnJndi Находит указанное местоположение, если существует JNDI.
@ConditionalOnMissingBean Когда в контейнере не указан bean-компонент.
@ConditionalOnMissingClass Когда в пути к классам нет указанного класса.
@ConditionalOnNotWebApplication При условии, что текущий проект не является веб-проектом.
@ConditionalOnProperty Имеет ли указанное свойство указанное значение.
@ConditionalOnResource Имеет ли classpath указанное значение.
@ConditionalOnSingleCandidate Когда в контейнере находится только один указанный компонент или хотя их несколько, указывается предпочтительный компонент.
@ConditionalOnWebApplication При условии, что текущий проект является веб-проектом

Анализ исходного кода:

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnBeanCondition.class)
public @interface ConditionalOnMissingBean {
    .....
}

Среди них класс OnBeanCondition для @Conditional — это реализация @ConditionalOnMissingBean, которую можно настраивать.Подробности см. в следующем разделе.

Пользовательский класс условной реализации:

Реализуйте условный класс реализации, который определяет, соответствуют ли условия системы Windows, код выглядит следующим образом:

//判断是否windows系统
public class WindowsCondition implements Condition {

    private final static String WINDOWS="Windows";

    /**
     * ConditionContext:判断条件能使用的上下文(环境)
     * AnnotatedTypeMetadata:注释信息
     */
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //获取当前环境变量
        Environment environment=conditionContext.getEnvironment();
        //获取bean注册器
        BeanDefinitionRegistry registry = conditionContext.getRegistry();
        //能获取到ioc使用的beanfactory
        ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
        //获取环境变量中操作系统
        String property = environment.getProperty("os.name");
        //判断操作系统是否为windows
        if(property.contains(WINDOWS)){
            //判断是否存在baseWindowsSevice类,不存在则进行bean注册
            boolean isWindowsSevice = registry.containsBeanDefinition("baseWindowsSevice");
            if(!isWindowsSevice){
                //指定Bean定义信息;(Bean的类型,Bean的一系列信息)
                RootBeanDefinition beanDefinition = new RootBeanDefinition(BaseWindowsService.class);
                //注册一个Bean,指定bean名
                registry.registerBeanDefinition("baseWindowsSevice", beanDefinition);
                BaseWindowsService windowsSevice = (BaseWindowsService)beanFactory.getBean("baseWindowsSevice");
                windowsSevice.addServiceName("ccww---baseWindowsSevice");
            }
            return true;
        }
        return false;
    }
}

Наконец, вы можете обратить внимание на публичный аккаунт, учиться вместе, делиться галантерейными товарами каждый день и получать обучающие видео!