zoukankan      html  css  js  c++  java
  • 面向切面编程之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
  • 相关阅读:
    asp.net 文件下载
    net 数据库连接详解 相当经典啊
    取值:webconfig中的key
    通过监听的端口查找本机进程和服务思路
    以系统服务运行某个程序
    测底根除Windows流氓软件开机自动运行
    使用Wireshark在主机上抓取远程主机的数据流量
    记录Windows远程登录日志
    证书不匹配发出告警的解决方法
    WPS office云同步图标彻底删除方法
  • 原文地址:https://www.cnblogs.com/pecool/p/8267837.html
Copyright © 2011-2022 走看看