zoukankan      html  css  js  c++  java
  • AOP底层原理剖析

     这是一个小的demo,进一步能理解AOP

     有接口用     GDK动态代理

     没有接口     CGLIB动态代理


    package proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    

    interface LogService{   void doSave(); } interface UserService{ void doUpdate(); }

    class LogServiceImpl implements LogService{//目标对象(target) @Override public void doSave() { //System.out.println("method start"); System.out.println("save log"); //System.out.println("method end"); } } class UserServiceImpl implements UserService{ @Override public void doUpdate() { System.out.println("update user"); } }


    class LogAspect{//Aspect(切面) public void before(){//@Before System.out.println("method start"); } public void after(){//@After System.out.println("method end"); } } public class TestProxy01 { //在此类的对象方法中调用目标对象方法,添加业务扩展功能. static class ServiceHandler implements InvocationHandler{ private Object target;//目标对象 private LogAspect logAspect=new LogAspect(); public ServiceHandler(Object target) { this.target=target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //执行日志切面方法(before) logAspect.before(); //执行目标对象方法(save) Object result=method.invoke(target, args); //执行日志切面方法(after) logAspect.after(); return result; }//整合核心业务调用与扩展业务调用 } /**借助JDK API(Proxy)为目标对象创建动态代理对象*/ static Object newServiceProxy(Object target){ return Proxy.newProxyInstance( target.getClass().getClassLoader(),//loader target.getClass().getInterfaces(), //interfaces (目标对象实现的接口) new ServiceHandler(target));//handler } public static void main(String[] args) {
    LogService logService
    =(LogService) newServiceProxy(new LogServiceImpl());
    System.out.println(logService.getClass().getName()); logService.doSave();
    //当调用doSave方法,系统底层会调用Handler对象的 //invoke方法,执行核心业务与扩展业务的整合. //========================== UserService userService=(UserService) newServiceProxy(new UserServiceImpl()); userService.doUpdate(); } }

      

  • 相关阅读:
    [开源]用MQL4实现MD5加密
    如何转换WMV到MP3,WMV到MP3播放器
    C# Winform TreeView 的一些基本用法
    WinServer 2008 远程桌面连接设置
    存储数据类型的转化总结
    EF中执行sql语句,以及事务
    C#(委托a)
    LINQ绑定List到GridView
    循环遍历DataTable绑定到Table
    要将 ASP.NET 访问权限授予某个文件,请在资源管理器中右击该文件,选择“属性”,然后选择“安全”选项卡。单击“添加”添加适当的用户或组。突出显示 ASP.NET 帐户,选中所需访问权限对应的框。
  • 原文地址:https://www.cnblogs.com/misscai/p/9815471.html
Copyright © 2011-2022 走看看