【SpringBoot】启动过程之——注解

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 对应的配置项通过反射实例化为对应的标注了 @ConfigurationJavaConfig 形式的 IOC 容器配置类,然后汇总为一个并加载到 IOC 容器。

@EnableAutoConfiguration 借助 @Import 的帮助,将所有符合自动配置条件的 Bean 定义加载到 IOC 容器。一般在各类的 spring-boot-starter 中被使用,使得各个 starter 提供的配置类可以被自动加载。

@Import

@Import 注解用来帮助我们把一些需要定义为 Bean 的类导入到 Spring IOC 容器里面

  1. @Import 引入普通类
    @Import 引入普通的类可以帮助我们把普通的类定义为 Bean。正如源码中的备注一样,“as well as regular component”,说明 Import 可以像类似于 @Component 功能的注解一样,在容器启动的时候将此类定义为一个 Bean ,并将此 Bean 交于容器管理,但此用法较少。

  2. @Import 引入配置类( @Configuration 修饰的类)
    让配置类生效(配置类下的所有 Bean 添加到 Spring IOC 容器里面去)。在自定义 starter 的时候经常会用到。普通的 @Configuration 类是不需要 import 的,因为是在 Spring Boot 的扫描目录下,所以第三方的 jar 包中才会需要。

  3. @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);
  1. @Import 引入 ImportBeanDefinitionRegistrar 的实现类
    @Import 引入 ImportBeanDefinitionRegistrar 的实现类,一般用来动态注册 Bean。最重要的一点是还可以对这些 BeanDefinition 进行额外的修改或增强。
    如果在第三方包中,也不是确定的类,那么如果找到这些类放到 Spring 的容器呢?
    这时候就用到了用注解 @Import 引入 ImportBeanDefinitionRegistrar 子类的方式,最典型的应用就是 mybatis ,使用工具自动生成了一批 mapperentity ,而如何把这些普通的类放入容器,就是通过注解。
    典型代表 @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 的启动类一般放在根目录下,所以默认不指定扫描路径.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值