1、代理类的作用与原理及AOP概念
系统中存在交叉业务,一个交叉业务就是要切入到系统中的一个方面。
安全、事物、日志等功能要贯穿到多个模块中,所以,他们就是交叉业务。
交叉业务的编程问题即为面向方面的编程(aop),aop的目标就是要使交叉业务模块化,可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果一样的。
使用代理技术正好可以解决这种问题,代理是实现aop功能的核心和关键技术。
2、实现动态代理的俩种方式:
jvm可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类。
1、Jvm生成的动态类必须实现一个或多个接口,所以,jvm生成的动态类只能用作具有相同接口的目标类的代理。(即代理类,目标类实现同一的接口)
2、Cglib库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理类,那么可以使用cglib库。
代理类的各个方法中通常除了要调用目标方法和对外返回目标方法的结果外,还可以在代理方法中的如下四个位置上加上系统功能代码。
1、目标方法前
2、目标方法后
3、目标方法前后
4、在处理目标方法异常的catch块中
void sayHello(){
....... //前
try{
target.sayHello();
}catch(Exception){
...... //捕获异常块中
}
...... //后
}
3、代码实现jdk动态代理
Collection proxy2 = (Collection) Proxy.newProxyInstance(
Collection.class.getClassLoader(),
new Class[]{Collection.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
ArrayList target=new ArrayList();
Object retVal = method.invoke(target, args);
return retVal;
}
});
//代理类执行的方法,全部交给InvocationHandler.invoke()方法
//调用的全都是 目标类 中的方法。
proxy2.add("1");
proxy2.add("2");
proxy2.add("3");
System.out.println(proxy2.size());
参考:http://blog.csdn.net/heyutao007/article/details/49738887
AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行。不同的切入时机对应不同的Interceptor的种类,如BeforeAdviseInterceptor,AfterAdviseInterceptor以及ThrowsAdviseInterceptor等)。
AOP的源码中用到了两种动态代理来实现拦截切入功能:jdk动态代理和cglib动态代理。两种方法同时存在,各有优劣。
jdk动态代理是由Java内部的反射机制来实现的,
cglib动态代理底层则是借助asm来实现的。