参考资源
- Spring
spring 官网
Spring docs
Spring boot docs
Spring cloud docs
博客
版本 1 < 3.0
版本 2 > 3.0
- 书籍
《Spring in Action》
《Pro Spring 5》
《Spring 5 Design Patterns》
《spring 源码分析》
目标与思想
目标
- 抽象封装业务共同代码 ,比如JdbcTemplate
- 解耦技术代码与业务代码 AOP 、IOC
- 实现行业规范, 比如 OAuth ,JSR-XXXX
- 集成三方框架提供统一接口,RestTamplate ,PlatformTransactionManager
- 让企业开发关注业务开发,并简化业务开发,提供高质量的框架代码
IOC 和AOP
IOC
在java 中我们使用一个对象代码
Object obj =new Object()
obj.init()
obj.set()
obj.doSomething()
复用
在所有的应用开发中,我们使用对象都有两个共同点,1、我们使用对象前,都必须先进行创建对象(业务代码无关)2、将对象连接到一起,通过构造函数或者set 方法 (业务无关代码),这两点业务无关的代码,是所有应用开发的共同的地方,是可以复用的。
设计思想
1、解耦,将对象的创建和使用进行解耦。
2、通过配置对象之间的连接关系,这样系统在使用之前就组合好了相关的依赖关系。
比如我们开车
以前:
1、我们先自己生产零件
2、我们自己将零件进行连接并且组装成一辆车
3、开车
以后:
1、告诉spring 有什么零件,零件怎么连接-配置
2、spring 完成零件的生产和连接
3、开车
理解IOC
Ioc (Inversion of Control) 控制反转
对象的生成和连接(依赖关系) 由开发人员编码控制转变 spring控制,spring 实现了控制权限的反转。 实际上,我们也可以用其词汇来描述这件事情,但是行业和官方是用这个词汇来表示这件事情。用Ioc 来描述更容易交流
bean 容器-对象构建
java 可以依据类名 通过反射来实现对象的创建。这是java 实现beans 容器的基础。其他语言可以有其他方式实现容器功能,但是思路应该是类似的。对象的创建委派给spring ,spring 使用了工厂和抽象工厂模式来创建对象,还可以缓存对象比如单例提供对象的复用率。这个单例与单例模式中的单例不一样。单例模式主要是为了系统中全局资源的统一管理。
依赖注入-对象连接
从spring 完成的事情来看,依赖注入 是spring 完成对象(类)关系连接的一种手段。从代码 层面来看,依赖注入有两种方式,构造函数和set 方式。从扩展性和灵活性来看,我们应该尽量依赖的是接口(抽象)而不是实现,我们的实现可能会发送变化,接口是一个契约协议,稳定的。通过依赖注入,我们就可以灵活替换实现方式。而不用改动代码, 这也是spring 设计的一个目标,让使用者不改变代码,能够实现功能的替换。spring 做了创建对象,连接对象(依赖注入)。开发人员 应该是面向接口编程而不是实现编程,这样才能更好的利用好依赖注入。
AOP
需求
我们在完成功能需求(业务开发)的同时,通常会有很对附加功能,比如 记录日志、安全、事务、缓存 、错误处理,性能监控、自定义业务规则。这些代码通常会和业务代码混合在一起。 我们应该把业务代码和非业务代码区别开来,非业务代码是稳定的,改动较少。把业务代码和非业务代码的组织关系委派给框架来做。让企业开发专注业务开发。共同稳定点,将业务代码与非业务代码连接到一起
理解AOP
1、AOP (Aspect Oriented Programming)为什么叫面向切面编程?
抽象的维度 ,我们抽象类的时候,是找到几个相似的类的共同点,将共同的部分放在父类中。通过继承的关系来实现复用。是一种垂直的抽象关系。AOP 是一种水平的抽象关系,把不同类的相同功能点抽象处理。不同类如果在使用继承来描述,明显显得不合适。切面 :就是通过横切的方式把功能切分,比如 一个转账,一个登陆。这是相关完全不相关的功能。没有任何共同点,如果我们把 转账这个功能切分一下,转账-记录日志,登陆-记录日志。这样就出现了相同的部分,记录日志。所以AOP 描述的是一种编程思想。与实现方式无关,当然我们也可以把这种思维利用抽象分析过程中。看待一个事物应该有多重维度。从不同维度找出共同的地方。
2、AOP实现
如何将业务代码与非业务代码组合到一起。使用代理模式,将对目标对象的访问权限 封装到 代理对象中,只能通过代理对象 访问到目标对象。client —> bussisSerivceProxy —>bussisSerivce。java 语言的实现,动态代理, 修改字节码的生成方式。JDK 动态代理 ,gclib 等等。aop 与代理的区别,AOP 是一种抽象思想,代理是一种实现AOP 的方式。源码中常常有AopProxy 这样的类,说明AOP 是用代理来实现的。
网友评论