使用jdk和cglib实现spring的aop功能

spring中aop功能的实现实际上是用cglib和jdk实现的,如果目标对象实现了接口那么用的是Jdk的方式实现,如果目标对象没有实现接口那么用的是cglib的方式实现。





*******************

PersonService.java

*******************


package blog.service;

public interface PersonService {
	public String save(String name);
	public String update(String name,Integer userId);
	
}

*******************

PersonServiceBean.java

*******************

package blog.service.impl;

import blog.service.PersonService;

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

	public String getUsername() {
		return username;
	}
	
	public PersonServiceBean(){}
	
	public PersonServiceBean(String username) {
		this.username = username;
	}

	@Override
	public String save(String name) {
		System.out.println("in save method!" + name);
		return null;
	}

	@Override
	public String update(String name, Integer userId) {
		System.out.println("in update method! name = " + name + " id = " + userId + " username = " + username) ;
		return null;
	}

}


*******************

JDKProxyFactory.java

*******************

package blog.aop;

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

import blog.service.impl.PersonServiceBean;

public class JDKProxyFactory implements InvocationHandler{
	private  Object target;
	
	public JDKProxyFactory(){
	}
	
	public JDKProxyFactory(Object target){
		this.target = target;
	}
	
	public  Object creatProxyFactory(Object target){
		this.target = target;
		return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this); 
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {//环绕通知
		PersonServiceBean personServiceBean = (PersonServiceBean)this.target;
		String username = personServiceBean.getUsername();
		Object object = null;
		if (username != null && !"".equals(username.trim())) {
			try {
				//......advice()-->前置通知
				object = method.invoke(this.target, args);
				//......afteradvice()-->后置通知
			} catch (Exception e) {
				//......exceptionadvice()-->例外通知
			}finally{
				//......finallyadvice()-->最终通知
			}
		}
		return object;
	}
	
}


*******************

CglibProxyFactory.java

*******************

package blog.aop;

import java.lang.reflect.Method;

import blog.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 target;
	
	public Object crateProxyFactory(Object target){
		this.target = target;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(target.getClass());//非final
		enhancer.setCallback(this);
		return enhancer.create();
	}

	@Override
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		PersonServiceBean bean = (PersonServiceBean)target;
		Object result = null;
		if (bean.getUsername() != null && !"".equals(bean.getUsername())) {
			result = methodProxy.invoke(bean, args);
		}
		return result;
	}

}


*******************

AOPTest.java

*******************

package junit.test;


import org.junit.BeforeClass;
import org.junit.Test;

import blog.aop.CglibProxyFactory;
import blog.aop.JDKProxyFactory;
import blog.service.PersonService;
import blog.service.impl.PersonServiceBean;

public class AOPTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}
	
	@Test
	public void proxyTest(){
		JDKProxyFactory proxy = new JDKProxyFactory();
		PersonService service = (PersonService)proxy.creatProxyFactory(new PersonServiceBean("dfds"));
		service.save("sdfgsdf");
	}
	
	@Test
	public void proxyTest2(){
		CglibProxyFactory factory = new CglibProxyFactory();
		PersonServiceBean bean = (PersonServiceBean) factory.crateProxyFactory(new PersonServiceBean("dsfds"));
		bean.save("56546fgfd");
	}

}



posted @ 2012-08-05 16:24  xzf007  阅读(243)  评论(0编辑  收藏  举报