概述
- Spring框架所使用的主要设计模式
- 代理设计模式(实现AOP的基础)
- 如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法,一是修改原有的方法,但是这样做的的话违背了
开闭原则
,不是很好。二是采用一个代理类调用原来的方法,且对产生的结果进行控制,使用代理模式可以将功能划分的更加清晰,有助于后期维护。
- 如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法,一是修改原有的方法,但是这样做的的话违背了
- 装饰器设计模式(实现框架整合的基础)
- 代理设计模式(实现AOP的基础)
笔记
Spring框架的AOP:面向切面编程
- 代理设计模式分类
- 静态代理:通过自己定义类来实现代理设计模式。
- 原型类、原型接口、代理类都需要自己实现。
- 弊端:通常情况下,一个原型类对应一个代理类。
- 动态代理:通过JDK提供的功能来生成类,来实现代理设计模式。
- 自行定义原型类、原型接口
- 系统自动生成原型类所定义的代理类
- 静态代理:通过自己定义类来实现代理设计模式。
代理设计模式的实现(静态代理)
- 代理类、原型类、原型接口
在代理类中切入代码
123456789101112131415161718192021222324252627282930313233343536373839404142// 原型接口public interface Sourceable {public void talk() throws Exception;}// 原型类public class Source implements Sourceable {@Overridepublic void talk() throws Exception {System.out.println("hello");}}// 代理类public class proxy implements Sourceable {private Source source;public proxyImpl(Source source) {super();this.source = source;}// 下面这种引入也是可以的,推荐上面那种引入方式// private Source source = new Source();@Overridepublic void talk() throws Exceptions {System.out.println("Start");source.talk();System.out.println("End");}}其中代理类中的
System.out.println("Start");
和System.out.println("End");
就是切入的代码。
- 代理设计模式分类
AOP在Spring框架中的应用,AOP代码的切入,只能切入到IoC创建的对象中。
- 创建一个通知Advice:代码切入的方式(在什么情况下进行切入),如下
- Interception:在原型类代码的执行过程中进行切入。
- Before:在原型类代码执行前切入
- After:在原型类代码执行后切入
- Throw:在原型类代码执行异常时切入
- Introduction: 在原型类代码执行完成后切入
- 切入点
- 创建一个通知Advice:代码切入的方式(在什么情况下进行切入),如下
12345678910111213141516171819202122232425262728293031
// 创建一个通知public class MethodAop implements org.aopalliance.intercept.MethodInterceptor { public Object invoke(MethodInvocation arg0) throws Throwable { try { System.out.println("开始事务"); Object object = method.proceed(); System.out.println("提交事务"); return object; } catch(e) { System.out.println("回滚事务"); } } }