网站建设方案的摘要,做神马网站快速排名,燕郊教育网站建设,绵阳网站搜索排名文章目录 三. 手写简易 Spring#xff08;三#xff09;1. Bean 对象初始化和销毁方法1. XML 添加 init-method 与实现 InitializingBean 接口注册初始化2. XML 添加 destroy-method 与实现 DisposableBean 接口注册销毁3. DefaultSingletonBeanRegistry 优秀的解耦方法 2. 定… 文章目录 三. 手写简易 Spring三1. Bean 对象初始化和销毁方法1. XML 添加 init-method 与实现 InitializingBean 接口注册初始化2. XML 添加 destroy-method 与实现 DisposableBean 接口注册销毁3. DefaultSingletonBeanRegistry 优秀的解耦方法 2. 定义标记类型 Aware 接口实现感知容器对象1. 定义2. ApplicationContextAwareProcessor 包装处理器 3. Bean 对象作用域1. 定义 4. 扩展其他框架 FactoryBean1. 定义2. FactoryBeanRegistrySupport 处理 FactoryBean 注册管理 5. 我的代码结构1. 整体设计结构2. 我的调用类图模拟 Spring 源码3. 我的代码结构模拟 Spring 源码   三. 手写简易 Spring三 
1. Bean 对象初始化和销毁方法 
1. XML 添加 init-method 与实现 InitializingBean 接口注册初始化 
核心实现类 XmlBeanDefinitionReader添加解析 XML 的 init-method 的参数放入 BeanDefinition 对象核心抽象类 AbstractAutowireCapableBeanFactory在调用 invokeInitMethod 方法初始化时先判断是否有 InitializingBean 初始化再判断是否有 init-method 初始化同时避免调用两次相同方法 
2. XML 添加 destroy-method 与实现 DisposableBean 接口注册销毁 
核心实现类 XmlBeanDefinitionReader添加解析 XML 的 destroy-method 的参数放入 BeanDefinition 对象DisposableBeanAdapter 类使用了适配器的设计模式将俩销毁方法整合在一起 先判断是否有 DisposableBean 销毁再判断是否有 destroy-method 初销毁同时避免调用两次相同方法 核心抽象类 AbstractAutowireCapableBeanFactory在初始化后调用 registerDisposableBeanIfNecessary 方法 方法调用 DefaultSingletonBeanRegistry 类、注册带销毁的 BeanDefinition 对象存在 DisposableBean 或 destroy-method 就是带销毁的 BeanDefinition 对象 解析 XML 与预加载单例对象后手动注册销毁钩子时调用 DefaultSingletonBeanRegistry 类的 destroySingletons 方法 DefaultSingletonBeanRegistry 类存在所有销毁的 BeanDefinition 集合依次删除、同时调用 DisposableBeanAdapter 类整合的 destroy 方法  
3. DefaultSingletonBeanRegistry 优秀的解耦方法 
ConfigurableBeanFactory 接口定义了 destroySingletons 方法AbstractBeanFactory 实现了 ConfigurableBeanFactory 接口但自己极其子类并未实现此方法AbstractBeanFactory 交给了父类 DefaultSingletonBeanRegistry 实现 destroySingletons 方法DefaultSingletonBeanRegistry 并没有实现 ConfigurableBeanFactory 接口因此无需 Override核心就是 A 继承 B实现 C 时C 的接口方法由 A 继承的父类 B 实现 
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IEh9XJkH-1682183583455)(:/810c4cb567e54a61910bfc5b38f84490)] 
2. 定义标记类型 Aware 接口实现感知容器对象 
1. 定义 
允许 Bean 对象拿到 Spring 框架中的 BeanFactory、BeanClassLoader、BeanName、ApplicationContext 等我们可以定义 Aware 标记接口通过 instanceof 判断 JDK 常用标记接口Cloneable、Serializable、RandomAccess、Remote 当前继承 Aware 的接口包括BeanFactoryAware、BeanClassLoaderAware、BeanNameAware 和 ApplicationContextAware获取对应对象 前三者属于 BeanFactory因此在 beans.factory 包下ApplicationContextAware 属于 ApplicationContext因此在 context 包下ApplicationContext 需要像容器中注册 addBeanPostProcessor 再由 createBean 调用 applyBeanPostProcessorsBeforeInitialization 时进行操作  
2. ApplicationContextAwareProcessor 包装处理器 
ApplicationContextAwareProcessor 实现 BeanPostProcessor 接口 在 refresh() 方法操作时把 ApplicationContext 注册到 BeanPostProcessor 容器在 createBean() 方法进行 BeanPostProcessor Before 处理时调用  
3. Bean 对象作用域 
1. 定义 
是否单例存放在 BeanDefinition 中通过 ConfigurableBeanFactory 成员变量 SCOPE_SINGLETON、SCOPE_PROTOTYPE 来定义单例与否区别 DefaultListableBeanFactory#preInstantiateSingletons 是否进行预初始化AbstractAutowireCapableBeanFactory#createBean 创建完成对象后是否放入到内存中是否注册 Disposable 销毁方法 某个 Bean 对象是否单例可通过 XmlBeanDefinitionReader 解析 XML 文件校验 
4. 扩展其他框架 FactoryBean 
1. 定义 
MyBatis 就是实现了一个 MapperFactoryBean 类交给 Spring 管理createBean 执行对象实例化、属性填充、依赖加载、前置后置处理、初始化等操作后就执行 FactoryBean 具体对象中的 getObject 对象 
2. FactoryBeanRegistrySupport 处理 FactoryBean 注册管理 
AbstractBeanFactory 抽象类继承 DefaultSingletonBeanRegistry 实现类中间加一层 FactoryBeanRegistrySupport 抽象类 它处理关于 FactoryBean 对象的注册管理 FactoryBeanRegistrySupport 不实现 FactoryBean 接口仅是依赖它 
5. 我的代码结构 
1. 整体设计结构 
2. 我的调用类图模拟 Spring 源码 
3. 我的代码结构模拟 Spring 源码