Spring part 3:AOP中的代理

 

 

 

JDK动态代理

接口

public interface IService {
	public void method();
}

实现类

public class ServiceImpl implements IService {

	@Override
	public void method() {
		System.out.println("ServiceImpl--->method()");
	}

}

proxy

public class JDKProxy implements InvocationHandler {

	private Object target;

	public Object getProxy(Object target) {
		this.target = target;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println(proxy.getClass().toString());
		System.out.println("before...");
		Object invoke = method.invoke(target, args);
		System.out.println("after...");
		return invoke;
	}

}

测试

	@Test
	public void demo01() {
		IService service = new ServiceImpl();
		JDKProxy proxy = new JDKProxy();
		IService serviceProxy = (IService) proxy.getProxy(service);
		serviceProxy.method();
	}
/**
class $Proxy4
before...
ServiceImpl--->method()
after...
*/

JDK的这种动态代理必须基于接口,代理后的对象也必须转换为接口才能操作

 

CGLIB代理

接口,同上

实现类,同上

proxy

public class CGLIBProxy implements MethodInterceptor{
	
	private Enhancer enhancer = new Enhancer();
	
	public Object getProxy(Class<?> clazz){
		//这只代理目标类
		enhancer.setSuperclass(clazz);
		//设置回调
		enhancer.setCallback(this);
		return enhancer.create();
	}

	@Override
	public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
		System.out.println(proxy.getClass().toString());
		System.out.println("before...");
		Object invoke = methodProxy.invokeSuper(proxy, args);
		System.out.println("after...");
		return invoke;
	}

}

测试

@Test
	public void demo2() {
		IService service = new ServiceImpl();
		CGLIBProxy proxy = new CGLIBProxy();
		ServiceImpl serviceProxy = (ServiceImpl) proxy.getProxy(service.getClass());
		serviceProxy.method();
	}
/**
class demo01.ServiceImpl$$EnhancerByCGLIB$$6cb2203b
before...
ServiceImpl--->method()
after...

*/

Spring AOP 底层,会判断用户是根据接口代理还是目标类代理,如果针对接口代理 使用JDK代理,如果针对目标类代理 使用Cglib代理

 

 

 JDK动态代理是针对目标接口生成一个实现类该类为代理对象,目标对象和代理对象没有任何关系

CGLIB根据目标对象生成一个继承目标对象的子类,代理对象和目标对象是继承关系

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Spring part 3:AOP中的代理)