首页 > 其他分享 >了解一下Spring Boot中@SpringBootApplication 注解

了解一下Spring Boot中@SpringBootApplication 注解

时间:2022-11-04 23:33:21浏览次数:71  
标签:org Spring SpringBootApplication Boot springframework ComponentScan 注解 import an

(Spring Boot中@SpringBootApplication 注解)

@SpringBootApplication注解

SpringBootApplication注解位于spring-boot-autoconfigure 工程的org.springframework.boot.autoconfigure 包中,定义代码如下:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;

@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 {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "nameGenerator"
    )
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

@SpringBootApplication 注解显得有点复杂。可以通过 exclude和excludeName 属性来配置不需要实现自动装配的类或类名,也可以通过 scanBasePackages和scanBasePackageClasses 属性来配置需要进行扫描的包路径和类路径。 注意到 @SpringBootApplication注解实际上是一个组合注解,它由三个注解组合而成,分别是 @SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan。

@ComponentScan 注解 @ComponentScan 注解不是 Spring Boot 引入的新注解,而是属于 Spring 容器管理的内容。@ComponentScan 注解就是扫描基于 @Component 等注解所标注的类所在包下的所有需要注入的类,并把相关 Bean 定义批量加载到容器中。显然,Spring Boot 应用程序中同样需要这个功能。

@SpringBootConfiguration 注解 @SpringBootConfiguration 注解比较简单,事实上它是一个空注解,只是使用了 Spring 中的 @Configuration 注解。@Configuration 注解比较常见,提供了 JavaConfig 配置类实现。

@EnableAutoConfiguration 注解 @EnableAutoConfiguration 注解是我们需要重点剖析的对象,下面进行重点展开。该注解的定义如下代码所示:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    Class<?>[] exclude() default {};
    String[] excludeName() default {};
}

常见注解

实际上,Spring Boot 中提供了一系列的条件注解,常见的包括: @ConditionalOnProperty:只有当所提供的属性属于 true 时才会实例化 Bean @ConditionalOnBean:只有在当前上下文中存在某个对象时才会实例化 Bean @ConditionalOnClass:只有当某个 Class 位于类路径上时才会实例化 Bean @ConditionalOnExpression:只有当表达式为 true 的时候才会实例化 Bean @ConditionalOnMissingBean:只有在当前上下文中不存在某个对象时才会实例化 Bean @ConditionalOnMissingClass:只有当某个 Class 在类路径上不存在的时候才会实例化 Bean @ConditionalOnNotWebApplication:只有当不是 Web 应用时才会实例化 Bean 当然 Spring Boot 还提供了一些不大常用的 @ConditionalOnXXX 注解,这些注解都定义在 org.springframework.boot.autoconfigure.condition 包中。

标签:org,Spring,SpringBootApplication,Boot,springframework,ComponentScan,注解,import,an
From: https://blog.51cto.com/u_15312559/5824905

相关文章

  • SpringMVC
    《解释一下tomcat服务器中ApplicationContext与thymeleaf在解析路径时的问题》《关于tomcat》在我们将项目部署到tomcat服务器上的时候,经常要配置如下的:  我们知道......
  • spring源码学习(九)springAOP实现过程
    一、aop中所需要的beanDefinition对象的解析   当xml文件解析到<aop:config>这个节点时,就会解析aop所需要的所有对象1、在解析到<aop:config>节点时,会......
  • Spring Cloud基本介绍
    ✨SpringCloud基本介绍​​1.微服务中的相关概念​​​​1.1服务的注册与实现​​​​1.2负载均衡​​​​1.3熔断​​​​1.4链路追踪​​​​1.5API网关​​​​2.Spri......
  • Spring Boot集成Restful Api在线文档接口调试工具 Swagger
    文章目录​​一、Swagger简介​​​​Swagger有什么用?​​​​二、环境准备​​​​三、构建SpringBoot工程​​​​四、引入Swagger依赖​​​​五、编写一个Test控制器​......
  • Spring Boot + Mybatis + 二级缓存实例(Ehcache,Redis)
     使用Mybatis自带二级缓存MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。MyBatis3中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于......
  • Redis Desktop Manager连不上服务器的redis; Java 死锁; 泛型; 事务; servlet; Spring事务;
    RedisDesktopManager连不上服务器的redis1、首先有没有设置密码,输入的密码是否正确2、那个IP是内网IP嘛?外网的要加SSH总结一下无论是连MySQL、MongoDB、还是redisip如果......
  • 首选线程池,而不是多线程; 创建线程的方法; 存储过程和for循环插入数据; String字符串一般
    首选线程池,而不是多线程首选线程池,而不是多线程/**corePoolSize:线程长期为维持线程数核心线程数,常用线程数maximumPoolSize:线程数的上限,最大线程数keepAliveTime:超过线......
  • SpringCloud学习笔记
    一、服务注册中心Eurekaeureka-client服务发现:从注册中心上获取服务信息服务注册:将服务信息注册进注册中心依赖引入<!--EurekaClient端依赖-->......
  • Spring事务简介
    1、事务作用:在数据层保证一系列的数据库操作同成功同失败Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败2、例子:模拟银行账户间转账业务  步骤......
  • springboot应用Oauth2.0授权框架
    前言:所有代码来源于mall4j开源版本(gtieehttps://gitee.com/gz-yami/mall4j?utm_source=alading&utm_campaign=repo),仅供学习使用,详细代码请看源代码。一、token存储处理类......