`
coach
  • 浏览: 386604 次
  • 性别: Icon_minigender_2
  • 来自: 印度
社区版块
存档分类
最新评论

AOP原理简介

阅读更多
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的简单实现和底层原理
分享到:
评论
1 楼 东东乐乐 2011-03-25  
[face16][face17][face18][face19][face20][face21][face22][face23][face24][face25][face26][face27][face28][face29][face30]
[face31][face32][face33][face34][face35][face36][face37][face38][face39][face40][face41][face42][face43][face44][face45]
[face46][face47][face48][face49][face50][face51][face52][face53][face54][face55][face56][face57][face58][face59][face60]
[face61][face62][face63][face64][face65][face66][face67][face68][face69][face70][face71][face72][face73][face74][face75]
[face76][face77][face78][face79][face80][face81][face82][face83][face84][face85][face86][face87][face88][face89][face90]
[face91][face92][face93][face94][face95][face96][face97][face98][face99][face100][face101][face102][face103][face104][face105]

相关推荐

    spring aop实现原理

    NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/319927

    代理机制及AOP原理实现

    本文将深入探讨这两个主题,并结合JDK的反射和CGLIB库来阐述其实现原理。 首先,我们来看动态代理。动态代理是Java提供的一种在运行时创建代理对象的技术,它允许我们在不修改原有代码的情况下,为已有接口添加额外...

    spring ioc和aop原理流程图(详细)

    Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...

    Spring AOP面向方面编程原理:AOP概念

    ### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)...对于希望深入了解Spring AOP原理与实践的读者来说,掌握以上概念将是开启面向方面编程之旅的第一步。

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。AOP通过预定义的“切面”对横切关注点进行模块化,从而可以在不修改业务逻辑代码的情况下增加新功能。动态...

    aop.zip_884AOP_java aop原理_javaaop原理

    Java AOP(面向切面编程)是软件设计中的一个重要概念,它允许程序员定义“切面”,这些切面封装了特定的、与业务逻辑不直接相关的关注点,如日志、事务管理、性能监控等。AOP的核心思想是将横切关注点从核心业务...

    使用动态代理演示Spring的AOP编程原理

    为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...

    代理模式与动态代理--Spring AOP原理.doc

    代理模式与动态代理--Spring AOP原理.doc

    Spring 框架之 AOP 原理剖析 - GitChat

    Spring 框架之 AOP 原理剖析.html 抓下来打包成了HTML文件, 方便离线观看

    aop原理使用demo

    本"AOP原理使用demo"是针对AOP编程的一个实例展示,通过这个示例,我们可以深入理解AOP的核心概念和在实际应用中的使用方式。以下是对AOP关键概念的详细解释: 1. **切面(Aspect)**:切面是AOP的核心,它封装了横...

    Java动态代理(Spring Aop原理)

    在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如日志、事务管理等。这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入...

    aop的工作原理

    **AOP(面向切面编程)**是一种编程范式,主要应用于处理系统中的横切关注点,例如日志记录、事务管理、权限控制等。它将这些分散在代码各处的功能抽取出来,集中管理和实现,使得核心业务逻辑更加清晰。 在Java中...

    spring aop 原理解析

    【Spring AOP 原理解析】 Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许开发者定义“切面”来封装系统中的交叉关注点,如日志、事务管理、安全性等,从而提高代码的可复用性和可维护性。在Spring ...

    Spring注解驱动开发第33讲——AOP原理总结

    Spring注解驱动开发第33讲——AOP原理总结

    Spring AOP实现机制

    **Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...

    Spring Aop的底层实现技术 --- Jdk动态代理原理

    Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...

    浅谈 Spring 原理 透析,ioc aop

    浅谈 Spring 原理 透析,IOC 和 AOP Spring 框架是一个从实际项目开发经验中抽取的,可高度重用的应用框架。它是一个轻量级容器,带有包装器,使许多不同的服务和框架更易于使用。轻量级容器接受任何 JavaBean,而...

    JDK动态代理 spring aop 的原理

    现在让我们深入探讨JDK动态代理和Spring AOP的原理。 首先,JDK动态代理基于Java的反射机制,通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,...

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...

Global site tag (gtag.js) - Google Analytics