zoukankan      html  css  js  c++  java
  • Cglib

        Cglib 底层通过 ASM 框架实现;

       通过实现MethodInterceptor 接口来定义横切逻辑

     实现上述接口的过程中,通过 Enhancer 设置父类,调用本身,生成代理对象。 

    测试用例

    创建代理类

    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    public class CglibProxyFactory implements MethodInterceptor {
    
    	// 维护目标对象
    	private Object target;
    
    	public CglibProxyFactory(Object target) {
    		this.target = target;
    	}
    
    	// 给目标对象创建一个代理对象
    	public Object getProxyInstance() {
    		// 1.工具类
    		Enhancer en = new Enhancer();
    		// 2.设置父类
    		en.setSuperclass(target.getClass());
    		// 3.设置回调函数
    		en.setCallback(this);
    		// 4.创建子类(代理对象)
    		return en.create();
    
    	}
    
    	@Override
    	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    		
    		System.out.println("开始事务...");
    
    		// 执行目标对象的方法
    		Object returnValue = method.invoke(target, args);
    
    		System.out.println("提交事务...");
    
    		return returnValue;
    	}
    
    }
    

    测试

    public class CglibProxyAppTest {
    
    	@Test
    	public void test() {
    		// 目标对象
    		UserDao target = new UserDao();
    
    		// 代理对象
    		UserDao proxy = (UserDao) new CglibProxyFactory(target).getProxyInstance();
    
    		// 执行代理对象的方法
    		proxy.save();
    	}
    
    }
    

      

     

       

  • 相关阅读:
    Apache mod_rewrite
    vim 常用设置
    ssh 和 scp 命令访问非默认22端口。
    gulp常用插件
    gulp+Babel 搭建ES6环境
    ES6类与模块
    Autoprefixer处理CSS3属性前缀
    js模块方案
    ES6转码器babel的使用
    window.history.pushState与ajax实现无刷新更新页面url
  • 原文地址:https://www.cnblogs.com/Jomini/p/13658921.html
Copyright © 2011-2022 走看看