Spring Aop 实现函数内部增强

来源:互联网 发布:金银绣花线js 编辑:程序博客网 时间:2024/06/15 03:02

Spring Aop 的一个切面包括 1.增强类型(函数调用前、后,抛出异常和函数调用前后) 2.增强的业务逻辑 3.连接点

而Spring Aop 只支持方法的连接点,当我想在方法内部织入增强时,可以有两种方式:

1.比如一个函数A有a,b,c三种功能,我想在b前也即函数中间织入一个增强,那么可以把b单独拿出来写成一个独立的函数,然后在A中调用b,这样就可以b前、后织入切面了。

2.一般函数只有一种功能,难以进行拆分。例如在函数中间有一个变量a,现在我想在这个变量后织入增强,同时把该变量传递过去,那么我可以在该类中定义一个空函数(什么也不做)作为目标函数,然后把变量a赋给该函数的形参,再在该函数织入切面,那么这个切面可以获得目标函数传入的参数即a。主函数调用这个空函数即可。

例如在我的函数中,我想把变量getCount与sumCount传递给切面进行处理(假设切面的功能就是打印变量)

public void run() {while (true) {Query query = session.createQuery("from VehicleInfo");query.setFirstResult(getCount * getNumOneTime);query.setMaxResults(getNumOneTime);List<VehicleInfo> infoList = query.list();getCount++;sumCount += infoList.size();//在这儿织入切面,并将变量传递给切面}}
我可以定义一个空函数,什么也不做

public void transferToWeb(int getCount,int sumCount) {}

然后再这个函数前或者后织入切面,再在run函数中调用这个空函数
getCount++;sumCount += infoList.size();transferToWeb(getCount,sumCount);

但是需要注意的是Aop是需要代理的,只有当代理类直接调用transferToWeb增强才会织入,而通过run函数间接调用transferToWeb,因为代理是不会传递的,所以增强还是不会织入,所以这儿必须强制获得该类的代理,例如我这是的类名字叫做Convert,那么将代码改成

sumCount += infoList.size();//获取代理((Convert)AopContext.currentProxy()).transferToWeb(getCount,sumCount);
增强即可织入。
原创粉丝点击