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

你可能感兴趣的:(spring aop)