当前位置:编程学习 > JAVA >>

对spring的aop理解

1、问题
 
 
问题:想要添加日志记录、性能监控、安全监测
2、最初解决方案
2.1、最初解决方案
缺点:太多重复代码,且紧耦合
2.2、抽象类进行共性设计,子类进行个性设计,此处不讲解,缺点一荣俱荣,一损俱损
2.3、使用装饰器模式/代理模式改进的解决方案
装饰器模式:动态地给一个对象添加一些额外的职责。就增加功能来说, 装饰器模式相比生成子类更为灵活。
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
 
缺点:紧耦合,每个业务逻辑需要一个装饰器实现或代理
 
2.4、JDK动态代理解决方案(比较通用的解决方案)
Java代码  
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//1.记录日志 2.时间统计开始 3.安全检查
Object retVal = method.invoke(target, args);
//4.时间统计结束
return retVal;
}
public static Object proxy(Object target) {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInte易做图ces(), new MyInvocationHandler(target));
}
}
[java]  
public class MyInvocationHandler implements InvocationHandler {   
    private Object target;  
    public MyInvocationHandler(Object target) {  
        this.target = target;  
    }  
    @Override  
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
        //1.记录日志    2.时间统计开始      3.安全检查  
        Object retVal = method.invoke(target, args);  
        //4.时间统计结束  
        return retVal;     
    }  
    public static Object proxy(Object target) {  
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),   
                target.getClass().getInte易做图ces(), new MyInvocationHandler(target));  
    }  
}  
编程模型
Java代码  
//proxy 在其上调用方法的代理实例
//method 拦截的方法
//args 拦截的参数
Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object retVal=null;
//预处理
//前置条件判断
boolean ok = true;
if(!ok) {//不满足条件
throw new RuntimeException("你没有权限");
}
else {//反射调用目标对象的某个方法
retVal = method.invoke(target, args);
}
//后处理
return retVal;
}
[java]  
//proxy     在其上调用方法的代理实例   
//method 拦截的方法  
//args       拦截的参数  
Override  
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
     Object retVal=null;  
     //预处理  
     //前置条件判断  
     boolean ok = true;          
     if(!ok) {//不满足条件  
         throw new RuntimeException("你没有权限");  
     }  
     else {//反射调用目标对象的某个方法  
         retVal = method.invoke(target, args);  
     }  
     //后处理  
     return retVal;  
 }  
缺点:使用麻烦,不能代理类,只能代理接口
CGLIB动态代理解决方案(比较通用的解决方案)
Java代码  
public class MyInterceptor implements MethodInterceptor {
private Object target;
public MyInterceptor(Object target) {
this.target = target;
}
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy invocation) throws Throwable {
//1.记录日志 2.时间统计开始 3.安全检查
Object retVal = invocation.invoke(target, args);
//4.时间统计结束
return retVal;
}
public static Object proxy(Object target) {
return Enhancer.create(target.getClass(), new MyInterceptor(target));
}
}
[java]  
public class MyInterceptor implements MethodInterceptor  {    
    private Object target;  
    public MyInterceptor(Object target) {  
        this.target = target;  
    }  
    @Override  
    public Object intercept(Object proxy, Method method, Object[] args,   
                                         MethodProxy invocation) throws Throwable {  
        //1.记录日志 2.时间统计开始   3.安全检查  
        Object retVal = invocation.invoke(target, args);  
        //4.时间统计结束  
        return retVal;     
    }  
    public static Object proxy(Object target) {  
        return Enhancer.create(target.getClass(), new MyInterceptor(target));  
    }  
}  
编程模型
Java代码  
//proxy 在其上调用方法的代理实例 method拦截的方法 args 拦截的参数
//invocation 用来去调用被代理对象方法的
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy invocation) throws Throwable {
//预处理
//前置条件判断
boolean ok = true;
if(!ok) {//不满足条件
throw new RuntimeException("出错了");
}
else {//调用目标对象的某个方法
Object retVal = invocation.invoke(target, args);
}
//后处理
return retVal;
}
[java]  
 //proxy 在其上调用方法的代理实例    method拦截的方法    args  拦截的参数  
 //invocation 用来去调用被代理对象方法的  
@Override  
public Object intercept(Object proxy, Method method, Object[] args,   
                                       MethodProxy invocation) throws Throwable {  
    //预处理  
    //前
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,