SpringBoot注解的作用--核心注解总结

首先Spring Boot项目中都会如下启动类:

@SpringBootApplication  
public class Application {  
    public static void main(String[] args) {  
        SpringApplication.run(Application.class, args);  
    }  
} 

从上面代码可以看出,注解@SpringBootApplication和SpringApplication.run()方法是最为重要的部分。这里主要来看看@SpringBootApplication注解部分。

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

虽然定义使用了多个Annotation进行了原信息标注,但实际上重要的只有三个Annotation:

@Configuration(@SpringBootConfiguration点开查看发现里面还是应用了@Configuration)
@EnableAutoConfiguration
@ComponentScan
如果在启动类使用这个三个注解,整个SpringBoot应用依然可以与之前的启动类功能一样。但每次写这3个比较啰嗦,所以写一个@SpringBootApplication方便点。

这三个注解中@Configuration和@ComponentScan对我们来说并不陌生,来看一下@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 {};
}

其中最关键的要属@Import(AutoConfigurationImportSelector.class),借助AutoConfigurationImportSelector.class,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。

借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成!

在AutoConfigurationImportSelector类中可以看到通过 SpringFactoriesLoader.loadFactoryNames()把 spring-boot-autoconfigure.jar/META-INF/spring.factories中每一个xxxAutoConfiguration文件都加载到容器中,spring.factories文件里每一个xxxAutoConfiguration文件一般都会有下面的条件注解,这里解释一下:

@ConditionalOnClass : classpath中存在该类时起效
@ConditionalOnMissingClass : classpath中不存在该类时起效
@ConditionalOnBean : DI容器中存在该类型Bean时起效
@ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
@ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效
@ConditionalOnExpression : SpEL表达式结果为true时
@ConditionalOnProperty : 参数设置或者值一致时起效
@ConditionalOnResource : 指定的文件存在时起效
@ConditionalOnJndi : 指定的JNDI存在时起效
@ConditionalOnJava : 指定的Java版本存在时起效
@ConditionalOnWebApplication : Web应用环境下起效
@ConditionalOnNotWebApplication : 非Web应用环境下起效

SpringBoot汇总:(陆续添加)

1.@SpringBootApplication

是SpringBoot的启动类注解,SpringBoot项目的启动入口main()方法所在的类必须使用此注解标注。用于Spring主类上最核心的注解,自动化配置文件,表示这是一个SpringBoot项目,用于开启SpringBoot的各项能力。

相当于@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解的组合。

2.@EnableAutoConfiguration

开启这个注解之后,允许SpringBoot自动配置,尝试根据你添加的jar包依赖自动配置你的Spring应用。它是@AutoConfigurationPackage和Import(AutoConfigurationImportSelector.class)注解的组合。

例如:当前路径下有MyBatis这个Jar包,MyBatisAutoConfiguration 注解就能根据相关参数来配置Mybatis的各个Spring Bean。

3.@AutoConfigurationPackage

AutoConfigurationPackage注解的作用是将添加该注解的类所在的package 作为自动配置的package进行管理。即可以通过 AutoConfigurationPackage 注解的工具类获取自动配置package列表。当通过注解@SpringBootApplication标注启动类时,已经为启动类添加了@AutoConfigurationPackage注解。路径为 @SpringBootApplication -> @EnableAutoConfiguration -> @AutoConfigurationPackage。也就是说当SpringBoot应用启动时默认会将启动类所在的包(package)作为自动配置的包(package)。

4.@Configuration

Spring 3.0添加的一个注解,用来代替applicationContext.xml配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在的类来进行注册。即通过对bean对象的操作代替spring中xml文件。

5.@SpringBootConfiguration

@SpringBootConfiguration注解是@Configuration注解的派生注解,和@Configuration注解的功能一致,标注这个类是一个配置类。只不过@SpringBootConfiguration注解是SpringBoot的注解,@Configuration注解是Spring的注解。

6.@Import

Spring 3.0添加注解,用来导入一个或者多个@Configuration注解修饰的配置类。

直接导入普通类;

导入实现了ImportSelector接口的类;

导入实现了ImportBeanDefinitionRegister接口的类;

7.@ComponentScan

Spring 3.1添加的一个注解,用来代替配置文件中的component-scan配置,开启组件扫描,可自动发现和配置一些bean(自动扫描包路径下的@Component注解进行注册的bean实例)。

8.@Conditional

Spring 4.0添加的一个注解,用来标识一个Spring Bean或者Configuration配置文件,当满足指定条件才开启配置。

9.@ConditionalOnBean

组合@Conditional注解,当容器中有指定Bean才开启配置。

10.@ConditionalOnMissingBean

组合@Conditional注解,当容器中没有值当Bean才可开启配置。

11.@ConditionalOnClass

组合@Conditional注解,当容器中有指定Class才可开启配置。

10.@ConditionalOnMissingClass

组合@Conditional注解,当容器中没有指定Class才可开启配置。

12.@ConditionOnWebApplication

组合@Conditional注解,当前项目类型是WEB项目才可开启配置。

项目有以下三种类型:

① ANY:任意一个Web项目

② SERVLET: Servlet的Web项目

③ REACTIVE :基于reactive-base的Web项目

13.@ConditionalOnProperty

组合@Conditional注解,当指定的属性有指定的值时才可开启配置。

14.@ConditionalOnExpression

组合@Conditional注解,当SpEl表达式为true时才可开启配置。

15.@ConditionOnJava

组合@Conditional注解,当运行的Java JVM在指定的版本范围时才开启配置。

16.@ConditionalResource

组合@Conditional注解,当类路径下有指定的资源才开启配置。

17.@ConditionOnJndi

组合@Conditional注解,当指定的JNDI存在时才开启配置。

18.@ConditionalOnCloudPlatform

组合@Conditional注解,当指定的云平台激活时才可开启配置。

19.@ConditiomalOnSingleCandidate

组合@Conditional注解,当制定的Class在容器中只有一个Bean,或者同时有多个但为首选时才开启配置。

20.@ConfigurationProperties

用来加载额外的配置(如.properties文件),可用在@Configuration注解类或者@Bean注解方法上面。可看一看Spring Boot读取配置文件的几种方式。

21.@EnableConfigurationProperties

一般要配合@ConfigurationProperties注解使用,用来开启@ConfigurationProperties注解配置Bean的支持。

22.@AntoConfigureAfter

用在自动配置类上面,便是该自动配置类需要在另外指定的自动配置类配置完之后。如Mybatis的自动配置类,需要在数据源自动配置类之后。

23.@AutoConfigureBefore

用在自动配置类上面,便是该自动配置类需要在另外指定的自动配置类配置完之前。

24.@IMportReSource

Spring 3.0添加注解,用来导入一个或者多个Spring配置文件,这对Spring Boot兼容老项目非常有用,一位内有些配置文件无法通过java config的形式来配置.

25.@ConditionOnNotWebApplication

组合@Conditional注解,当前项目类型不是WEB项目才可开启配置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章