简单的来说spring aop有两种方式,全接口方式使用的是jdk的动态代理,针对接口;而非接口方式使用的是cglib,这种方式类似jdk动态代理,在运行期间生成的代理对象是针对目标类扩展的
子类
。下面使用jdk的动态代理做的一个例子,这个能代理到父类,我觉的如果你的项目中有baseDaoimpl的构造方法有
ParameterizedType pt = (ParameterizedType) this.getClass()
.getGenericSuperclass();
this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
可能就代理不了,应该是this获取到的是代理对象,代理对象的Class的ParameterizedType 所以就会报错.
动态代理的例子,带继承
package com.xianlizg.project.util;
public interface BaseInterface {
Integer printAge(Integer age);
}
package com.xianlizg.project.util;
public class BaseInterfaceImpl implements BaseInterface {
public Integer printAge(Integer age) {
System.out.println(age);
return age;
}
}
package com.xianlizg.project.util;
public interface InterfaceTest extends BaseInterface {
String printName(String name);
}
package com.xianlizg.project.util;
public class InterfaceTestImpl extends BaseInterfaceImpl implements InterfaceTest {
public String printName(String name) {
System.out.println(name);
return "aa";
}
}
package com.xianlizg.project.util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class HelpInvokeIntercept implements InvocationHandler {
private Object targerObj;
HelpInvokeIntercept(Object targerObj){
this.targerObj=targerObj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//System.out.print("检查权限");
<span style="white-space:pre"> </span>//这里可以做很多事,拦截等,spring aop就是把这里挖出来,进行可配置拦截,每次调用方法就会,来这判断
return method.invoke( targerObj, args);
}
}
测试代码:
@org.junit.Test
public void proxyyTest(){
InterfaceTest interfaceTest = (InterfaceTest)Proxy.newProxyInstance(InterfaceTest.class.getClassLoader(),new Class[] { InterfaceTest.class },new HelpInvokeIntercept(new InterfaceTestImpl()));
interfaceTest.printName("aaa");
interfaceTest.printAge(22);
}