通俗易懂Spring源码分析

spring 的优势

方便解耦,简化开发

  • 通过 Spring 提供的 IoC 容器,可以将对象间的依赖关系交由 Spring
    进行控制,避免硬编码所造成的过度程序耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

AOP 编程的支持

  • 通过 Spring 的 AOP 功能,方便进行面向切面的编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松应付。

声明式事务的支持

  • 可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量。方便程序的测试
    可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。

方便集成各种优秀框架

  • Spring
    可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。

降低 JavaEE API 的使用难度

  • Spring 对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些 API 的
    使用难度大为降低。 Java 源码是经典学习范例 Spring 的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对 Java
    设计模式灵活运用以 及对 Java 技术的高深造诣。它的源代码无意是 Java 技术的最佳实践的范例。

通俗易懂Spring源码分析_第1张图片
通俗易懂Spring源码分析_第2张图片

IOC (设计思想 主要限制new使用 降低耦合 提高类的重用性)

  • 设计思想历程:
  • —new魔咒导致 >>暴露接口子类>>产生耦合
  • —采用工厂模式 >>解决调用者和具体子类的耦合
  • —反射机制 ClassLoader.loadClass 传人“包 类名称”通过工厂获取实例对象>>降低耦合
    通俗易懂Spring源码分析_第3张图片
    通俗易懂Spring源码分析_第4张图片
    Spring IOC 容器使用 ClassLoader.loadClass不使用 Class.forName
    我个人猜测, 应该和 Spring IoC 的 Lazy loading 有关, Spring IoC 为了加快初始化速度, 因此大量使用了延时加载技术. 而使用 classloader 不需要执行类中的初始化代码, 可以加快加载速度, 把类的初始化工作留到实际使用到这个类的时候.

存在问题:

  1. 需要配置文件 获取对应包类名称 调用反射
  2. 配置文件应该包含依赖关系配置
  3. 应该合理配置多线程管理,避免过多重复对象产生
    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

Bean 容器

  1. 配置文件 引用关系处理 —使用P命名空间—集合 参数 构造方法注入等

  2. 自动匹配(@Resource

  3. 通俗易懂Spring源码分析_第5张图片
    通俗易懂Spring源码分析_第6张图片

  4. Bean实例化管理 单例配置

  5. Spring容器启动时可以自动实现Bean的实例化处理—饿汉式单例设计

  6. 延迟进行初始化—懒汉加载 LayLoading

  7. 初始化与销毁 销毁由容器自动完成

  8. 通俗易懂Spring源码分析_第7张图片

||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

Annotation 配置

  1. Context 扫描配置
  2. @Repository 数据层注解
  3. @Service 业务层注解
  4. @Controller 控制层注解
  5. @Component 定义组件
  6. @Resource=@Autowired+@Qualifier 自动注入—自动匹配Bean容器
    @Resource 可直接通过name 属性设置bean名称

通俗易懂Spring源码分析_第8张图片

  1. 四个注解功能相同,区别只是为了描述的准确性
    总结:
     Spring所有被管理的程序都要通过配置文件或注解进行定义,默认情况随着容器启动而启动
     Spring 可以直接通过配置文件实现Bean的依赖关系管理,也可以利用类名或名称实现自动关联配置
     Spring支持自动扫描配置,context配置要扫描的包或类
     资源注入可以使用@Resource@Autowired 注解实现

Spring资源管理

  1. Resource接口 InputStreamSource的子接口—所有资源由Resource接口对象负责读取

  2. ResourceLoader接口----解耦合—
    提供两个方法:
    Public classloader getClassloader(); 获取类加载器
    Public Resource getResource(String location); 根据指定路径返回Resource接口实例

  3. 利用配置文件实现的资源访问配置,实际上就是对ResourceLoader接口功能的包装

  4. Spring支持Ant路径匹配模式,如:? 可以匹配任意字符,* 匹配零个,一个,多个字符,如果进行目录匹配,可以使用“**”

Spring表达式

  1. SpEL表达式语言
  2. ExpressionParser表达式解析器(spring源码中经常遇到)
  3. Expression 表达式执行类—最终计算结果
  4. EvaluationContext 表达式计算

SpringTask 任务调度
通俗易懂Spring源码分析_第9张图片

AOP切面编程
本身是代理功能的增强

  1. Aop主要用于横切关注点分离和织入。

  2. 关注点:如何东西,如业务接口,支付处理,消息发送处理

  3. 关注点分离:将业务处理拆分成一个个不可拆分的独立组件

  4. 横切关注点:实现代理功能 ,利用代理功能可以将辅助操作在多个关注点上执行,横切点可能包括事务处理,日志记录,性能统计等;

  5. 织入:将横切点分离后,可能需要确定关注点的执行位置,可能在业务方法调用前,也可能是调用后,或者产生异常时。

  6. 通俗易懂Spring源码分析_第10张图片

  7. 基于Annotation 的Aop配置–@Around @Before @AfterThrowing @AfterReturning @After注解

  8. AOP实现与代理模式相比 ,最大特点在于可以通过切入点表达式进行代码整合

  9. Aop通知分三类 : 前置通知,后置通知和环绕通知,其中环绕通知可以实现全部的切面控制。

Spring与其他组件整合
待更新:
消息组件:JMS,ActiveMQ
NOSQL:Redis
JDBC
SpringDataJPA,Mybatis,SpringMvc

你可能感兴趣的:(Spring,java,spring)