最近一直在学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装饰器的功能大同小异。
原文地址:https://www.cnblogs.com/linwenbin/p/11083463.html
时间: 2024-10-12 12:32:14