spring——AOP动态代理(JDK)

spring——AOP动态代理(JDK)

1 、基于JDK的动态代理

在这里插入图片描述

1.1、 直接编写测试类

/*newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler
h)
ClassLoader :类加载器,因为动态代理类,借助别人的类加载器。一般使用被代理对象的类加载器。
Class<?>[] interfaces:接口类对象的集合,针对接口的代理,针对哪个接口做代理,一般使用的就是被
代理对象的接口。
InvocationHandler:句柄,回调函数,编写代理的规则代码
public Object invoke(Object arg0, Method arg1, Object[] arg2)
Object arg0:代理对象
Method arg1:被代理的方法
Object[] arg2:被代理方法被执行的时候的参数的数组
*/

package com.kkb.dynamicproxy;
4.4.1.2 结构化设计
方式1import com.kkb.service.IService;
import com.kkb.service.TeamService;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyJDKProxy {
	public static void main(String[] args) {
	//目标对象--被代理对象
	TeamService teamService=new TeamService();
	//返回代理对象 调用JDK中Proxy类中的静态方法newProxyInstance获取动态代理类的实例
	IService proxyService= (IService) Proxy.newProxyInstance(
		teamService.getClass().getClassLoader(),
		teamService.getClass().getInterfaces(),
		new InvocationHandler() {//回调函数 编写代理规则
			@Override
			public Object invoke(Object proxy, Method method, Object[]
args) throws Throwable {
						try {
							System.out.println("开始事务");
							Object invoke = method.invoke(teamService, args);//核
心业务
							System.out.println("提交事务");
							return invoke;
						}catch (Exception e){
							System.out.println("回滚事务");
							e.printStackTrace();
							throw e;
						}finally {
							System.out.println("finally---------");
						}
				}
		}
	);
	//代理对象干活
	proxyService.add();
	System.out.println(teamService.getClass());
	System.out.println(proxyService.getClass()+"--------");
	}
}

1.2 、结构化设计

方式1:
package com.kkb.dynamicproxy;
import com.kkb.aop.AOP;
import com.kkb.service.IService;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler {
	private IService service;//目标对象
	private AOP aop;//切面
	public ProxyHandler(IService service, AOP aop) {
		this.service = service;
		this.aop = aop;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws
Throwable {
		try {
			aop.before();
			Object invoke = method.invoke(service, args);//核心业务
			aop.after();
			return invoke;
		}catch (Exception e){
			aop.exception();
			e.printStackTrace();
			throw e;
		}finally {
			aop.myFinally();
		}
	}
}
public static void main2(String[] args) {
		//目标对象--被代理对象
		TeamService teamService=new TeamService();
		//切面
		AOP tranAop=new TranAOP();
		//返回代理对象 基于JDK的动态代理
		IService proxyService= (IService) Proxy.newProxyInstance(
			teamService.getClass().getClassLoader(),
			teamService.getClass().getInterfaces(),
			new ProxyHandler(teamService,tranAop)
		);
		//代理对象干活
		proxyService.add();
		System.out.println(teamService.getClass());
		System.out.println(proxyService.getClass()+"------");
}

方式2:
package com.kkb.dynamicproxy;
import com.kkb.aop.AOP;
import com.kkb.service.IService;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
	private IService service;//目标对象
	private AOP aop;//切面
	public ProxyFactory(IService service, AOP aop) {
		this.service = service;
		this.aop = aop;
	}
	/**
	* 获取动态代理的示例
	* @return
	*/
	public Object getProxyInstance() {
		return Proxy.newProxyInstance(
				service.getClass().getClassLoader(),
				service.getClass().getInterfaces(),
				new InvocationHandler() {//回调函数 编写代理规则
					@Override
					public Object invoke(Object proxy, Method method, Object[]
args) throws Throwable {
						try {
							aop.before();
							Object invoke = method.invoke(service, args);//核心业
务
							aop.after();
							return invoke;
						}catch (Exception e){
							aop.exception();
							e.printStackTrace();
							throw e;
						}finally {
							aop.myFinally();
						}
					}
				}
		);
	}
}

public static void main(String[] args) {
		//目标对象--被代理对象
		TeamService teamService=new TeamService();
		//切面
		AOP tranAop=new TranAOP();
		AOP logAop=new LogAop();
		//获取代理对象
		IService service= (IService) new
ProxyFactory(teamService,tranAop).getProxyInstance();
		IService service1= (IService) new
ProxyFactory(service,logAop).getProxyInstance();
		service1.add();//核心业务+服务代码混合在一起的完整的业务方法
}

Factory(teamService,tranAop).getProxyInstance();
IService service1= (IService) new
ProxyFactory(service,logAop).getProxyInstance();
service1.add();//核心业务+服务代码混合在一起的完整的业务方法
}


##### 注意:代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用JDK动态代理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值