手动实现aop使用的动态代理和cglib代理

spring的aop使用的是动态代理和cglib代理,在对象有实现接口的情况下使用动态代理,没有实现接口的情况下使用cglib代理。

cglib代理是继承目标对象来创建代理,所以目标对象不能使用final修饰。

目标对象:

public class TestServiceImpl implements TestService {

	public void save() {
		System.out.println("保存");
	}
	public void update() {
		System.out.println("更改");
	}
	public void delete() {
		System.out.println("删除");
	}
	public void select() {
		System.out.println("查找");
	}

}

动态代理:


package com.vhukze.proxy;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;

import com.vhukze.service.TestService;
import com.vhukze.service.serviceimpl.TestServiceImpl;

/**
* @author zsz
* @version 
* @创建时间:2019年9月18日 上午9:09:17
*/
public class TestServiceProxyFactory {

	private TestServiceImpl service;
	public TestServiceProxyFactory(TestService service) {
		this.service = (TestServiceImpl) service;
	}

	public TestService getTestServiceProxy() {
		//生成动态代理							第一个参数是一个类加载器                        目标对象实现的接口的数组				
		TestService serviceProxy = (TestService) Proxy.newProxyInstance(TestServiceProxyFactory.class.getClassLoader(), TestServiceImpl.class.getInterfaces(), 
								new InvocationHandler() {
									public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable {
										System.out.println("开启事务");
										//参数一是当前执行此方法的对象 参数二是此方法的参数
										Object invoke = method.invoke(service, arg2);
										System.out.println("提交事务");
										return invoke;
									}
								});
		return serviceProxy;
	}
}


测试方法:

/**
* @author zsz
* @编辑时间 2019年9月18日上午9:44:03
* @编辑说明  动态代理测试
*/
@Test
public void fun1() {
	TestServiceProxyFactory proxy = new TestServiceProxyFactory(new TestServiceImpl());
	TestService serviceProxy = proxy.getTestServiceProxy();
	serviceProxy.select();
}

结果:

cglib代理:


package com.vhukze.proxy;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import com.vhukze.service.TestService;
import com.vhukze.service.serviceimpl.TestServiceImpl;

/**
* @author zsz
* @version 
* @创建时间:2019年9月18日 上午9:09:17
*/
public class TestServiceProxyFactory2{


	public TestService getTestServiceProxy(){
		//帮我们生成代理对象
		Enhancer en = new Enhancer();
		
		//设置对谁代理
		en.setSuperclass(TestServiceImpl.class);
		
		//设置代理要做什么
		en.setCallback(new MethodInterceptor() {
			
			public Object intercept(Object proxyObj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
				System.out.println("开启事务");
				Object returnValue = methodProxy.invokeSuper(proxyObj, arg);
				System.out.println("提交事务");
				return returnValue;
			}
		});
		
		return (TestService) en.create();
	}
}


测试方法:

	
/**
* @author zsz
* @编辑时间 2019年9月18日上午9:44:03
* @编辑说明  cglib代理测试
*/
@Test
public void fun2() {
	TestServiceProxyFactory2 proxy = new TestServiceProxyFactory2();
	TestService serviceProxy = proxy.getTestServiceProxy();
	serviceProxy.select();
}

结果:

扫描二维码关注公众号,回复: 9078619 查看本文章

发布了66 篇原创文章 · 获赞 35 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41890624/article/details/100979739