spring

ddatsh

dev #java #spring

IOC

AOP

IOC

IoC/AOP 框架 > 各业务领域、技术场景一站式服务平台(众多子项目)

业务逻辑由两个以上对象协作完成,代码去new对象,耦合度高

IOC思想:容器完成对象创建、依赖注入,得到协作对象的责任被反转

对象间关系表示:xml,properties,annotation等语义化配置

描述对象关系的文件:classpath,filesystem,url,servletContext等

面向对象编程法则,遵循依赖倒置原则,实现解耦

IOC 实现最广泛的是用 DI 设计模式,还有 Dependency Lookup

对以上统一抽象出 IOC 主要接口

各核心接口的实现组合成运行时具体容器

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 的扩展性

  1. 框架顶层设计抽象好,面向接口编程。 Resource 、 BeanFactory 、 ApplicationContext 都是非常好的接口抽象,明确定义了该组件的一些功能
  2. 利用组合模式
  3. 组件实现大量用模板方法,提升复用性
  4. 各种设计保留的扩展的接口,扩展方便
  5. 经典设计模式,代理、装饰、策略等等

AOP

减少重复代码、降低模块耦合、利于维护

  1. 配置/注解 生成代理对象
  2. 执行代理对象,代理对象中包括增强方法和被代理对象

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 形式存储,通过这层封装,提供了更多自定义,如延迟加载