springboot注解@SpringBootApplication分析
@SpringBootApplication注解用在Spring Boot的入口类上面,是Spring Boot提供的应用启动相关的注解。
直接上注解的源码:
@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, attribute = "exclude") Class<?>[] exclude() default {}; @AliasFor(annotation = EnableAutoConfiguration.class, attribute = "excludeName") String[] excludeName() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackages") String[] scanBasePackages() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses") Class<?>[] scanBasePackageClasses() default {};
}
@SpringBootApplication是一个复合注解
查看源码,可以发现@SpringBootApplication是一个复合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan三个注解。
对这三个注解进行逐一解析:
@SpringBootConfiguration
@SpringBootConfiguration继承自@Configuration,二者的功能也一致,用于标注当前类是配置类,并且会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到Spring容器中,且实例名就是方法名。
@SpringBootConfiguration和@Configuration都可以理解为Spring传统XML配置里的<beans>标签,而@Bean则是<bean>标签。
@Configuration和@Bean并不是Spring Boot的特有标签,普通的Spring项目也可以使用,只是普通的Spring项目在使用大多数注解的时候要扫包才能生效,要注意加上扫包配置<context:component-scan base-package="com.yanggb.xxx" />。而Spring Boot只需要保证启动启动main入口在这些类的上层包就行,不需要特别加上扫包配置。
Spring传统XML配置:
<beans> <bean id="car" class="com.yanggb.Car"> <property name="wheel" ref="wheel"></property> </bean> <bean id="wheel" class="com.yanggb.Wheel"></bean> </beans>
Spring新型注解配置:
@Configuration // 相当于<beans> public class CarConfig { @Bean // 相当于<bean> public Car car() { Car car = new Car(); car.setWheel(wheel()); // 相当于<property> return car; } @Bean public Wheel wheel() { return new Wheel(); }
}
两种方式最后产生的结果是相同的。
@EnableAutoConfiguration
@EnableAutoConfiguration的作用是启动自动配置,意思是Spring Boot会根据你添加的jar包来配置你项目的默认设置,比如你添加了Spring Boot提供的spring-boot-starter-web依赖,其中包含了Tomcat和Spring MVC,这个注释就会假设你正在开发一个Web应用程序,自动地帮你添加Web项目中所需要的Spring配置。
@ComponentScan
@ComponentScan的作用是扫描当前包及其子包下被@Component注解标记的类并纳入到Spring容器中进行管理。是Spring传统XML配置的<context:component-scan>的替代。
@Controller,@Service,@Repository是@Component的子注解,所以也会被@ComponentScan扫描并做和@Component相同的处理。
@ComponentScan提供了basePackage参数定义要扫描的包,如果不设置,默认会扫描包的所有类,即默认扫描**/*.class路径,建议加上该参数以减少加载的时间。
@SpringBootApplication提供的参数
exclude
exlude参数继承自@EnableAutoConfiguration注解的同名参数,根据class来排除特定的类加入Spring容器,传入参数的value类型是class类型数组。
@SpringBootApplication(exclude = {Good.class, Bad.class})
excludeName
exludeName参数继承自@EnableAutoConfiguration注解的同名参数,根据className来排除特定的类加入Spring容器,传入参数的value类型是class的全类名字符串数组。
@SpringBootApplication(excludeName = {"com.yanggb.xxx.Good", "com.yanggb.yyy.Bad"})
exclude和excludeName可以用来关闭指定的自动配置,比如关闭数据源相关的自动配置。
scanBasePackages
scanBasePackages参数继承自@ComponentScan注解的basePackages参数,指定要扫描的包,传入参数的value类型是包名的字符串数组。
@SpringBootApplication(scanBasePackages = {"com.yanggb.xxx", "com.yanggb.yyy"})
scanBasePackageClasses
scanBasePackageClasses参数继承自@ComponentScan注解的basePackageClasses参数,指定要扫描的包,传入参数的value类型是包名的字符串数组。
@SpringBootApplication(scanBasePackageClasses = {Good.class, Bad.class})
"到后来,我们只是会说对此无能为力。"