首先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项目才可开启配置。