fujohnwang / unveil-springboot-feedbacks

《SpringBoot揭秘》一书的勘误收录以及交流等售后项目
53 stars 16 forks source link

《SpringBoot揭秘 快速构建微服务体系》(作者:王福强) ---- 读后感,几点想法 #14

Closed robertyumao closed 6 years ago

robertyumao commented 6 years ago

王老师,您好:

有缘读了您写的"SpringBoot揭秘"一书的前几个章节,有些个人不成熟的想法,想跟老师交流。

一: 原书2.3章节部分内容截图 1

_根据我对源码的理解,感觉spring是这样处理的。

  1. spring创建的配置类bean, 并非配置类本身,而是其代理对象(cglib)。当被@Bean注解的方法被调用时,代理类把获取bean的操作委托给beanFactory来实现,这就进入了传统IOC容器的处理逻辑。
    1. 配置类中被@Bean注解的方法,在ConfigurationClassPostProcessor(容器后处理器)中被解析成bean定义对象,静态工厂bean(如果被@Bean注解的方法是静态的)或实例工厂bean,然后在刷新容器的过程中, 如果是单例bean会被创建并缓存起来_

二: 原书3.2章节内容 2

spring除了判断是否存在ConfigurableWebApplicationContext,还会判断是否存在javax.servlet.Servlet, 两个类必须同时存在,spring才认为当前是web环境,然后把判断结果赋值给SpringApplication的属性 boolean webEnvironment。后续所创建的环境对象类型或web容器类型,都参考webEnvironment的值.

三 : 原书3.3.1章节内容 3 SpringApplication属性registerShutdownHook默认值是true, 所以默认是会为容器注册ShutdownHook的.

四 : 原书3.3.1章节内容 4 1.通过@EnableAutoConfiguration导入系统配置类确实是spring boot的核心步骤,不过这个步骤是发生在刷新容器的过程中(即书中描述的第11个步骤)。刷新容器的其中一个步骤是应用容器后处理器,具体是在ConfigurationWarningsPostProcessor(容器后处理器)中处理的。ConfigurationWarningsPostProcessor是在容器的构造函数中被注册到bean工厂的。

2. @EnableAutoConfiguration注解能够导入系统配置类,是因为它被@Import(EnableAutoConfigurationImportSelector.class)注解了。EnableAutoConfigurationImportSelector(导入选择器),它会读取在autoconfig's jar包里的spring.factories文件, 其中key是"EnableAutoConfiguration"的类(都是配置类)。至于是否导入,会读取spring-autoconfigure-metadata.properties文件内容,根据@ConditionalOnClass注解判断配置类依赖的jar包是否存在。

fujohnwang commented 6 years ago

问题一

我说的是实现的原理,不是讲具体在哪个类实现,也不是讲怎么设计实现,这个不冲突 ;)

问题二

我不记得我说的是大体逻辑还是细节了,但你在根据代码看内容的时候,可能要注意一下我写书时候的代码版本跟你看的代码版本是否一致,因为后面有可能增添; 不过两个条件都判断显然更精确;

问题三

默认值可以修改,所以,是要判断

问题四

  1. 我说的refresh()可能跟你说的不一样,你说的类,当时我没看到,不知道是不是代码版本差异或者我粗心 ;)
  2. 这个没问题,是这个逻辑
robertyumao commented 6 years ago

:-)