SpringBoot内置Servlet源码解析:容器自动配置( 三 )
> beanClass) {//检查指定类型的 Bean name 数组是否存在 , 如果不存在则创建 Bean 并注入容器中if (ObjectUtils . isEmpty(this . beanFactory . getBeanNamesForType(beanClass,true,false))) {RootBeanDefinition beanDefinition = new RootBeanDefinition (beanClass);beanDefinition. setSynthetic(true);registry.registerBeanDefinition(name, beanDefinition);}}}【SpringBoot内置Servlet源码解析:容器自动配置】我们知道 Spring 在注册 Bean 时 , 大多都使用 importtBeanDefinitionRegistrar 接口来实现而这里 beanPostProcessorsRegistrar 的实现完全可以说是按照 Spring 官方模式来进行Bean 的注册 。
一般情况下 ,我们首先定义一-个 ImportBeanDefinitionRegistrar 接口的实现类 , 然后在有@Configuration 注解的配置类上使用@lmport 导入该实现类 。
其中 , 在实现类的 registerBeanDefinitions 方法中实现具体 Bean 的注册功能 。
对照 BeanPostProcessorsRegistrar 的使用方法 , 你会发现它是完全按照此模式进行 Bean动态注册的 。
在实现 ImportBeanDefinitionRegistrar 接口的同时 , 还可以实现 BeanFactoryAware 接口 , 用来设置用于检查 Bean 是否存在的 BeanFactory 。
BeanFactory 的使用体现在 register SyntheticBeanlfMissing 方法中 。 具体完成 Bean 的实例化 , 并向容器中注册 Bean 是由 RootBeanDefinition 来完成的 。
在 BeanPostProcessorsRegistrar 中注册的两个 Bean 都实现自接口 BeanPostProcessor,属于 Bean 的后置处理 , 作用是在 Bean 初始化之后添加一些自己的逻辑处理 。 WebServerFactoryCustomizerBeanPostProcessor 的作用主要是在 WebServerFactory 初始化时获取自动配置类注入的 WebServerFactoryCustomizer , 然后分别调用 WebServer-FactoryCustomizer 的 customize 方法来进行 WebServerFactory 的定制处理 。
ErrorPageRegist-rarBeanPostProcessor 的作用是搜集容器中的 ErrorPageRegistrar,添加到当前应用所采用的 ErrorPageRegistry 中 。
至此 , ServletWebServerFactoryAutoConfiguration 注 解部分以及涉及的类讲解完毕 。 下面我们再看看该自动配置类内部的其他代码 。
// 初始化 ServletwebServerFactoryCustomizer@Beanpublic ServletWebServerFactoryCus tomizer servletWebServerF actoryCustomizer(ServerProperties serverProperties) {return new ServletWebServerF actoryCustomizer( serverProperties) ;// 初始化 TomcatServletWebServerFac toryCus tomizer@Bean@Conditional0nClass(name = "org . apache. catalina. startup. Tomcat")public TomcatServletWebServerF actoryCustomizer tomcatServletWebServerFactorCustomizer(ServerProperties serverProperties) {return new TomcatServletWebServerFactoryCustomizer(serverProperties);//实例化注册 FilterRegistrat ionBean前两个方法实例化了两个定制化对象 , 其中 ServletWebServerFactoryCustomizer 用来配置ServletWeb 服 务 器 的 基 本 信 息,比 如 通 常 在 application.properties 中 配 置 的server.port=8080 , 就会通过 ServerProperties 传递进来进行设置 。
我们看一下 ServletWebServerFactoryCustomizer 的核心代码实现 。
public class ServletWebServerFactoryCustomizerimplements WebServerFactoryCus tomizer通过以上代码我们可以看到 , 这里将 ServerProperties 中的参数设置到 Property-Mapper中 , 包括常见的端口、地址、ContextPath、 发布名称等 。
而TomcatServletWeb-ServerFactoryCustomizer 的功能也是对ServerProperties中配置的参数进行定制化设置 , 比如 ContextRoot 设置等 。
最后一个方法是 FilterRegistrationBean
- SpringBoot+MyBatis+MySQL读写分离实现
- SpringBoot构造流程源码分析:Web应用类型推断
- 搭建私有Sentry日志收集系统并集成到springboot
- 待机一周内置小爱同学,还能查看跳绳数据,开箱小寻学习手表S5
- 欧洲航天局3D打印世界上第一个内置电子模块的数据传输设备
- 创新6叶刀片设计,内置电控智能算法,须眉小钢鲨震撼来袭
- SpringBoot扫描不到组件?给你提供几种方案
- 价格战|小米重打价格战?新款智能手表:内置小爱+NFC,仅269元
- 内置|续航时间最长的5部5G手机:小米拿到第一,网友:大电池就是好
- SpringBoot自定义错误页面
