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是一个容器,包含并且管理应用对象的生命周期和配置
- 框架 使用了简单的组件配置组合成一个复杂的应用
核心容器,BeanFactory提供了组件生命周期的管理,组件的创建,装配,销毁等功能。
各个模块内容见 https://blog.****.net/panjianlongWUHAN/article/details/86301251
此处不再详述
1.3 理解依赖注入
Spring框架的核心是DI Dependency Injection
依赖注入通常被称为反向控制
骑士问题举例
使用接口耦合
减少耦合的一个通常的做法是将具体的实现隐藏在接口下面,这样具体实现类的替换不会影响到引用类
先写一个探险接口
HolyGrailQuest来实现这个接口
同样要添加Knight骑士接口
圆桌骑士实现骑士
但是该类只能获得特殊的一类探险 HolyGrailQuest
问题 是应该让骑士自己获得探险任务还是应该给予骑士他要从事的任务?
骑士得到他的探险任务是不同的,他只知道Quest接口,你可以按需给他任何一种Quest实现
1.4 应用AOP
AOP经常被定义成一种编程技术,用来在软件系统中提升业务的分离。有一些组件负责核心功能外的附带功能,比如日志,事务管理和安全,通常叫做交叉业务
AOP帮助我们将这些服务模块化,并把它们声明式地应用在需要它们的地方,这些组件更加专注于自身业务。
把切面想象成一个覆盖层,使用各个功能层来覆盖核心业务层。
AOP使用举例
每个骑士需要一个吟游诗人陪伴,用歌曲记载骑士的行动和功绩
出现一个问题,每个骑士在探险前,必须停下来吩咐诗人谱曲,探险后需要记得告诉诗人歌颂,耽误了骑士探险,造成了耦合。
理想状态下,歌手应该不等通知就谱写曲子。 吟游诗人提供的的服务超出了骑士的责任,两者产生了交叉。所以把吟游诗人实现成切面,并把他的写歌服务提供给骑士是合理的。骑士甚至不需要知道诗人在旁边
使用XML编织切面
骑士不再需要告诉诗人来歌颂其探险,作为一个切面,诗人自动处理歌颂事务
KnightOfTheRoundTable恢复到一个更简单的形式