Spring JDK动态代理和使用CGLIB生成代理

package cn.itcast.service;

public interface PersonService {
	public void save(String name);

	public void update(String name, Integer personid);

	public String getPersonName(Integer personid);
}

 

package cn.itcast.service.impl;

import cn.itcast.service.PersonService;

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

	public String getUser() {
		return user;
	}

	public PersonServiceBean() {
	}

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

	public String getPersonName(Integer personid) {
		System.out.println("我是getPersonName()方法");
		return "xxx";
	}

	public void save(String name) {
		System.out.println("我是save()方法");
	}

	public void update(String name, Integer personid) {
		System.out.println("我是update()方法");
	}
}

 

 

package cn.itcast.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import cn.itcast.service.impl.PersonServiceBean;

public class JDKProxyFactory implements InvocationHandler {
	// 目标类
	private Object targetObject;

	public Object createProxyIntance(Object targetObject) {
		this.targetObject = targetObject;
		/*
		 * Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 
		 * 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器
		 * 第二个参数设置代理类实现的接口
		 * 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法
		 */
		return Proxy.newProxyInstance(this.targetObject.getClass()
				.getClassLoader(),
				this.targetObject.getClass().getInterfaces(), this);
	}

	// 该方法自动调用
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {// 环绕通知
		PersonServiceBean bean = (PersonServiceBean) this.targetObject;
		Object result = null;
		if (bean.getUser() != null) {
			// ..... advice()-->前置通知
			try {
				result = method.invoke(targetObject, args); // 把方法调用委派给目标对象
				// afteradvice() -->后置通知
			} catch (RuntimeException e) {
				// exceptionadvice()--> 例外通知
			} finally {
				// finallyadvice(); -->最终通知
			}
		}
		return result;
	}
}

 

package cn.itcast.aop;

import java.lang.reflect.Method;

import cn.itcast.service.impl.PersonServiceBean;

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;

	public Object createProxyIntance(Object targetObject) {
		this.targetObject = targetObject;
		Enhancer enhancer = new Enhancer(); // 该类用于生成代理对象
		enhancer.setSuperclass(this.targetObject.getClass()); // 设置父类,非final
		enhancer.setCallback(this); // 设置回调用对象为本身
		return enhancer.create();
	}

	// 该方法自动调用
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		PersonServiceBean bean = (PersonServiceBean) this.targetObject;
		Object result = null;
		if (bean.getUser() != null) {
			result = methodProxy.invoke(targetObject, args);
		}
		return result;
	}
}

 

 

package junit.test;

import org.junit.Test;

import cn.itcast.aop.CGlibProxyFactory;
import cn.itcast.aop.JDKProxyFactory;
import cn.itcast.service.PersonService;
import cn.itcast.service.impl.PersonServiceBean;

public class AOPTest {

	@Test
	public void jdkProxyTest() {
		JDKProxyFactory factory = new JDKProxyFactory();
		PersonService service = (PersonService) factory
				.createProxyIntance(new PersonServiceBean("xxx"));
		service.save("jdkProxyTest");
	}

	@Test
	public void cglibProxyTest() {
		CGlibProxyFactory factory = new CGlibProxyFactory();
		PersonServiceBean service = (PersonServiceBean) factory
				.createProxyIntance(new PersonServiceBean("xxx"));
		service.save("cglibProxyTest");
	}
}

 

 

你可能感兴趣的:(JDK动态代理)