spring
ddatsh
IOC
AOP
IOC
IoC/AOP 框架 > 各业务领域、技术场景一站式服务平台(众多子项目)
业务逻辑由两个以上对象协作完成,代码去new对象,耦合度高
IOC思想:容器完成对象创建、依赖注入,得到协作对象的责任被反转
对象间关系表示:xml,properties,annotation等语义化配置
描述对象关系的文件:classpath,filesystem,url,servletContext等
面向对象编程法则,遵循依赖倒置原则,实现解耦
IOC 实现最广泛的是用 DI 设计模式,还有 Dependency Lookup
对以上统一抽象出 IOC 主要接口
- Resource
- BeanDefinitionReader
- BeanDefinition
- BeanFactory
- ApplicationContext
各核心接口的实现组合成运行时具体容器
DI
核心思想,上层代码依赖于下层代码改变为下层代码依赖于上层代码,降低耦合度,提高系统弹性
传统软件,上层代码依赖于下层代码,下层代码有所改动时,上层代码也要相应进行改动,维护成本较高
上层代码定义接口,下层代码实现该接口,使下层依赖于上层接口
注入方式 构造、属性、方法、接口、注解
DI 使 Mock更方便
Resource 资源访问策略抽象
Url/ClassPath/FileSystem/ServletContext/InputStream/ByteArray
策略模式的体现
ctx.getBean("classpath:/xx")
ctx.getBean("file:///")
BeanDefinition
bean 对象基本数据结构
BeanDefinitionReader
XmlBeanDefinitionReader 等外部资源描述转内部统一数据结构BeanDefinition
BeanFactory
纯粹 bean容器,实现容器基本结构和功能,但与外部环境隔离
维护 BeanDefinitions Map, 根据 BeanDefinition 创建和管理对象
ApplicationContext
和应用环境相关。就是开发中直接使用的类,或者叫spring 容器
基本实现是 持有BeanFactory 对象,提供一些包装和功能扩展
读配置 > 解析成 BeanDefinition > 注册到 BeanFactory 的封装,需要ApplicationContext
ClasspathXml/FileSystemXml ApplicationContext
WebApplicationContext
组件的组合在 ApplicationContext 的实现这一层完成
总结
学习 spring 的设计是一个很好的实践理论结合
Spring 的扩展性
- 框架顶层设计抽象好,面向接口编程。 Resource 、 BeanFactory 、 ApplicationContext 都是非常好的接口抽象,明确定义了该组件的一些功能
- 利用组合模式
- 组件实现大量用模板方法,提升复用性
- 各种设计保留的扩展的接口,扩展方便
- 经典设计模式,代理、装饰、策略等等
AOP
减少重复代码、降低模块耦合、利于维护
- 配置/注解 生成代理对象
- 执行代理对象,代理对象中包括增强方法和被代理对象
BeanFactory
public class MerchantController {
@Autowired
private final MerchantService merchantService;
}
@Autowired来自动加载依赖对象,使管理依赖很容易
但加载、创建、初始化等步骤是不会减少的,spring中在BeanFactory 中完成
DefaultListable/SimpleJndi/StaticListable BeanFactory
方法模板,getBean(),containsBean(),isSingleton()
package org.springframework.beans.factory.support;
@SuppressWarnings("serial")
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
............
/** Map of bean definition objects, keyed by bean name */
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256);
...........
}
beanDefinitionMap中 bean 对象以 BeanDefinition 形式存储,通过这层封装,提供了更多自定义,如延迟加载