代理模式的进一步理解(动态代理)

动态代理:(前提是要有接口)
CGLIB实现的动态代理:不需要有接口


业务层的动态代理实例:


package 动态代理设计模式;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


public class ServiceProxy  implements InvocationHandler{

    private Object target ;//真实对象
    public Object bind(Object target){//返回代理对象
        this.target=target;//绑定真实对象
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);
    }
    
    /**
     * 代理类代理真实主题的操作方法
     * @param proxy:代理类的对象
     * 需要真实主题对象来执行真实的主题任务
     */
    
    public void ready(){
        System.out.println("关闭自动提交事务");
    }
    public void commit(){
        System.out.println("提交事务");
    }
    public void rollback(){
        System.out.println("回滚事务");
    }
    public void close(){
        System.out.println("关闭数据库连接");
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object result=null;
        if(method.getName().startsWith("do")){
            
            this.ready();
            try{
                result=method.invoke(this.target, args);
                this.commit();
            
            }catch(Exception e){
                this.rollback();
            }finally{
                this.close();
            }
            
        }else{
            result=method.invoke(this.target, args);
        }
        return result;//返回真实对象操作的结果
    }

    

}

 

posted @ 2017-10-21 20:41  scwyfy  阅读(179)  评论(0编辑  收藏  举报