Spring 为解耦而诞生,其中AOP(面向切面编程)是很浓重的一笔。
这里简单记录一下AOP 给我带来的好处:
1.
用了一段时间,想通过简单的代码,更好的阐述以及理解它。
以前:假设我们有个简单的业务,还是经典的Hello World,那么我们定义一个Service 接口,一个ServiceImpl 实现类,一个sayHello 方法,这里使用网上很经典的日志记录的例子。
1.Service接口:定义一个sayHello 的业务方法
public interface Service { public void sayHello(); }
2.ServiceImpl实现类:主要是打印HelloWord,但是日常项目中,在主要业务前后可能会添加日志记录,或者开启事务等其他必要操作。
public class ServiceImpl implements Service{ @Override public void sayHello() { System.out.println("前置日记:打印、启动事务等.."); System.out.println("Hello world!"); System.out.println("后置日记:打印、关闭事务等.."); } }
例子很简单,那么假设,我们不光拥有sayHello ,还有sayBye 等多个方法,并且都需要其他操作呢?那么你是不是会写很多个这样的,重复的代码?
当然,你可以减少一部分工作量,你可以这样:
public class ServiceImpl implements Service{ @Override public void sayHello() { before(); System.out.println("Hello world!"); after(); } @Override public void sayBye() { before(); System.out.println("Bye bye!"); after(); } public static void before(){ System.out.println("前置日记:打印、启动事务等.."); } public static void after(){ System.out.println("后置日记:打印、关闭事务等.."); } }
我们再次假设,如果我们拥有更多的业务方法:sayHi(),sayOther()....,需要更多的其他操作:打印信息,传输记录....。并且其他ServiceImpl 里面的方法也需要这些方法呢?那么我们是不是每个类又要继续添加呢?
当然,你可以这样做:建立一个对Service 添加额外功能的类,统一提供。
public class ServiceFactory { public static void before(){ System.out.println("前置日记:打印、启动事务等.."); } public static void after(){ System.out.println("后置日记:打印、关闭事务等.."); } public static void other(){ System.out.println("做其他的事.."); } }
ServiceImpl 就成这样:
public class ServiceImpl implements Service{ @Override public void sayHello() { ServiceFactory.before(); System.out.println("Hello world!"); ServiceFactory.after(); } @Override public void sayBye() { ServiceFactory.before(); System.out.println("Bye bye!"); ServiceFactory.after(); } @Override public void sayHi() { ServiceFactory.before(); System.out.println("Hi"); ServiceFactory.after(); ServiceFactory.other(); } }
这样代码,感觉是少了一些,但是我们的原则是尽量 别重复同样的代码,提高代码的复用性,改动最小为基准。也许业务很复杂,比较多,那么你要重复多少代码,整个类要写得多麻烦所啊!如果到时候有些假设before 和after 需要变化位置,你又要改动多少呢?
当然,目前的的JDK (大于1.3)为了解决这些问题,为我们提供的反射机制,动态代理机制。看看如何更好的解决这个问题。这里先copy 下,什么是代理:
Java的动态代理机制
代理模式是常用的Java设计模式。代理类主要负责为委托类预处理消息、过滤信息、把消息转发给委托类,以及事后处理信息等。
理论 - -总是那么抽象(~。~),简单点说,就是:1.我的目的是去学校,那么校服 早餐 校车,这些我都需要,但是不由我做,全部代理给我父母搞定了(当然我是自己搞定的。)2.再简单的说就是:我只关注我主要的事情,其他附加的事情,全部交给别人搞定。看代码..
MyPorxy 我的代理类:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class MyProxy implements InvocationHandler{ // 目标对象,也就是我们主要的业务,主要目的要做什么事 private Object delegate; /** * 和你额外需要做得事情,进行绑定,返回一个全新的对象(写法,基本上固定的) * @param delegate * @return */ public Object bind(Object delegate){ this.delegate = delegate; return Proxy.newProxyInstance(this.delegate.getClass().getClassLoader(), this.delegate.getClass().getInterfaces(), this); } /** * 你刚才需要执行的方法,都需要通过该方法进行动态调用 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = null; // 执行前置的方法 ServiceFactory.before(); // 通过反射,执行目标方法,也就是你的主要目的 obj = method.invoke(this.delegate, args); // 执行后置的方法 ServiceFactory.after(); // 返回值给调用者 return obj; } }
这里运用的反射知识,还需要去看看,这里就不解释了。
ServiceImpl 变化:
public class ServiceImpl implements Service{ @Override public void sayHello() { System.out.println("Hello world!"); } @Override public void sayBye() { System.out.println("Bye bye!"); } @Override public void sayHi() { System.out.println("Hi"); } }
测试类:
public class Test { /** * 测试类 * @param args */ public static void main(String[] args) { // 不启用代理 //Service service = new ServiceImpl(); // 使用代理 Service service = (Service)new MyProxy().bind(new ServiceImpl()); service.sayHello(); service.sayBye(); service.sayHi(); } }
OK,那么你现在看看,我们的业务实现类ServiceImpl 是不是干净多了,代码是不是在某些地方见过呢?即时你再进行添加更多的方法,也可以同样实现了对吗?当然,在Test里面,假设我们有的方法想用,有的方法不想用,那么又该怎么实现呢?
相关推荐
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
代理模式与动态代理--Spring AOP原理.doc
SpringAOP学习笔记以及四个可运行的Demo,涵盖经典代理模式、基于注解、基于xml配置这3方面的Demo
springAOP指的是在spring中的AOP,什么是AOP,相对于java中的面向对象(oop),在面向对象中一些公共的行为,像日志记录,权限验证等如果都使用面向对象来做,会在每个业务方法中都写上重复的代码,造成代码的冗余。...
SpringAOP之探秘(动态代理、责任链模式、注解使用)- 详情:https://blog.csdn.net/Dream_Weave/article/details/85008674
NULL 博文链接:https://arne3166.iteye.com/blog/1046340
package com.gc.aop下为:aop方式ProxyFactoryBean代理 package com.gc.aop下为:aop方式...package com.gc.proxy下为:自定义代理模式(面向接口编程) package com.gc.normal下为:通用日志处理方式
为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...
spring框架的AOP代理模式讲解及例子
Spring AOP是基于代理模式实现的,主要包括动态代理、通知(Advice)、切点(Pointcut)、切面(Aspect)和连接点(Join point)。动态代理是实现AOP的基础,它通过JDK动态代理或CGLIB代理生成被代理对象的子类。...
何谓Spring AOP? Spring AOP 是基于 AOP 编程模式的一个框架,它的...课程从Spring AOP概念开始引入,通过Spring AOP代理和判断模式进行,宝库各种模式,不断的深入学习,相信会给同学们带来不一样的Spring AOP技术
Spring AOP主要基于动态代理模式,它允许开发者在不改变原有代码结构的情况下,增加额外的行为。这主要通过定义“切面(Aspects)”和“通知(Advices)”来实现,其中切面定义了何时以及如何插入额外的行为,而通知...
代理模式其实很简单 主要包括 接口+真实的实现类+代理类 在真实类的实例化的时候 使用代理类,所以需要 Spring AOP 做的是生成一个代理类,然后替换真实的类 去对外提供服务 那怎么去替换呢? 就是Spring IOC 容器中...
非常详细的介绍Spring AOP全栈技术点,开篇帮助同学们进行知识储备,...从Spring AOP概念开始引入,通过Spring AOP代理和判断模式进行,宝库各种模式,不断的深入学习,相信会给同学们带来不一样的Spring AOP技术体验。
此资源为文章中《代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)》与《 AOP动态代理声明式的3种配置方式过程与区别》的案例代码,可下载参考学习。
NULL 博文链接:https://shaw-n-lu.iteye.com/blog/1747124
Java Spring代理模式AOP-IOC分析
java Spring代理模式AOP-IOC结合
NULL 博文链接:https://fangguanhong.iteye.com/blog/1911895
反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)