天天看点

【spring框架】AOP介绍

什么是aop

1.面向切面编程(aspect-oriented-programming)

a)是面向对象的思维方式的有力补充。

下面利用之前写过的模拟spring的工程给大家演示什么是aop。

假设我们现在需要在userdaoimpl类的save方法中add数据代码前后加日志信息:

即是加业务逻辑。

方法1:直接加代码:

方法2:(继承模式)

写一个userdaoimpl2继承userdaoimpl

在beans.xml初始化userdaoimpl2

方法3:(组合模式)

写一个userdaoimpl2实现userdao接口

好处:可以互相之间来回的组合(可以换成new userdaoimpl2();)

对于上面的方法3,如果逻辑bean非常多,那么需要引入非常多的bean,这时候每一个bean都要加上日志代码,工作量非常大。

解决办法:

写了一个logintercept的类,定义所有的日志代码:

在业务逻辑的实现里这样使用:

但是这样做还是有问题:

使用组合模式的时候,虽然这个logintercept可以加到任何bean上面,还是没有解决一个问题,就是我要加到某个bean上面去的时候,必须得做一个新的类(如userimpl5),把原来的那个bean组合进来。

解决方法:你要让我加到哪个bean上面,你干脆给我写个配置文件,我就动态的把逻辑加到那个bean上面。这就是aop。

你在xml初始化bean的时候,加一个标签,告诉程序我要加一个逻辑。例如:

这里就可以将日志逻辑注入了。

但是你写<log method="beforemethod"/>等标签程序会帮你产生一个组合的类吗?很显然不能,所以这个时候你想要动态的产生我们想要的那个类,就要使用"动态代理"了。

jdk中可以实现动态代理:

利用proxy和invocationhandler

具体细节详见动态代理的文章:http://blog.csdn.net/acmman/article/details/44276397

下一篇总结我会利用动态代理实现aop,并解释aop:http://blog.csdn.net/acmman/article/details/44276427

转载请注明出处:http://blog.csdn.net/acmman/article/details/44276369