AOP的JDK动态代理实现

AOPAspect Oriented Programming)面向切面编程,技术利用横切的方式,通过减少系统的重复代码,降低模块间的耦合度,达到可重用的目的,有利于未来的可操作性和可维护性。

通常用途:日志记录,性能统计,安全控制,事务处理,异常处理等。


动态代理

JDKjava.lang.reflect包下的Proxy类就是构造代理的入口。

这段源代码就是创建代理对象的方法:loader 指被代理类加载;  interfaces指被代理的类接口;h被代理的类的最终目标


AOP的JDK动态代理实现_第1张图片


1、代理接口

/**
 * @ClassName Eat
 * @Description (吃) 提供的服务 牛奶   面包
 * @author Cheng.Wei
 * @date 2017年12月13日 下午10:43:23
 * 
 */
public interface Eat {
	void milk(String name);

	void bread(String name);
	
}


2、接口实现(被代理的目标类)

/**
 * @ClassName EatImpl
 * @Description TODO(这里用一句话描述这个类的作用)
 * @author Cheng.Wei
 * @date 2017年12月13日 下午10:44:41
 * 
 */
public class EatImpl implements Eat{

	/* (non-Javadoc)
	 * @see org.dhweicheng.Eat#milk(java.lang.String)
	 */
	@Override
	public void milk(String name) {
		System.out.println(name + "喝牛奶");
		
	}

	/* (non-Javadoc)
	 * @see org.dhweicheng.Eat#bread(java.lang.String)
	 */
	@Override
	public void bread(String name) {
		System.out.println(name + "吃面包");
		
	}

3、代理类

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

/**
 * @ClassName EatAop
 * @author Cheng.Wei
 * @date 2017年12月13日 下午10:48:12
 * {@link java.lang.reflect.InvocationHandler}
 */
public class EatAop implements InvocationHandler {

	private Object target;

	public EatAop(Object target) {
	        this.target = target;
	    }
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("有人吃东西了");
		//对面包进行记录
		if(method.getName().equals("bread")) {
			System.out.println("面包被吃了 !!!");
		}
		return method.invoke(target, args);
	}
}

4、测试

import java.lang.reflect.Proxy;

/**
 * @ClassName Listener
 * @author Cheng.Wei
 * @date 2017年12月13日 下午10:53:54
 * 
 */
public class Listener {
	public static void main(String[] args) {
		// 被代理类
		ClassLoader classLoader = EatImpl.class.getClassLoader();
		// 被代理的接口
		Class[] proxyInterface = new Class[] { Eat.class };
		// 被代理的类的最终目标
		EatAop eatAop = new EatAop(new EatImpl());
		Eat eat = (Eat) Proxy.newProxyInstance(classLoader, proxyInterface, eatAop);
		eat.milk("张三");
		System.out.println("============");
		eat.bread("李四");
	}
}

执行结果

AOP的JDK动态代理实现_第2张图片

你可能感兴趣的:(spring)