Java笔记——面向切面编程(AOP模式)

原文:http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html

Aspect Oriented Programming  面向切面编程。解耦是程序员编码开发过程中一直追求的。AOP也是为了解耦所诞生。

具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流。

AOP 在Spring框架中被作为核心组成部分之一,的确Spring将AOP发挥到很强大的功能。最常见的就是事务控制。工作之余,对于使用的工具,不免需要了解其所以然。学习了一下,写了些程序帮助理解。

AOP 主要是利用代理模式的技术来实现的。
Java笔记——面向切面编程(AOP模式)_第1张图片

============================

1、静态代理:就是设计模式中的proxy模式 


a.业务接口
Java笔记——面向切面编程(AOP模式)_第2张图片

b.业务实现
Java笔记——面向切面编程(AOP模式)_第3张图片


c.代理对象
Java笔记——面向切面编程(AOP模式)_第4张图片

d.测试类
Java笔记——面向切面编程(AOP模式)_第5张图片


从这段代码可以看出来,代理模式其实就是AOP的雏形。 上端代码中talk(String msg, String singname)是一个切面。在代理类中的sing(singname)方法是个后置处理方法。

这样就实现了,其他的辅助方法和业务方法的解耦。业务不需要专门去调用,而是走到talk方法,顺理成章的调用sing方法

再从这段代码看:1、要实现代理方式,必须要定义接口。2、每个业务类,需要一个代理类。


============================
 
2、动态代理:jdk1.5中提供,利用反射。实现InvocationHandler接口。 


a.代理类
Java笔记——面向切面编程(AOP模式)_第6张图片

b.测试类
Java笔记——面向切面编程(AOP模式)_第7张图片


输出结果会是:
 

切面之前执行
people talk业务说法
切面之后执行

 

说明只要在业务调用方法切面之前,是可以动态的加入需要处理的方法。

从代码来看,如果再建立一个业务模块,也只需要一个代理类。ITalk iTalk = (ITalk) new DynamicProxy().bind(new PeopleTalk());  将业务接口和业务类绑定到动态代理类。

但是这种方式:还是需要定义接口。

 ============================

3、利用cglib 

a.业务类
Java笔记——面向切面编程(AOP模式)_第8张图片 


b.代理类
Java笔记——面向切面编程(AOP模式)_第9张图片 


c.测试类
Java笔记——面向切面编程(AOP模式)_第10张图片

最后输出结果:
 

事物开始
people talk业务方法
事物结束
事物开始
spreak chinese业务方法
事物结束



 

转载于:https://my.oschina.net/u/2400661/blog/596234

你可能感兴趣的:(Java笔记——面向切面编程(AOP模式))