代理的四种实现方式


1、jdk动态代理 实现

核心:Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this); 

package org.sh.proxy;

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

import org.sh.HellowImpl;
import org.sh.HellowInf;

public class JDKProxyFactory implements InvocationHandler {
	private Object target = null;
	public Object getProxyBean(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 {
		System.out.println("i am proxy");
		Object result = null;
		if(((HellowInf)this.target).getName() != null){
			System.out.println("i am not null");
			try{
				//前置
				result = method.invoke(this.target, args); //注意 this.target 而不是proxy
				//后置
			}catch(Exception e){
				//例外
			}finally{
				//最终
			}
			 
		}
	
		return null;
	}
	
	public static void main(String[] args) {
		
		Object obj = new JDKProxyFactory().getProxyBean(new HellowImpl("wch"));
		HellowInf hellow = (HellowInf) obj;
		hellow.sayHellow();
	}
}
 

2、cglib 代理(导入相应的包,spring会包含 cglib-nodep.jar)

核心:Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass()); //父类 
enhancer.setCallback(this);  //回调
return enhancer.create();

package org.sh.proxy;

import java.lang.reflect.Method;

import org.sh.HellowImpl;
import org.sh.HellowInf;

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 createProxyBean(Object target){
		this.target = target;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(target.getClass()); //父类 
		enhancer.setCallback(this);  //回调
		return enhancer.create();
	}
	@Override
	public Object intercept(Object target, Method method, Object[] arg2,
			MethodProxy methodProxy) throws Throwable {
		HellowInf hellow = (HellowInf) this.target;
		if (hellow.getName()!= null) {
			System.out.println("cglib");
			return methodProxy.invoke(this.target, arg2);
		}
		return null;
	}
	public static void main(String[] args) {
		Object obj = new CGLIBProxyFactory().createProxyBean(new HellowImpl("wch"));
		HellowInf hellow = (HellowInf) obj;
		hellow.sayHellow();
	}
	
}


3、aspect 注解方式

package org.sh.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

@Aspect
public class Myinterceptor {
	@Pointcut("execution(* org.sh.aop.PersonBean.*(..))")
	public void anyMethod(){
		
	}
	@Before("anyMethod() && args(param)")
	public void before(String param){
		//只有一个String类型的参数的方法才会被拦截
		System.out.println("before");
	}
	@AfterReturning(pointcut="anyMethod()",returning="result")
	public void afterReturn(String result){
		//返回stirng类型的result才会被拦截
	}
	@AfterThrowing(pointcut="anyMethod()",throwing="e")
	public void afterThrow(Exception e){
		//e就是方法抛出的异常
	}
	@After("anyMethod()")
	public void after(){
		//最终通知
	}
	@Around("anyMethod()")
	public Object around(ProceedingJoinPoint pjp){
		try {
			//之前
			return pjp.proceed(); //执行方法
			//之后
		} catch (Throwable e) {
			e.printStackTrace();
		}
		return null;
	}
	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		((PersonBean)ac.getBean("personbean")).save();
	}
}

4、配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
	<aop:aspectj-autoproxy/> <!-- 打开注解方式 -->
	<bean id="myinter" class="org.sh.aop.Myinterceptor"></bean>
	<bean id="personbean" class="org.sh.aop.PersonBean"></bean>
	<aop:config>
		<aop:aspect id="myaspect" ref="myinter">
			<aop:pointcut expression="execution(* *(..))" id="pointcut"/>
			<aop:before method="before" arg-names="p" pointcut-ref="pointcut"/>
			<aop:after method=""/>
			<aop:after-returning method=""/>
		</aop:aspect>
	</aop:config>
</beans>


posted @ 2013-08-21 21:52  skyding  阅读(444)  评论(0编辑  收藏  举报