Spring In Action 学习笔记(一)

个人学习Spring In Action学习笔记系列 (一)

源码地址 https://github.com/spring-projects/spring-framework


U1 开始Spring之旅

1.1什么是Spring

Spring是一个开源框架,为简化企业级应用开发应运而生。Spring是一个轻量级的DI和AOP容器框架

  • 轻量级 基于POJO可以打成一个2.5MB的JAR包,非侵入式
  • 依赖注入 提供一种松耦合的技术,称为依赖注入(DI) Dependency Injection.对象是被动接收依赖类而部署自己主动去找。可以将DI理解为JNDI的反转--对象不是从容器中查找他的依赖类,而是容器在实例化对象的时候主动将他的依赖类注入给他
  • 面向切面 将业务逻辑从应用服务中分离出来,实现了内聚开发。如提供了系统中日志和事务支持
  • 容器 Spring是一个容器,包含并且管理应用对象的生命周期和配置
  • 框架 使用了简单的组件配置组合成一个复杂的应用

Spring In Action 学习笔记(一)

Spring In Action 学习笔记(一)

Spring In Action 学习笔记(一)

核心容器,BeanFactory提供了组件生命周期的管理,组件的创建,装配,销毁等功能

各个模块内容见 https://blog.csdn.net/panjianlongWUHAN/article/details/86301251

此处不再详述

 

1.3 理解依赖注入

Spring框架的核心是DI Dependency Injection

依赖注入通常被称为反向控制

Spring In Action 学习笔记(一)

骑士问题举例

Spring In Action 学习笔记(一)

使用接口耦合

减少耦合的一个通常的做法是将具体的实现隐藏在接口下面,这样具体实现类的替换不会影响到引用类

先写一个探险接口

Spring In Action 学习笔记(一)

HolyGrailQuest来实现这个接口

Spring In Action 学习笔记(一)

同样要添加Knight骑士接口

Spring In Action 学习笔记(一)

圆桌骑士实现骑士

Spring In Action 学习笔记(一)

但是该类只能获得特殊的一类探险 HolyGrailQuest

问题 是应该让骑士自己获得探险任务还是应该给予骑士他要从事的任务?

Spring In Action 学习笔记(一)

骑士得到他的探险任务是不同的,他只知道Quest接口,你可以按需给他任何一种Quest实现

Spring In Action 学习笔记(一)

1.4 应用AOP

AOP经常被定义成一种编程技术,用来在软件系统中提升业务的分离。有一些组件负责核心功能外的附带功能,比如日志,事务管理和安全,通常叫做交叉业务

AOP帮助我们将这些服务模块化,并把它们声明式地应用在需要它们的地方,这些组件更加专注于自身业务。

把切面想象成一个覆盖层,使用各个功能层来覆盖核心业务层。

Spring In Action 学习笔记(一)

Spring In Action 学习笔记(一)

AOP使用举例

每个骑士需要一个吟游诗人陪伴,用歌曲记载骑士的行动和功绩

Spring In Action 学习笔记(一)

Spring In Action 学习笔记(一)

Spring In Action 学习笔记(一)

出现一个问题,每个骑士在探险前,必须停下来吩咐诗人谱曲,探险后需要记得告诉诗人歌颂,耽误了骑士探险,造成了耦合

理想状态下,歌手应该不等通知就谱写曲子。 吟游诗人提供的的服务超出了骑士的责任,两者产生了交叉。所以把吟游诗人实现成切面,并把他的写歌服务提供给骑士是合理的。骑士甚至不需要知道诗人在旁边

Spring In Action 学习笔记(一)

Spring In Action 学习笔记(一)

使用XML编织切面

Spring In Action 学习笔记(一)

Spring In Action 学习笔记(一)

骑士不再需要告诉诗人来歌颂其探险,作为一个切面,诗人自动处理歌颂事务

KnightOfTheRoundTable恢复到一个更简单的形式

Spring In Action 学习笔记(一)

依赖注入和AOP是Spring中所有事情的核心