(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