13、自动配置【源码分析】-自动包规则原理

SpringBoot 项目有一个主程序入口类,即SpringBoot应用的启动类:

@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }

}

分析下@SpringBootApplication注解

它也是一个组合注解,进入后可看到:

@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 {
    ...
}

其中有四个注解都是Java当中的元注解(用来修饰注解的,是注解的注解):

  • @Target({ElementType.TYPE}):

使用范围接口、类、枚举、注解

  • @Retention(RetentionPolicy.RUNTIME):

@Retention是用来修饰注解的生命周期的,RetentionPolicy.RUNTIME代表的是不仅被保存到class文件中,jvm加载class文件之后,也依然存在!

  • @Documented:

Documented.java 类位于 JDK 的 rt.jar 内,属于一个 JDK 注解。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
  • @Documented 作用

被 @Documented 修饰的注解将包含在 JavaDoc 中 。此注解会被javadoc工具提取成文档。常见注解基本都被 @Documented 修饰

  • @Inherited:

如果一个类用上了@Inherited修饰的注解,那么其子类也会继承这个注解。

@Deprecated是用来标注某个类或者方法不建议再继续使用

重点分析@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan。

  1. @SpringBootConfiguration

@SpringBootConfiguration是SpringBoot项目的配置注解,这也是一个组合注解,SpringBootConfiguration注解可以用java代码的形式实现spring中xml配置文件配置的效果,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。

进入后看到:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}
1.1 @Configuration

代表当前是一个配置类。

具体可参照前文:08、底层注解-@Configuration详解

1.2 @ComponentScan

用于扫描包上的注解将组件加载到IOC容器中。

它的出现主要是对标xml的配置文件中的component-scan标签,现在通常使用注解的形式注册bean。

  • @ComponentScan还有个父亲是@ComponentScans;用于存放多个@ComponentScan注解。

  • @ComponentScan注解只能使用在有@Configuration配置注解的地方,因为component-scan标签必须存在于xml配置文件中;而在脱离xml使用时,需要使用带有在@Configuration配置注解上。并不局限与一定是 @Configuration也可以是@SpringBootConfiguration…

作用:扫描被@Controller、@Service、@Repository、@Component等注解标注的类。

SpringBoot的主启动类中的@SpringBootApplication会自动扫描主启动类所在的包

  1. @EnableAutoConfiguration

启用 Spring Application Context 的自动配置,自动配置类通常根据您的类路径和您定义的 bean 应用,尝试猜测和配置您可能需要的 bean。例如,如果您的类路径中有tomcat-embedded.jar ,您可能需要一个TomcatServletWebServerFactory (除非您已经定义了自己的ServletWebServerFactory bean)。

主要常用的是这几个属性:

  • basePackages和value属性是同一个,指扫描哪写包下的组件注解。

  • basePackageClasses属性:扫描指定的类,该类有组件注解才能被扫描到。

  • useDefaultFilters属性:使用默认的过滤机制,常常搭配下面两个属性一起使用。

  • includeFilters属性:扫描哪些注解。

  • excludeFilters属性:不扫描哪些组件。

  • lazyInit属性:由于是包扫描一次性的,那么无法单独配置哪个组件是否懒加载,因此提供该属性用于声明是否开启懒加载。

继续进入:

@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 {};
}

重点分析@AutoConfigurationPackage,@Import(AutoConfigurationImportSelector.class)。

2.1 @AutoConfigurationPackage

标签名直译为:自动配置包,指定了默认的包规则。

作用:指定springboot扫描包,默认就是扫描启动类同包下的类。可以通过@AutoConfigurationPackage来附加其他路径,然后springboot同样会进行扫描。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)//给容器中导入一个组件
public @interface AutoConfigurationPackage {
    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};
}

可以看到除了4个元注解外,核心是这个注解:

@Import({AutoConfigurationPackages.Registrar.class})

Registrar是AutoConfigurationPackages当中的一个内部类,注意这个类实现了ImportBeanDefinitionRegistrar接口。通过@Import注入对象一共有四种方式,通过ImportBeanDefinitionRegistrar接口的实现类注入就是其中一种方式!
  1. 利用Registrar给容器中导入一系列组件

  1. 将指定的一个包下的所有组件导入进MainApplication所在包下。

————————————————

引用原文:https://blog.csdn.net/weixin_43808717/article/details/118179660

引用原文:https://blog.csdn.net/weixin_43808717/article/details/118179660

引用原文:https://blog.csdn.net/weixin_43888891/article/details/127478734

原文链接:https://blog.csdn.net/sl285720967/article/details/105717370

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值