spring 代理

针对spring的基本用途,就不多说明了,加载bean的时候需要用到代理,spring的基本代理是jdk和cglib动态代理,区别网上也有说的比较全面的,这里我就copy url
http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html
这篇不错,其中有个地方说的不错:
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

package net.battier.dao;

public interface BookFacade {
	public void addBook();
}


jdk动态代理:
package net.battier.dao.impl;

import net.battier.dao.BookFacade;

public class BookFacadeImpl implements BookFacade {

	@Override
	public void addBook() {
		System.out.println("增加图书方法。。。");
	}

}

、BookFacadeProxy.java

package net.battier.proxy;

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

/**
 * JDK动态代理代理类
 * 
 * @author student
 * 
 */
public class BookFacadeProxy implements InvocationHandler {
	private Object target;
	/**
	 * 绑定委托对象并返回一个代理类
	 * @param target
	 * @return
	 */
	public Object bind(Object target) {
		this.target = target;
		//取得代理对象
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(), this);   //要绑定接口(这是一个缺陷,cglib弥补了这一缺陷)
	}

	@Override
	/**
	 * 调用方法
	 */
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result=null;
		System.out.println("事物开始");
		//执行方法
		result=method.invoke(target, args);
		System.out.println("事物结束");
		return result;
	}

}


cglib动态代理 是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

package net.battier.dao.impl;

/**
 * 这个是没有实现接口的实现类
 * 
 * @author student
 * 
 */
public class BookFacadeImpl1 {
	public void addBook() {
		System.out.println("增加图书的普通方法...");
	}
}


你可能感兴趣的:(spring)