功能接口
public interface IActor { /** * 基本演出 * @param money */ public void basicAct(float money); /** * 危险演出 * @param money */ public void dangerAct(float money); }实现接口的类
public class Actor implements IActor{ public void basicAct(float money){ System.out.println("拿到钱,开始基本的表演:"+money); } public void dangerAct(float money){ System.out.println("拿到钱,开始危险的表演:"+money); } }基于接口创建代理对象
IActor proxyActor = (IActor) Proxy.newProxyInstance( actor.getClass().getClassLoader(), actor.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String name = method.getName(); Float money = (Float) args[0]; Object rtValue = null; //每个经纪公司对不同演出收费不一样,此处开始判断 if("basicAct".equals(name)){ if(money > 2000){ rtValue = method.invoke(actor, money/2); } } if("dangerAct".equals(name)){ if(money > 5000){ rtValue = method.invoke(actor, money/2); } } return rtValue; } } }); proxyActor.basicAct(8000f); proxyActor.dangerAct(50000f); } )我们业务层实现类实现业务层接口 ,调用业务层的方法时,总是要开启事务,确保事务能够完整的执行 但是每一个业务层的方法加上事务的代码是很繁琐的,于是我们可以对业务层实现类进行方法的增强(本质就是对方法进行拦截处理)
public class BeanFactory { public static IAccountService getAccountService() { final IAccountService accountService = new AccountServiceImpl(); IAccountService proxyAccountService = (IAccountService) Proxy.newProxyInstance( accountService.getClass().getClassLoader(), accountService.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method,Object[] args) throws Throwable { Object rtValue = null; try { //开启事务 TransactionManager.beginTransaction(); //执行业务层方法 rtValue = method.invoke(accountService, args); //提交事务 TransactionManager.commit(); }catch(Exception e) { //回滚事务 TransactionManager.rollback(); e.printStackTrace(); }finally { //释放资源 TransactionManager.release(); } return rtValue; } }); return proxyAccountService; } }当我们改造完成之后,业务层用于控制事务的重复代码就都可以删掉了。