Spring Boot 工程的主函数
@SpringBootApplication()
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(WhidsSsApplication.class, args);
}
}
@SpringBootApplication
该注解是 @SpringBootConfiguration
,@EnableAutoConfiguration
,@ComponentScan
三个注解的组合,这是在 Spring Boot 1.5 以后为这三个注解做的一个简写。
@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
1. @SpringBootConfiguration
申明该类为 Spring Boot 的总 @Configuration
,而 @Configuration
继承自 @Component
,表示当前类为受 Spring IOC 容器管理的配置类。
我们可以搭配 @Bean
注解使用,如下,功能类似于 Spring 项目中的 xml 配置文件
@Configuration
public class Conf {
@Bean
public Filter initFilter() {
return new Filter();
}
}
2. @EnableAutoConfiguration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration
作用是从 classpath
中搜寻所有的 META-INF/spring.factories
配置文件,并将其中 org.springframework.boot.autoconfigure.EnableutoConfiguration
对应的配置项通过反射实例化为对应的标注了 @Configuration
的 JavaConfig
形式的 IOC 容器配置类,然后汇总为一个并加载到 IOC 容器。
@EnableAutoConfiguration
借助 @Import
的帮助,将所有符合自动配置条件的 Bean 定义加载到 IOC 容器。一般在各类的 spring-boot-starter
中被使用,使得各个 starter 提供的配置类可以被自动加载。
@Import
@Import
注解用来帮助我们把一些需要定义为 Bean 的类导入到 Spring IOC 容器里面
-
@Import
引入普通类
@Import
引入普通的类可以帮助我们把普通的类定义为 Bean。正如源码中的备注一样,“as well as regular component”,说明 Import 可以像类似于@Component
功能的注解一样,在容器启动的时候将此类定义为一个 Bean ,并将此 Bean 交于容器管理,但此用法较少。 -
@Import
引入配置类(@Configuration
修饰的类)
让配置类生效(配置类下的所有 Bean 添加到 Spring IOC 容器里面去)。在自定义 starter 的时候经常会用到。普通的@Configuration
类是不需要 import 的,因为是在 Spring Boot 的扫描目录下,所以第三方的 jar 包中才会需要。 -
@Import
引入ImportSelector
的实现类
把ImportSelector
接口selectImports()
方法返回的 Class 都定义为 bean。在 Spring Boot 的自动化配置和@EnableXXX
(功能性注解)都有它的存在。
/**
* Select and return the names of which class(es) should be imported based on
* the {@link AnnotationMetadata} of the importing @{@link Configuration} class.
* @return the class names, or an empty array if none
*/
String[] selectImports(AnnotationMetadata importingClassMetadata);
@Import
引入ImportBeanDefinitionRegistrar
的实现类
@Import
引入ImportBeanDefinitionRegistrar
的实现类,一般用来动态注册 Bean。最重要的一点是还可以对这些BeanDefinition
进行额外的修改或增强。
如果在第三方包中,也不是确定的类,那么如果找到这些类放到 Spring 的容器呢?
这时候就用到了用注解@Import
引入ImportBeanDefinitionRegistrar
子类的方式,最典型的应用就是mybatis
,使用工具自动生成了一批mapper
和entity
,而如何把这些普通的类放入容器,就是通过注解。
典型代表@MapperScan
,@MapperScan
用@Import
引入了MapperScannerRegistrar
类,这个类里会取得注解@MapperScan
作设置的package
,然后扫描这个package
下所有的类,并放入容器中。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(MapperScannerRegistrar.class)
@Repeatable(MapperScans.class)
public @interface MapperScan
3. @ComponentScan
自动扫描并加载符合条件的组件,将这些 bean 定义加载到 IOC 容器中。因为 Spring Boot 的启动类一般放在根目录下,所以默认不指定扫描路径.