cglib 动态代理实现AOP

1.在jdk的动态代理中必须要求类实现了接口,要是一个类没有实现接口,那么此时我们应该怎么办呢?

使用cglib我们就可以不用实现就可以生成动态代理对象

cgLib动态代理实现 详细看代码注释

package com.qunar.dynaproxy.cglib;

public interface PersonService {
	public void save(String name);
	public void update(String name,Integer personId);
	public String getPersonName(Integer personId);
}

package com.qunar.dynaproxy.cglib;

public class PersonServiceBean implements PersonService {
	private String user = null;

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public PersonServiceBean() {

	}

	public PersonServiceBean(String user) {
		this.user = user;
	}

	@Override
	public void save(String name) {
		System.out.println("i am save()");

	}

	@Override
	public void update(String name, Integer personId) {
		System.out.println("i am update()");
	}

	@Override
	public String getPersonName(Integer personId) {
		System.out.println("i am getPersonName()");
		return "xxxxxxx";
	}

}

package com.qunar.dynaproxy.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 CGlibProxyFactory implements MethodInterceptor{
	private Object targetObject;
	
	/**
	 * 
	 * @param targetObject
	 * @return
	 */
	public Object createProxyInstance(Object targetObject) {
		this.targetObject = targetObject;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.targetObject.getClass());// 设置父类,也就是目标类,这样就会产生一个类并覆盖目标类中所有final的方法
		enhancer.setCallback(this);//设置回调,要想让这个类的对象作为回调则,该类必须实现MethodInterceptor接口
		return enhancer.create();
	}
	
	
	/**
	 * 当代理对象的方法被调用的时候可以回调这个方法
	 * @param arg0 表示代理对象本身
	 * @param arg1 表示被拦截到的方法
	 * @param arg2 方法的参数
	 * @param arg3 方法的代理对象
	 */
	public Object intercept(Object arg0, Method arg1, Object[] arg2,
			MethodProxy arg3) throws Throwable {
		
		PersonServiceBean bean = (PersonServiceBean)this.targetObject;
		Object result = null;
		if(bean.getUser()!=null){
			this.before(arg1.getName());//advice 前置通知
			try{
			 arg3.invoke(targetObject, arg2);
			 //afterAdvice -->后置通知
			}catch(Exception e){
			 //ExceptionAdivce -->例外通知
			}finally{
			 //finallyAdvice-->最终通知
			}
		}
		return result;
	}


	private void before(String name) {
		System.out.println(name+"method"+"start");
	}
}
测试类:

package com.qunar.spring.test;

import org.junit.Test;

import com.qunar.dynaproxy.cglib.CGlibProxyFactory;
import com.qunar.dynaproxy.cglib.PersonService;
import com.qunar.dynaproxy.cglib.PersonServiceBean;

public class TestCGlib {
	@Test
	public void testCGlibProxy(){
		CGlibProxyFactory factory = new CGlibProxyFactory();
		PersonService service = (PersonService) factory.createProxyInstance(new PersonServiceBean("suhao"));
		service.save("888888");
	}
}

测试结果:
savemethodstart
i am save()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值