java aop面向切面编程

Posted linwenbin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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装饰器的功能大同小异。

 

以上是关于java aop面向切面编程的主要内容,如果未能解决你的问题,请参考以下文章

什么是面向切面编程

Java Spring 切面 aop 超时?

Java——面向切面编程,Spring中的AOP编程

Spring - 切面表达式(切面编程AOP)

java web013——Spring AOP面向切面编程

串线篇面向切面编程AOP