Spring 设计模式 Summary
1. 简单工厂模式
案例 BeanFactory
org.springframework.beans.factory.BeanFactory
简单工厂模式的体现, 根据传入一个唯一的标识来获得Bean对象, 但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定. 根据 bean 定义, 工厂将返回包含对象的独立实例(原型设计模式)或单个共享实例(单例设计模式的更好替代方案, 其中实例是范围内的单例)工厂).
本质
由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类.
核心原理
bean容器的启动阶段
Step1 读取 Bean
配置, 将 Bean
元素转换成 BeanDefinition
对象
Step2 通过 BeanDefinitionRegistry
将这些bean注册到 beanFactory
中,保存在它的一个 ConcurrentHashMap
中
Step3 将 BeanDefinition
注册到了 beanFactory
之后,在这里 Spring 为我们提供了 一个扩展的切口, 允许我们 通过实现接口
BeanFactoryPostProcessor
在此处来插入我们定义的代码
Tips: PropertyPlaceholderConfigurer
,我们一般在配置数据库的dataSource时使用到的占位符的值,就是它注入进去的
容器中bean的实例化阶段
实例化阶段主要是通过 反射 或者 CGLIB 对bean进行实例化,在这个阶段Spring又给我们暴露了很多的扩展点.
各种的Aware接口,比如 BeanFactoryAware
,对于实现了 这些Aware接口的bean,在实例化bean时Spring会帮我们注入对应的BeanFactory的实例
BeanPostProcessor接口,实现了 BeanPostProcessor
接口的bean,在实例化bean时Spring会帮我们调用接口中的方法。
InitializingBean接口,实现了 InitializingBean
接口的 bean,在实例化bean时Spring会帮我们调用接口中的方法。
DisposableBean接口,实现了 BeanPostProcessor
接口的 bean
,在该bean死亡时Spring会帮我们调用接口中的方法。
意义
**松耦合。**可以将原来硬编码的依赖,通过Spring这个BeanFactory这个工厂来注入依赖,也就是说原来只有依赖方和被依赖方,现在我们引入了第三方——Spring 这个 BeanFactory,由它来解决bean之间的依赖问题,达到了松耦合的效果.
**Bean的可扩展处理。**通过Spring接口的暴露,在实例化bean的阶段我们 可以进行一些额外的处理,这些额外的处理只需要让bean实现对应的接口即可,那么 Spring就会在 bean的生命周期 调用我们实现的接口来处理该bean.
摘录
Bean 工厂实现应尽可能支持标准的 bean 生命周期接口。全套初始化方法及其标准顺序为:
- BeanNameAware 的
setBeanName
- BeanClassLoaderAware 的
setBeanClassLoader
- BeanFactoryAware 的
setBeanFactory
- 环境意识的
setEnvironment
- EmbeddedValueResolverAware 的
setEmbeddedValueResolver
- ResourceLoaderAware
setResourceLoader
(仅在应用程序上下文中运行时适用)- ApplicationEventPublisherAware
setApplicationEventPublisher
(仅在应用程序上下文中运行时适用)- MessageSourceAware
setMessageSource
(仅在应用程序上下文中运行时适用)- ApplicationContextAware
setApplicationContext
(仅在应用程序上下文中运行时适用)- ServletContextAware
setServletContext
(仅适用于在 Web 应用程序上下文中运行时)