收起左侧

[JAVA] 江帅帅:精通 Spring Boot 系列 02

1
回复
[复制链接]
avatar
  • TA的每日心情
    qdsmile开心
    2021-3-17 15:10
  • 签到天数: 51 天

    [LV.5]初驻小吧

    14

    主题

    0

    帖子

    1114

    积分

    发表于 2020-6-15 19:22:11 | 显示全部楼层 |阅读模式

    1 @SpringBootApplication 注解
    Spring Boot 的启动类,也就是入口类,需要使用 @SpringBootApplication 注解来标注。在启动类中,我们的 main 方法就是 Java 应用程序的入口方法。
    @SpringBootApplication 是一个组合注解,具体源码如下:

    其中,比较重要的三个注解是:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。

    2 @SpringBootConfiguration 注解
    主要是负责 Spring Boot 应用配置相关的注解,它也是组合注解,具体源码如下:

    通过源码,可以看到它也使用了 @Configuration 注解,它们两个都是将当前类标注为配置类,能将类中使用 @Bean 注解标记的方法对应的实例注入到 Spring 容器中,那实例名就是方法名。

    另外在 @Configuration 注解源码中,还看到有一个 @Component 注解,做了再次封装,主要是把普通 POJO 实例化到 Spring 容器中。具体源码如下:

    所以,更推荐大家在 Spring Boot 应用中使用 @SpringBootConfiguration。

    3 @EnableAutoConfiguration 注解
    主要用来启动自动配置,Spring Boot 就能够根据依赖信息自动实现应用的相关配置,总体分为两个部分:一是收集所有 spring.factories 中EnableAutoConfiguration 相关 bean 的类,二是将得到的类注册到 Spring 容器中。将符合的配置都加载到 IoC 容器中。具体源码如下:

    组件调用关系图,具体如下:
    这张图,怎么去理解呢?其实是这样的,涉及到了 BeanFactory 的创建。Spring 框架中会调用 ApplicationContext 的 refresh 方法来启动 Spring 容器,然后就会创建 BeanFactory,接着扫描各种包,读取使用到了 @Configuration、@Import、@SpringBootApplication 等注解标注的类,然后生成 BeanDefinition 最终注册到 BeanFactory 中。

    然后就交给 BeanFactoryPostProcessor 来执行,BeanFactory 后置处理器会处理 BeanDefinition,比如在 BeanFactoryPostProcessor 接口中,提供了 postProcessBeanFactory 方法来接收 ConfigurableListableBeanFactory 对象来处理。具体源码如下:

    其他类似 @Configuration 等配置性质的注解,就让 ConfigurationClassPostProcessor 来处理。

    上面的 ConfigurationClassPostProcessor 主要是 BeanFactoryPostProcessor 接口的实现类,主要是想从 BeanFactory 中获取所有 BeanDefinition 列表,遍历出那些使用了 @Configuration、@Import 等配置性质注解标注的类所对应的 BeanDefintion,然后进行注册。具体源码如下:

    具体,我们还可以去看看它的 parse 方法是如何处理的,它会去解析注解。

    看到最后的 deferredImportSelectorHandler,这个内部类的里面有一个 deferredImportSelectors 集合,主要是用来添加 AutoConfigurationImportSelector。这个内部私有类,主要维护了一个类型为DeferredImportSelectorHolder 的 deferredImportSelectors 列表。这最后一句代码,就是处理完其他BeanDefinitions 后调用 process 方法。

    来源:奈学开发者社区



    avatar
  • TA的每日心情
    qdsmile开心
    2024-2-1 09:55
  • 签到天数: 199 天

    [LV.7]超级吧粉

    0

    主题

    0

    帖子

    390

    积分

    发表于 2022-11-29 11:01:43 | 显示全部楼层
    广告
    您需要登录后才可以回帖 登录 | 立即注册 QQ登录

    本版积分规则