Java面试--Spring技术要点--Spring AOP(面向切面编程)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuxian90/article/details/45703749

33  Spring AOP的概念

面向切面的编程,是一种编程技术,是OOP(面向对象编程)的补充和完善。OOP的执行是一种从上往下的流程,并没有从左到右的关系。因此在OOP编程中,会有大量的重复代码。而AOP则是将这些与业务无关的重复代码抽取出来,然后再嵌入到业务代码当中。常见的应用有:权限管理、日志、事务管理等。

实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。Spring AOP实现用的是动态代理的方式。

http://blog.csdn.net/moreevan/article/details/11977115

34  AOP的相关概念

  • 切面/方面(Aspect:AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在SpringAOP中,切面通过带有@Aspect注解的类实现。
  • 连接点(Joinpoint:程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
  • 通知/增强(Advice:在切入点上,可以应用的增强包括:around、before和throws。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。Spring中定义了四个advice:BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice。
  • 切入点(Pointcut:将被增强(Advice)应用的连接点的集合(通常是Method集合)。Spring定义了Pointcut接口,用来组合MethodMatcher和ClassFilter,可以通过名字很清楚的理解,MethodMatcher是用来检查目标类的方法是否可以被应用此通知,而ClassFilter是用来检查Pointcut是否应该应用到目标类上。
  • 目标对象(TargetObject:被通知(Advice)或被代理对象。
  • AOP代理(AOP Proxy:AOP框架创建的对象,包含通知(Advice)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。

35  Spring AOP的增强/通知(Advice)类型

  1. Before Advice在方法执行前执行。
  2. AfterAdvice在方法执行之后调用的通知,无论方法执行是否成功。
  3. After ReturningAdvice在方法执行后返回一个结果后执行。
  4. After ThrowingAdvice在方法执行过程中抛出异常的时候执行。
  5. Around Advice在方法执行前后和抛出异常时执行,相当于综合了以上三种通知。(相关接口MethodIntercept
  6. IntroductionAdvice引入增强):引入通知是一种特殊的通知,它能将新的成员变量、成员方法引入到目标类中。它不能作用于任何切入点,因为它只作用于类层次,而不是方法层次。实现引入通知需要实现IntroductionAdvisor和IntroductionInterceptor接口。

http://chenjumin.iteye.com/blog/364948

36  Spring AOP 的关注点和横切关注的区别

  • 关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
  • 横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

http://blog.csdn.net/shendl/article/details/526362

37  引入(Introduction)的概念

引入(Introduction:添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。Spring中要使用Introduction,可有通过DelegatingIntroductionInterceptor来实现通知,通过DefaultIntroductionAdvisor来配置Advice和代理类要实现的接口。

38  Spring有几种自动代理器

代理器有三类

  • 基于Bean的名字的自动代理创建器,例如BeanNameAutoProxyCreator
  • 基于Advisor(切面)匹配机制的自动代理创建器。对spring容器中的所有的Advisor扫描,并将其应用到匹配的Bean中。例如DefaultAdvisorAutoProxyCreator
  • 基于Bean中的AspjectJ注解标签的自动代理创建器,例如AnnotationAwareAspectJAutoProxyCreator

所有的自动代理创建器,都是实现了BeanPostProcessor。spring容器在实例化Bean时,BeanPostProcessor会对其加工,对满足匹配规则的Bean自动创建代理对象。

http://blog.csdn.net/itomge/article/details/8861268

http://uule.iteye.com/blog/894055

39  Spring织入概念

织入(Weaving):把切面(Aspect)应用到目标对象来创建新的代理对象的过程,织入一般发生在如下几个时机:

  1. 编译时:当一个类文件被编译时进行织入,这需要特殊的编译器才可以做的到,例如AspectJ的织入编译器。
  2. 类加载时:使用特殊的ClassLoader在目标类被加载到程序之前增强类的字节代码。
  3. 运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,原理应该是使用了动态代理技术。

40  Spring AOP的实现方式

1、经典的基于代理的AOP:使用Java代码实现,编写Advice、PointCut,然后提供给Advisor使用。开启自动代理后,即可在applicationContext中获得增强后的bean。

http://blog.sina.com.cn/s/blog_5198c7370100hw1p.html

2、@AspectJ注解驱动的切面:基于注解的开发(推荐使用),在项目中需要开启AOP自动代理<aop:aspectj-autoproxy/>

3、XML Schema方式:需要实现相应的增强接口,如BeforeAdvice、AfterAdvice等。然后利用一下配置如:

<aop:config>  
    <aop:aspect id="aspect" ref="xmlHandler">  
        <aop:pointcut id="pointUserMgr" expression="execution(* com.tgb.aop.*.find*(..))"/>  
          
        <aop:before method="doBefore"  pointcut-ref="pointUserMgr"/>  
        <aop:after method="doAfter"  pointcut-ref="pointUserMgr"/>  
        <aop:around method="doAround"  pointcut-ref="pointUserMgr"/>  
        <aop:after-returning method="doReturn"  pointcut-ref="pointUserMgr"/>  
        <aop:after-throwing method="doThrowing" throwing="ex" pointcut-ref="pointUserMgr"/>  
          
    </aop:aspect>  
</aop:config> 

http://blog.csdn.net/xiaoxian8023/article/details/17258933

展开阅读全文

没有更多推荐了,返回首页