`

怎么理解AOP

    博客分类:
  • SSH
 
阅读更多

    面试的时候,你跟我说说spring AOP吧?

       我就会不假思索的说,spring的AOP是基于动态代理,会生成一个代理对象,而这个代理对象

   就会调用目标对象的方法,并在它的前后增加业务逻辑!!然后,就没了.......

   如此 , 核心的概念就被我三言两语给盖过去了..........

 

所以,今天痛下决心,好好的钻研下AOP,力求能够全面,清晰的解释清楚!!

 

1. 关键字:

    要解释清楚AOP,面向切面的编程!

    那么 , 切面,代理对象,目标对象,编织,拦截 这五个概念一定要清楚!

    说起AOP,首先想到的就是日志管理,我们想在某个方法调用的时候,将某些信息写入日志!

    要达到我们的目的,可以通过直接在每个方法中都添加相同逻辑!

    可是,这样明显不是合适的,共性太多,一些相同的逻辑在重复的书写,说明还可以抽象!

    其二,如果你接下来,像修改写入日志的内容,那么不得不又重新的去修改每个方法!

    耦合度太高!

    既然刚说了有共性,那么就为什么不把这些代码抽象出来,成为一个单独的类!这个类就可以看成

    一个切面!其实,对于切面,可以这样想,当一个方法执行时,它总是一步一步的

   比如下面的testCompute() , 它实际作用的是compute() , 它应当也可以看成一个切面

   log() 日志处理 , 也是这个方法的一部分 , ----- 切面 ,同样对于startTrancation() ;

  void testCompute () {
      log();
      startTrancation();
      compute();
      endTrancation();
      log();
  }

 

    而原来那个要添加日志处理的类就是目标对象!

    我们把切面与目标对象编织在一起 , 就会得到代理对象,它就是目标对象被切面增强后的对象!

    当一个请求传过来的时候,代理对象就会拦截(控制对象访问) , 由它来处理相应的请求,它就会根据

    配置信息,在原方法的前后添加逻辑,再调用目标对象的方法!

 

2. 怎么知道给那个类,那个方法,何时添加额外的逻辑?

    通过定义:

    Pointcut : 那些方法需要注入切面的行为!它是一个方法的集合

    JoinPoint :连接点 一个pointcut 对应多个 joinPoint

    Advice  : 建议 , 你要添加的逻辑 ,可以指定位置!

    Advisor  :那个方法上定义那个advice

 

3. 怎么编织的,也就是说怎么得到代理对象的?

    JDK动态代理机制 JDK动态代理实现原理  这篇文章分析的很清楚

       从 Proxy 的静态方法 newProxyInstance() 入手,三个参数 : class[] interfaces , InvocationHandler handler ClassLoader loader

         三者的作用:

            interfaces  则是你要代理的接口 , 可以代理多个接口,但是必须是接口,不能为具体实现的类!

            handler : 通过它里面的invoke 方法,你就可以为不同的方法,添加advice! 通过反射调用目标类中的方法

            loader : 类加载环境

      通过他生成的代理对象,是一个新的类,同样有相应的class文件!他的方法跟它代理的接口中的方法一样,因为它必须实现这些接口!

      只是实现的时候,是调用handler中的invoke() 方法,这也是为什么下面invoke()是回调方法,当要调用目标类的

      某个方法的时候,就会调用invoke方法!

      其实这样看的话,代理类和目标类,都是实现了相同的接口,代理类在目标类的基础上对相应方法的实现增加了额外的操作!

      但是,要知道一点,代理类的生成不是我们事先写好了的代码,而是在运行的时候动态的生成!它是一个新的类!与目标类不存在什么继承,

      实现的关系!

 

    cglib:

        通过字节码操作!不局限于只能代理接口!

  • CGLIB可以生成目标类的子类,并重写父类非final修饰符的方法(功能增强)。

 

4. 怎么拦截的?

   当调用某个pointCut 指定的方法时,实质上调用的是代理类的这个方法,而代理类的实现就是通过调用,handler的invoke方法。

   就像通过Jdk提供的代理模式一样,你必须实现InvocationHandler 接口 , 因为它里面

   的回调方法关系到切面是否执行!

   在Spring 的AOP中,我们不必自己实现InvocatiionHandler , 我们要做的就是定义切面

   并在配置文件中告诉spring , 我要在这些方法(pointcut)的这些地方(before , after) 添加advice!

   然后,spring就会把这些advice 添加到一个拦截器链中,就像过滤器一样!

   回调方法invoke()调用的时候,就会使用这个拦截器链,然后,就会遍历这个拦截器链,看我这个

  方法中是否第一你这个拦截器(advisor) , 然后就是一个递归调用的过程!

  JdkDynamicProxy invoke():

    // 把请求的方法 , 加入拦截器链中

List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);

 

 

5. 代理对象什么时候生成的?生命周期?

  

 <context:annotation-config/>
 <context:component-scan base-package="com.bjsxt"/>
 
 <bean id = "litcpt" class="com.bjsxt.aop.LogInterceptor" />
 <aop:config>
     <aop:aspect id="logAsp" ref="litcpt">
     	<aop:pointcut expression="execution(* com.bjsxt.dao..*.*(..))" id="pointCut"/>
     	<aop:before method="Before" pointcut-ref="pointCut"/>
     </aop:aspect>
 </aop:config>

   上面这种配置,初始化的时候,会生成DAO的代理吗?

    会,初始化的时候就会生成!

   

启动spring容器时发生了什么:

  • 实例化bean
  • 解析aop:config的配置,当解析到切入点表达式时,将切入点表达式中的类和Spring容器中的类进行匹配,匹配成功生成代理对象(通知+目标方法)
  • 在生成代理对象时,Spring会检查目标类有没有实现接口,如果有,采用JDK Proxy生成代理对象;没有则采用CGlib产生代理对象。
  •  测试类中调用ctx.getBean时发生了什么:如果要取的bean有代理对象返回代理对象,没有则返回对象本身。

 

 

分享到:
评论

相关推荐

    Android深入理解Aop

    阿拉神农博客《Android深入理解Aop》的PDF版,也可以在https://blog.csdn.net/innost/article/details/49387395 该网站中直接观看,也可以下载下来保存

    Spring的Hello World:理解AOP

    标题中的“Spring的Hello World:理解AOP”指的是在Spring框架中使用面向切面编程(Aspect-Oriented Programming,简称AOP)进行程序开发的基本概念和实践。面向切面编程是一种编程范式,旨在提高代码的可重用性和...

    aopalliance

    对于AOPAlliance,javadoc详细阐述了各个接口和类的功能、用法和注意事项,是理解AOPAlliance工作原理和实际应用的关键。 五、实践应用 使用AOPAlliance,开发者可以在Spring 2.0中定义自己的拦截器或通知,实现...

    aopalliance-1.0.jar &amp; aopalliance-1.0-src.jar

    首先,理解AOP Alliance的含义至关重要。AOP Alliance是一个开源项目,旨在创建一个通用的API,使得不同的AOP框架可以无缝协作。它定义了一些核心的AOP概念,如拦截器(Interceptor)、通知(Advice)和切入点...

    简单spring aop 例子

    首先,我们要理解AOP的核心概念。AOP是一种编程范式,它允许开发者定义“切面”(Aspects),这些切面封装了特定的关注点,如日志、性能监控等。在运行时,这些关注点被编织到应用程序的主业务逻辑中,使得代码更...

    Spring AOP基础关于AOP是什么的理解

    Spring AOP 基础关于 AOP 是什么的理解 AOP(Aspect Oriented Programming 面向方面的编程)是一种实现横切面的工具,它是 OOP 的补充,而不是 OOP 的竞争对手。AOP 的出现是为了解决 OOP 中的缺陷,即 OOP 中的类...

    C#版本AOP注入

    首先,我们要理解AOP的核心概念:切面、连接点、通知和织入。切面是跨越多个对象的关注点的模块化,如日志或安全性。连接点是程序执行过程中可以插入切面的特定点,例如方法调用或属性访问。通知是在特定连接点上...

    使用Spring配置文件实现AOP

    一、理解AOP概念 AOP的核心思想是将分散在各个模块中的交叉性代码(如日志、事务处理)抽取出来,形成独立的切面,以便于复用和维护。它提供了一种模块化的方式,使得我们可以专注于编写核心业务代码,而无需关心...

    仿springAOP框架

    通过调试和分析测试结果,你可以更深入地理解AOP的工作原理和实际应用。 总之,仿Spring AOP框架提供了一个学习和实践AOP的平台,它涵盖了自定义注解、切面、通知等核心概念。通过动手实践,开发者可以更好地掌握...

    AOP 和WCF 例子

    通过查看和运行这个项目,开发者可以深入理解AOP如何与WCF服务协作,从而在实际项目中灵活应用这两种技术。 为了更深入地学习AOP和WCF,你可以参考链接中的博客文章(由于链接已过期,可能需要通过互联网搜索最新的...

    Spring-AOP demo

    首先,让我们理解AOP的基本概念。AOP是一种编程范式,它允许程序员定义“切面”,这些切面封装了特定的职责,例如日志记录或事务管理。在运行时,切面会与主业务逻辑“织入”在一起,以透明地执行其任务。 在Spring...

    SpringAOP.zip

    通过雷丰阳老师的Spring AOP课程,你将能够深入理解AOP的核心概念,并能熟练地在Spring项目中运用AOP技术,提升代码的整洁性和可维护性。文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从...

    spring-aop实例demo

    首先,我们需要理解AOP的基本概念。AOP的核心是切面(Aspect),它包含了通知(Advice)和切点(Pointcut)。通知是在特定的连接点(Join Point)执行的代码,而切点则是定义这些连接点的规则,通常是一个方法调用。...

    spring的aop简单例子

    这个简单例子将帮助我们理解AOP的基本概念和如何在Spring框架中实现它。 首先,我们要知道AOP的核心概念:切面、通知、连接点、切点、目标对象和代理。切面是包含横切关注点(如日志记录、事务管理等)的模块化组件...

    C# AOP学习DEMO

    AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,旨在提高代码的可重用性、可维护性和模块化...此外,理解AOP还能帮助你在设计和重构过程中更好地分离关注点,使代码更符合SOLID原则,提高软件质量。

    aopalliance源码

    通过阅读和理解aopalliance的源码,我们可以更好地掌握AOP的核心思想,理解如何使用拦截器来增强代码,以及如何在不同AOP框架之间实现互操作。此外,这也为我们深入学习和应用Spring AOP、AspectJ等具体框架打下了...

    c# aop+mvc+facAop

    C# AOP(面向切面编程)是...这样可以帮助你理解AOP是如何被用来增强MVC应用程序的,以及它是如何通过C#实现的。对于初学者来说,这是一个很好的实践案例,能够帮助他们理解这些高级概念,并将它们应用到自己的项目中。

    Spring AOP应用Demo

    首先,我们要理解AOP的核心概念。AOP是一种编程范式,它将关注点分离为“切面”(Aspects),每个切面封装了特定的横切关注点,如日志、事务管理、安全控制等。这些关注点可以在程序运行时自动插入到多个对象的方法...

    .net平台AOP的实现

    首先,我们需要理解AOP的基本概念。AOP的核心是切面(Aspect),它封装了横切关注点,即那些影响多个类或操作的代码。切点(Join Point)是指程序执行过程中的特定点,如方法调用、属性访问等。通知(Advice)是在...

    Springboot整合Aop.zip

    SpringBoot 整合 AOP 的实践与理解 在软件开发中,随着系统复杂性的增加,重复的代码和逻辑处理往往成为维护的痛点。为了解决这一问题,面向切面编程(Aspect-Oriented Programming,简称 AOP)应运而生。AOP 的...

Global site tag (gtag.js) - Google Analytics