zoukankan      html  css  js  c++  java
  • Spring AOP关于cglib动态代理

    一:

        Spring AOP的默认代理方式是jdk动态代理,还有另外一种代理方式是cglib代理,简单说前者基于接口,后者基于继承,基本思路是将被代理对象的类作为父类,然后创建子类来进行方法的调用,调用的同时可以插入我们需要加入的方法。

    二:

    (1)pojo类

    package net.wang.cglib;
    
    /**
     * User pojo类
     * @author LiuRuoWang
     */
    public class User {
    	
    	private Integer id;
    	
    	private String name;
    	
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	
    	public Integer getId() {
    		return id;
    	}
    	
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	public String getName() {
    		return name;
    	}
    }
    

    (2)接口UserService

    package net.wang.cglib;
    
    public interface UserService {
    	
    	public void addUser(User user);
    	
    	public User getUser(int id);
    }
    

    (3)实现类UserServiceImpl

    package net.wang.cglib;
    
    public class UserServiceImpl implements UserService{
    
    	public void addUser(User user) {
    		System.out.println("add User!");
    	}
    
    	public User getUser(int id) {
    		User user=new User();
    		user.setId(id);
    		System.out.println("get User!");
    		return user;
    	}
    	
    }
    

    (4)中间类CGProxy,需实现MethodInterceptor接口

    package net.wang.cglib;
    
    import java.lang.reflect.Method;
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    
    public class CGProxy implements MethodInterceptor{
    	
    	//代理对象
    	private Object target;
    	
    	public CGProxy(Object target) {
    		this.target=target;
    	}
    	
    	public Object getProxyObject(){
    		Enhancer enhancer = new Enhancer();
    		//设置被代理对象类为父类
    		enhancer.setSuperclass(target.getClass());
    		//回调intercept方法
    		enhancer.setCallback(this);
    		//创建代理对象
    		return enhancer.create();
    	}
    
    	public Object intercept(Object arg0, Method arg1, Object[] arg2,
    			MethodProxy arg3) throws Throwable {
    		System.out.println("do sth before!");
    		Object result=arg3.invokeSuper(arg0, arg2);
    		System.out.println("do sth after!");
    		return result;
    	}
    	
    	
    }
    

    (5)测试

    package net.wang.cglib;
    
    public class CGProxyTest {
    	public static void main(String[] args) {
    		//被代理对象
    		Object proxyedObject = new UserServiceImpl();
    		CGProxy cgProxy = new CGProxy(proxyedObject);
    		UserService proxyObject = (UserService) cgProxy.getProxyObject();
    		proxyObject.getUser(1);
    		proxyObject.addUser(new User());
    	}
    }
    

     

    以上代码继承接口,并不是代表着基于jdk动态代理方式,只是纯粹的面向接口编程,具体是哪种代理方式,还需看中间类的具体实现。

    结果:

    image

  • 相关阅读:
    利用python求非线性方程
    迪士尼穷游攻略
    爬虫八之爬取京东商品信息
    爬虫七之分析Ajax请求并爬取今日头条
    爬虫五之Selenium
    爬虫4之pyquery
    前端传入 SQL 语句 到后端执行
    手写分页处理
    集合(Map,List)分组:多属性进行分组
    java 枚举类非常好的运用实例
  • 原文地址:https://www.cnblogs.com/liuruowang/p/4546215.html
Copyright © 2011-2022 走看看