初学Spring Boot对@SpringBootApplication的理解

1.spring boot是为了简化spring的,而不是增强spring,它是spring全家桶中的一员。springboot约定大于配置以及开箱即用

 2.spring boot是如何进行自动包扫描?为什么需要将文件放在启动类所在包及子包才能被springboot自动扫描并注册bean?


   (一)推测
                 spring boot会扫描启动类所在的包以及子包中加入@Controller  @Service @Component @Respository的类
                 并将其加入到ioc容器
   (二)分析源码


                 a.@SpringBootApplication这是源码中的一个非常重要的注解
                 b.分析@SpringBootApplication注解:
        1.@SpringBootApplication是一个组合注解,包含几个元注解,以及三个非常重要的注解
           {@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan}
           元注解:@Target(ElementType.TYPE) //注解的适用范围,其中TYPE用于描述类、接口(包括包注解类型)或enum声明
             @Retention(RetentionPolicy.RUNTIME) //注解的生命周期
             @Documented //表明这个注解应该被javadoc记录
             @Inherited //子类可以继承该注解

 

 

        2.@SpringBootConfiguration注解是指当前类是注解类

        3.@EnableAutoConfiguration注解是指开启自动配置,点开后看@AutoConfigurationPackage这个注解,它是指自动配置包
     
        4.@AutoConfigurationPackage这个注解,主要通过@Import注解引入了AutoConfigurationPackages.Registrar.class这个类
    


         5.Registrar.class这个类主要调用了register(registry, new PackageImport(metadata).getPackageName());这个方法

 

        6.分析参数传了BeanDefinitionRegistry 变量,和一堆包名组成字符串;
          最后一行调用registry.registerBeanDefinition(BEAN, beanDefinition)就是将
          new PackageImport(metadata).getPackageName());这个方法
          得到的包名下所有文件扫描并将其下文件分析并注册bean,
          这样就是大体流程,接下来调试源码验证一下。


    

3.spring boot是如何封装spring众多的配置类?
(一)推测
                 spring boot会自动的将一些配置类的bean注册进ioc容器,并且spring boot应该有大量的配置类的信息

   (二)分析源码
                 a.@SpringBootApplication这是源码中的一个非常重要的注解
                 b.分析@SpringBootApplication注解:
        1.@SpringBootApplication是一个组合注解,包含几个元注解,以及三个非常重要的注解
           {@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan}
           元注解:@Target(ElementType.TYPE) //注解的适用范围,其中TYPE用于描述类、接口(包括包注解类型)或enum声明
             @Retention(RetentionPolicy.RUNTIME) //注解的生命周期
             @Documented //表明这个注解应该被javadoc记录
             @Inherited //子类可以继承该注解

        2.@SpringBootConfiguration注解是指当前类是注解类

        3.@EnableAutoConfiguration注解是指开启自动配置,点开后看@Import(AutoConfigurationImportSelector.class)这个注解
            它的意思就是:使用Import自动导入所有符合自动配置条件的Bean定义并加载到IOC容器

        4.点开AutoConfigurationImportSelector类中找到getCandidateConfigurations(AnnotationMetadata metadata,
         AnnotationAttributes attributes)方法里面有一行List configurations = SpringFactoriesLoader.loadFactoryNames(
         getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());我们进行调试就会扫描到org.spring......../MEAT-INF/spring.factories文件
         得到所有的配置类并且初步筛选出124个配置类

        5.getAutoConfigurationEntry()这个方法层层执行,去重,移除,过滤,返回最后的你所需要的配置类

        6.我们可以手动查看org.spring......../MEAT-INF/spring.factories文件中一些配置类的重要注解(比如RabbitTemplate这个配置类):
            @Configuration标注这个类是一个配置类。
          @ConditionalOnClass(RabbitTemplate.class):判断当前classpath下是否存在RabbitTemplate,若是则将当前的配置类装载入spring容器。
          @ConditionalOnBean(RabbitTemplate.class):判断当前spring的applicationContext中是否存在RabbitTemplate,若是则将当前的配置类装载入spring容器。
          @ConditionalOnMissingBean()这个配置是指如果满足条件,当前配置类不被加载进ioc容器
          @EnableConfigurationProperties()通过这个注解我们可以找到这个配置类的配置文件
          @ConfigurationProperties(prefix = "spring.cache")通过这个注解我们可以在
             xxxxx.properties这个配置文件中去手动的配置我们所需要的配置类,以及修改配置类的属性
        


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炒糊的豆子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值