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

时间:2015-05-14 01:03:18   收藏:0   阅读:446

33  Spring AOP的概念

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

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

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

34  AOP的相关概念

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有几种自动代理器

代理器有三类

所有的自动代理创建器,都是实现了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:aspectref="sleepHelper"> 

    <aop:beforemethod="beforeSleep" pointcut="execution(**.sleep(..))"/> 

    <aop:aftermethod="afterSleep" pointcut="execution(**.sleep(..))"/> 

   </aop:aspect> 

</aop:config>  

http://hyhai7.iteye.com/blog/837497


评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!