• 面向切面编程之cglib代理方式


    思想:

      和上一篇面向切面编程之手动JDK代理方式上的需求和开发模式一样。不同的是目标类没有接口,只有实现类,采用的是spring中提供的Enhancer类继承目标类实现的代理方式。

    需要导入的jar包:

      spring的core包,详细看代码。

    代码:

    UserDaoImpl实现类

    package com.xx.cglibproxy;
    
    /**
     * 用户Dao实现类
     * @author phoebe
     *
     */
    public class UserDaoImpl {
    	//增
    	void addUser(){
    		System.out.println("增");
    	}
    	//删
    	void deleteUser(){
    		System.out.println("删");
    	}
    	//改
    	void updateUser(){
    		System.out.println("改");
    	}
    }
    

     切面类:

    package com.xx.cglibproxy;
    
    /**
     * 切面类
     * @author phoebe
     *
     */
    public class MyAspect {
    	//开启事物
    	public void before(){
    		System.out.println("开启事物");
    	}
    	//提交事物
    	public void after(){
    		System.out.println("提交事物");
    	}
    }
    

     cglib代理工厂类:

    package com.xx.cglibproxy;
    
    import java.lang.reflect.Method;
    
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    /**
     * Cglib代理工厂
     * @author phoebe
     *
     */
    public class MyCglibProxyFactory {
    	//被代理类
    	private static UserDaoImpl userDaoImpl=new UserDaoImpl();
    	//切面类
    	private static MyAspect myAspect = new MyAspect();
    	//创建代理对象
    	public static UserDaoImpl createUserDao(){
    		//定义代理对象
    		Enhancer enhancer = new Enhancer();
    		//继承UserDaoImpl
    		enhancer.setSuperclass(UserDaoImpl.class);
    		//设置回调函数
    		enhancer.setCallback(new MethodInterceptor() {
    			@Override
    			public Object intercept(Object obj, Method method, Object[] args,
    					MethodProxy methodProxy) throws Throwable {
    				//执行切面方法
    				myAspect.before();
    				//执行目标方法
    				Object object = method.invoke(userDaoImpl, args);
    				myAspect.after();
    				return object;
    			}
    		});
    		//创建代理
    		UserDaoImpl userDaoImpl = (UserDaoImpl) enhancer.create();
    		return userDaoImpl;
    	}
    }
    

     测试类:

    package com.xx.cglibproxy;
    
    /**
     * 代理类测试
     * @author phoebe
     *
     */
    public class CglibProxyTest {
    	public static void main(String[] args) {
    		UserDaoImpl userDaoImpl = MyCglibProxyFactory.createUserDao();
    		userDaoImpl.addUser();
    		userDaoImpl.deleteUser();
    		userDaoImpl.updateUser();
    	}
    }
    
    Best Regards
  • 相关阅读:
    P3688 [ZJOI2017] 树状数组 【二维线段树】
    CF516D Drazil and Morning Exercise【并查集,结论】
    Luogu5540 最小乘积生成树
    CDW数学小笔记
    ZROI 金华集训 线性代数选讲
    多项式乘法(代码)
    我的vimrc
    P4562 [JXOI2018]游戏
    [POJ3585]Accumulation Degree
    [CH5302]金字塔
  • 原文地址:https://www.cnblogs.com/pecool/p/8267837.html
Copyright © 2020-2023  润新知