1. 面向切面编程(AOP)原理以及Helloworld
对于AOP我们可以这样类比。
如果我们要测量挖掘海底的沉积物,我们在海平面放一个船,船投下一个抓头,抓斗穿过厚厚的海水达到海底,抓到物质,然后再次穿越厚厚的海水,把沉积物拉到船上。
这个过程中
拿出抓斗,从船上下抓斗è抓头穿过海底,沉入海底è抓斗达到海底抓取沉积物è抓斗穿出海面è取下抓斗,把抓斗收好
如果对于结构化编程
拿抓斗()è丢抓斗()è抓物品()è拉抓斗()è回收抓斗()
对于面向对象
船员.拿抓斗è船员.丢抓斗()è抓斗.抓物品()è船员.拉抓斗()è船员.回收抓斗()
对于面向切面编程
有船员这个切面
船员:船员.拿抓斗è船员.丢抓斗()è船员.拉抓斗()è船员.回收抓斗()
抓斗: 抓斗.抓物品()
从比较中,我们可以发现,结构化编程是效率最高的,面向对象最大的优势是方便维护,面向切面不仅仅方便维护,虽然整体流程复杂了,但是对于程序来说,仅仅只要完成抓斗的代码,其他的代码交给Spring这些AOP框架去处理。而且AOP解耦的程度比OOP要高很多。
例如,我们写一个数据操作的时候,一般的流程就是先打开数据库,然后执行操作,最后释放资源和关闭连接,对于不同的业务,主要是执行的操作的变化,而打开数据库和释放资源一般都是类型的。而这种代码在业务中,会分散程序员的注意力。如果我们程序只需要执行里面的操作,不需要把精力放在资源释放和关闭连接上,那对程序员来说就是一种解脱。
2. AOP Helloworld
定义接口
package com.greysh.aop.service;
public interface HelloWorld {
public void say();
}
对应的实现为
package com.greysh.aop.service.impl;
import com.greysh.aop.service.HelloWorld;
public class HelloWorldImpl implements HelloWorld {
public void say() {
System.out.println("Say HelloWorld");
}
}
程序调用的时候
package com.greysh.aop.test;
import com.greysh.aop.factory.ProxyFactory;
import com.greysh.aop.service.HelloWorld;
import com.greysh.aop.service.impl.HelloWorldImpl;
public class TestHelloWorld {
public static void main(String[] args) {
HelloWorld mb = new HelloWorldImpl();
HelloWorld bi = (HelloWorld) ProxyFactory.getProxy(mb);
bi.say();
}
}
工厂
package com.greysh.aop.factory;
import java.lang.reflect.Proxy;
import com.greysh.aop.proxy.ProxyHandler;
public class ProxyFactory {
public static Object getProxy(Object obj) {
ProxyHandler bn = new ProxyHandler();
bn.setTarget(obj);
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), bn);
}
}
代理和反射类
package com.greysh.aop.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler {
private Object target;
public void setTarget(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before Helloworld");
@SuppressWarnings("unused")
Object result = method.invoke(target, args);
System.out.println("Finish Helloworld");
return null;
}
}
程序运行时候的结果是
Before Helloworld
Say HelloWorld
Finish Helloworld
如果不是用AOP,那么打印的结果
Say HelloWorld
这5个文件构成一个最简单的AOP的DEMO
类似Struts2的拦截器
如果两个类实现同一个接口,但是用的时候用一个类代替另一个类,这就是代理模式
上述就用了代理模式
当我们调用bi.say(),其实并不是直接用HelloWorldImpl的say(),
而是
HelloWorld bi = (HelloWorld) ProxyFactory.getProxy(mb);
这样ProxyFactory先用ProxyHandler将对象赋值,这里需要调用reflect包,重写里面的invoke方向,这里的invoke在调用的时候先执行
System.out.println("Before Helloworld");
然后用反射
Object result = method.invoke(target, args);
和我们一般写程序不同,
不是
对象.方法()
而是
方法.(对象)
然后用代理类生产一个实例
方法为:
Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), bn);
当然,第一个参数为类加载器,第二个参数为方法加载器,要加载前面那个类的所有接口。因���用代理模式的���候,真正去操作的时候是用原始类的代理类,要代理原始类的方法,所以要知道接口,当然用代理类会造成类膨胀,Spring底层用的cglib动态代理。
在代理类中先处理完一些程序的初始化,然后交给原始类的方法去处理,最后用代理类的方法去资源回收,这样就实现了AOP的面向切面编程
例如上面的demo中
1)System.out.println("Before Helloworld");
2)Object result = method.invoke(target, args);
3)System.out.println("Finish Helloworld");
可以类比为
1)船员:船员.拿抓斗è船员.丢抓斗()
2)抓斗: 抓斗.抓物品()
3)船员.拉抓斗()è船员.回收抓斗()
程序员要写的就是
抓斗: 抓斗.抓物品()
以上就是AOP的简单实现和底层原理
分享到:
相关推荐
NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/319927
本文将深入探讨这两个主题,并结合JDK的反射和CGLIB库来阐述其实现原理。 首先,我们来看动态代理。动态代理是Java提供的一种在运行时创建代理对象的技术,它允许我们在不修改原有代码的情况下,为已有接口添加额外...
Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...
### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)...对于希望深入了解Spring AOP原理与实践的读者来说,掌握以上概念将是开启面向方面编程之旅的第一步。
面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。AOP通过预定义的“切面”对横切关注点进行模块化,从而可以在不修改业务逻辑代码的情况下增加新功能。动态...
Java AOP(面向切面编程)是软件设计中的一个重要概念,它允许程序员定义“切面”,这些切面封装了特定的、与业务逻辑不直接相关的关注点,如日志、事务管理、性能监控等。AOP的核心思想是将横切关注点从核心业务...
为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...
代理模式与动态代理--Spring AOP原理.doc
Spring 框架之 AOP 原理剖析.html 抓下来打包成了HTML文件, 方便离线观看
本"AOP原理使用demo"是针对AOP编程的一个实例展示,通过这个示例,我们可以深入理解AOP的核心概念和在实际应用中的使用方式。以下是对AOP关键概念的详细解释: 1. **切面(Aspect)**:切面是AOP的核心,它封装了横...
在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如日志、事务管理等。这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入...
**AOP(面向切面编程)**是一种编程范式,主要应用于处理系统中的横切关注点,例如日志记录、事务管理、权限控制等。它将这些分散在代码各处的功能抽取出来,集中管理和实现,使得核心业务逻辑更加清晰。 在Java中...
【Spring AOP 原理解析】 Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许开发者定义“切面”来封装系统中的交叉关注点,如日志、事务管理、安全性等,从而提高代码的可复用性和可维护性。在Spring ...
Spring注解驱动开发第33讲——AOP原理总结
**Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...
Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...
浅谈 Spring 原理 透析,IOC 和 AOP Spring 框架是一个从实际项目开发经验中抽取的,可高度重用的应用框架。它是一个轻量级容器,带有包装器,使许多不同的服务和框架更易于使用。轻量级容器接受任何 JavaBean,而...
现在让我们深入探讨JDK动态代理和Spring AOP的原理。 首先,JDK动态代理基于Java的反射机制,通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,...
本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...