Java动态代理三——模拟AOP实现

Java动态代理三——模拟AOP实现

以下案例模拟AOP实现

目录结构

接口PersonService

复制代码
   
   
package com.ljq.service; public interface PersonService { public void save(String name); public void update(String name, Integer personId); public String getPersonName(Integer personId); }
复制代码

实现类PersonServiceBean

复制代码
   
   
package com.ljq.service.impl; import com.ljq.service.PersonService; public class PersonServiceBean implements PersonService { private String user = null ; public PersonServiceBean() { super (); } public PersonServiceBean(String user) { super (); this .user = user; } public String getPersonName(Integer personId) { System.out.println( " 我是getPersonName()方法 " ); return " get " ; } public void save(String name) { System.out.println( " 我是save()方法 " ); } public void update(String name, Integer personId) { System.out.println( " 我是update()方法 " ); } public String getUser() { return user; } public void setUser(String user) { this .user = user; } }
复制代码

动态代理类JDKProxyFactory

复制代码
   
   
package com.ljq.aop; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import com.ljq.service.impl.PersonServiceBean; public class JDKProxyFactory implements InvocationHandler { // 要代理的原始对象 private Object targer; /** * 创建动态代理 * * @param targer 要代理的原始对象 * @return */ public Object createProxyInstance(Object targer){ this .targer = targer; return Proxy.newProxyInstance( this .targer.getClass().getClassLoader(), this .targer.getClass().getInterfaces(), this ); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null ; PersonServiceBean bean = (PersonServiceBean) this .targer; if (bean.getUser() != null ) { // 前置通知 doBefore(); try { result = method.invoke(targer, args); // 后置通知 doAfter(); } catch (Exception e) { // 例外通知 doException(); } finally { // 最终通知 doFinally(); } } return result; } private void doBefore() { System.out.println( " 我是前置通知 " ); } private void doAfter() { System.out.println( " 我是后置通知 " ); } private void doException() { System.out.println( " 我是例外通知 " ); } private void doFinally() { System.out.println( " 我是最终通知 " ); } }
复制代码

动态代理类CGlibProxyFactory:使用CGLIB技术

复制代码
   
   
package com.ljq.aop; import java.lang.reflect.Method; import com.ljq.service.impl.PersonServiceBean; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CGlibProxyFactory implements MethodInterceptor{ private Object target; public Object createProxyInstance(Object target){ this .target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass( this .target.getClass()); // 非final enhancer.setCallback( this ); return enhancer.create(); } public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object result = null ; PersonServiceBean bean = (PersonServiceBean) this .target; if (bean.getUser() != null ){ // 前置通知 doBefore(); try { result = methodProxy.invoke(target, args); // 后置通知 doAfter(); } catch (Exception e) { // 例外通知 doException(); } finally { // 最终通知 doFinally(); } } return result; } private void doBefore() { System.out.println( " 我是前置通知 " ); } private void doAfter() { System.out.println( " 我是后置通知 " ); } private void doException() { System.out.println( " 我是例外通知 " ); } private void doFinally() { System.out.println( " 我是最终通知 " ); } }
复制代码

测试类AopTest

复制代码
   
   
package com.ljq.test; import com.ljq.aop.CGlibProxyFactory; import com.ljq.aop.JDKProxyFactory; import com.ljq.service.PersonService; import com.ljq.service.impl.PersonServiceBean; public class AopTest { public static void main(String[] args) { proxyTest(); proxyTest2(); } private static void proxyTest() { JDKProxyFactory jdkProxyFactory = new JDKProxyFactory(); PersonService personService = (PersonService)jdkProxyFactory. createProxyInstance( new PersonServiceBean( " zhangsan " )); personService.getPersonName( 1 ); } private static void proxyTest2() { CGlibProxyFactory cglibProxyFactory = new CGlibProxyFactory(); PersonServiceBean bean = (PersonServiceBean)cglibProxyFactory. createProxyInstance( new PersonServiceBean( " lisi " )); bean.save( " a " ); } }
复制代码

运行结果

 

分类:  java高级特性
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值