zoukankan      html  css  js  c++  java
  • 【Spring Aop】Spring Aop原理

    参考链接:http://www.cnblogs.com/lcngu/p/5339555.html

    Spring AOP是spring框架中除了IOC外另一个重要的技术。

    问题:代码混乱,越来越多的非业务需求,如日志和验证等加入后 ,原有的业务方法急剧膨胀,每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点。

       代码分散:以日志需求为例,只是为了满足这个单一的需求,就不得不在多个模块,也就是方法中多次重复相同得日志代码,如果日志需求发生变化,必须修改所有得模块。

      这就需要我们需要使用一种技术来解决这种问题。

    解决:使用动态代理,动态代理也就是AOP得核心思想。

    日志接口:

    public interface Logger {
    
        void start(Method method);
    
        void end(Method method);
    }

    日志接口的实现类:

    public class DLogger  implements Logger{
    
    
        @Override
        public void start(Method method) {
            System.out.println(method.getName()+"start...");
        }
    
        @Override
        public void end(Method method) {
            System.out.println(method.getName()+"end...");
        }
    }

    业务接口:

    public interface IHello {
    
        void sayHello();
    
    }

    业务接口实现类:

    public class Hello implements IHello {
        @Override
        public void sayHello() {
            System.out.print("hello");
        }
    }

    动态代理类:

    public class DynamicProxy implements InvocationHandler {
    
        private Object proxy;  //代理类
        private Object target;  //目标类
    
        public Object bind(Object proxy,Object target){
            this.proxy = proxy;
            this.target = target;
            return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),this.target.getClass().getInterfaces(),this);
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object result = null;
            Class clazz = this.proxy.getClass();
            Method start = clazz.getDeclaredMethod("start",new Class[]{Method.class});
            start.invoke(this.proxy,new Object[]{method});
            method.invoke(this.target,args);
            Method end = clazz.getDeclaredMethod("end",new Class[]{Method.class});
            end.invoke(this.proxy,new Object[]{method});
            return null;
        }
    }

    测试:

    public class Main {
    
        public static void main(String[] args){
            IHello hello = (IHello) new DynamicProxy().bind(new DLogger(),new Hello());
            hello.sayHello();
        }
    }

    上述代码已经完成了一个基本的aop功能。如果我们想让指定的方法打印日志,我们只需要在invoke()方法中加一个对method名字的判断,method的名字可以写在xml文件中,这样我们就可以实现以配置文件进行解耦了。

  • 相关阅读:
    收集一些关于前端的网站(持续更新)
    关于表单设计(登录)的几点感悟
    css样式表中的样式覆盖顺序(转)
    UI设计常用网站(随时更新)
    关于ps安装遇到的问题解决(转载整理)
    【工作记录】解决溢出div自适应的高度问题
    Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resource. 报错处理
    [css]img垂直居中的方法
    iOS学习第三天杂记
    iOS学习第二天杂记--UI
  • 原文地址:https://www.cnblogs.com/lfdingye/p/7358387.html
Copyright © 2011-2022 走看看