zoukankan      html  css  js  c++  java
  • java aop面向切面编程

    最近一直在学java的spring boot,一直没有弄明白aop面向切面编程是什么意思。看到一篇文章写得很清楚,终于弄明白了,原来跟python的装饰器一样的效果。http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html

    Aspect Oriented Programming  面向切面编程。解耦是程序员编码开发过程中一直追求的。AOP也是为了解耦所诞生。

    具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流。

    AOP 在Spring框架中被作为核心组成部分之一,的确Spring将AOP发挥到很强大的功能。最常见的就是事务控制。工作之余,对于使用的工具,不免需要了解其所以然。学习了一下,写了些程序帮助理解。

    AOP 主要是利用代理模式的技术来实现的。

    静态代理(代码如下):

    package com.practice.proxypattern;
    
    public interface ITalk {
        public void talk(String msg);
    }
    package com.practice.proxypattern;
    
    public class PeopleTalk implements ITalk {
        private String username;
        private String age;
        public PeopleTalk(String username,String age) {
            this.username=username;
            this.age=age;
        }
        public void talk(String msg) {
            // TODO Auto-generated method stub
            System.out.println(msg+"你好,我是"+username+",我年龄是"+age);
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getAge() {
            return age;
        }
        public void setAge(String age) {
            this.age = age;
        }
        
        
        
        
        
        
        
    }
    package com.practice.proxypattern;
    
    import java.security.PublicKey;
    
    public class TalkProxy implements ITalk{
        private ITalk talker;
        public TalkProxy(ITalk talker) {
            this.talker=talker;
        }
        public void talk(String msg) {
            // TODO Auto-generated method stub
            talker.talk(msg);
        }
        public void talk(String msg,String singname) {
            talker.talk(msg);
            sing(singname);
        }
        private void sing(String singname) {
            System.out.println("唱歌:"+singname);
        }
    
    }
    package com.practice.proxypattern;
    
    public class ProxyPattern {
        public static void main(String[] args) {
            ITalk people=new PeopleTalk("AOP", "18");
            people.talk("No ProXY Test");
            System.out.println("-----------------------");
            TalkProxy talker=new TalkProxy(people);
            talker.talk("ProXY Test","代理");
        }
    }

    运行结果如下:

    No ProXY Test你好,我是AOP,我年龄是18
    -----------------------
    ProXY Test你好,我是AOP,我年龄是18
    唱歌:代理

    添加了一个新功能

    以下是动态代理的代码:

    package com.practice.dynamicproxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class DynamicProxy implements InvocationHandler {
        //需要代理的目标类
        private Object target;
        
        public Object bind(Object target) {
            this.target=target;
            return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        }
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // TODO Auto-generated method stub
            Object result=null;
            System.out.println("切面之前执行");
            result=method.invoke(target, args);
            System.out.println("切面之后执行");
            return result;
        }
    
    }
    package com.practice.dynamicproxy;
    
    import com.practice.proxypattern.ITalk;
    import com.practice.proxypattern.PeopleTalk;
    
    public class Test {
       public static void main(String[] args) {
        ITalk iTalk=(ITalk) new DynamicProxy().bind(new PeopleTalk("DynamicProxy","18"));
        iTalk.talk("业务说明");
    }
    }

    运行结果如下:

    切面之前执行
    业务说明你好,我是DynamicProxy,我年龄是18
    切面之后执行

    同样也添加了新功能 ,与python装饰器的功能大同小异。

  • 相关阅读:
    网页图片垂直剧中 等比例缩放 黑白显示
    vs.net打包(自动检测环境并安装.net framwork)
    22个所见即所得在线Web编辑器
    js验证表单大全3
    js验证表单大全2
    开源界的5大开源许可协议
    ffmpeg参数使用说明2
    ffmpeg参数使用说明1
    js验证表单大全1
    【从零开始学Spring笔记】注解和XML整合开发
  • 原文地址:https://www.cnblogs.com/linwenbin/p/11083463.html
Copyright © 2011-2022 走看看