随笔-54  评论-0  文章-2  trackbacks-0

      今天主要是AOP编程,徐老师先讲了原理,由浅入深,最 后让开发由aspectJ来完成,使开发更简单,收获蛮大

1.Aspect术语

 通知:切面的实际实现,他通知系统新的行为。如在日志通知包含了实

      现日志功能的代码,如向日志文件写日志。通知在连接点插入 到应用系统中。

连接点::应用程序执行过程中插入切面的地点,可以是 方法调用,异常抛出,或者      要修改的字段。

切入点:定义了通知应该应用在哪些连接点, 通知可以应用到AOP框架支持的任何         连接点。

          

引入:不变源代码的情况下,为类添加新方法 和属性。

目标对象::被通知的对象。既可以是你编写的类也可以是 第三方类。

代理对象:崭新的对象,将通知应用到目标对 象后创建的对象,应用系统的其他部              分不用为了支持代理对象而 改变。

织入:将切面应用到目标对象从而创建一个新代理对 象的过程。织入发生在目标

              对象生命周期的多个点上:

               编译期:切面在目标对象编译时织入.这需要一个特殊的编译器.

               类装载期:切面在目标对象被载入JVM时织入.这需要一个特殊的类载入器.

               运行期:切面在应用系统运行时织入.

 4.切入点:定义了通知应该应用在哪些连接点,通知可以应用到AOP框架支持的任何连接点。

两种:jdk动态代理(接口,松耦合),cglib(对类代理)

2.方法介绍

 .通知类型

 1.前置通知

   public interface MethodBeforeAdvice{

       void before(Method m,Object[]

                 os ,Object target){

        }

   }

   该接口提供了获得目标方法、参数和目标对象的机会。不能够改变运行时参数,即不能替换参数对象和目 标对象。

   注意在方法结束后不返回任何值东西。原因是该接口返回后,目标方法将会被调用,应该返回目标对象的 返回值。该接口唯一能

   阻止目标方法被调用的途径是抛出异常或(System.exit())

 2.动态代理对象ProxyFactoryBean是一个在BeanFactory中显式创建代理对象的中心类,可以给它一个

 要实现的接口、一个要代理的目标对象、一个

 要织入的通知,并且他将创建一个崭新的代理

 对象。

 3.后置通知

    同前置通知类似。

        public interface AfterReturningAdvice{

             public void afterReturning(Object returnValue,Method

             m,Object[] os,Object target);

        }

   多了一个返回值。

 4.环绕通知

       public interface MethodInterceptor extends Interceptor{

           Object invoke(MethodInvocation invocation);

       }

       该接口同前两种通知有两个重要区别:1.该通知能够控制目标方法

       是否真的被调用。通过invocation.proceed()方法来调用。

       2.该通知可以控制返回的对象。可以返回一个与proceed()方法返回对象完全不同的对象。但要谨慎使用。

                                                         

 5.异常通知

        public interface ThrowsAdvice{

       }

       该接口为标识性接口,没有任何方法,但实现该接口的类必须要有如下形

       式的方法:

       void afterThrowing(Throwable throwable);

       void afterThrowing(Method m,Object[] os,Object

       target,Throwable throwable);

       第一个方法只接受一个参数:需要抛出的异常。

       第二个方法接受异常、被调用的方法、参数以及目标对象。

 .创建切入点方法

        1. 切入点根据方法和类决定何处 织入通知。ClassFilter接口决定了一个类

        是否符合通知的要求:

        public interface ClassFilter{

             boolean matches(Class clazz);

        }

        实现该接口的类决定了以参数传递 进来的类是否应该被通知。实现该接

        口的类一般根据类名决定,但不一 定必须如此。

       注意: 为减少系统负担,尽量使用静态切入点

       

        2.定义切入点      spring提供了Advisor类。他把通知和切入点组合到一个对象中。更确切地说PointcutAdvisor提供了这些功 能

3.使用aspectJ开发

       1.添加类库:aspectjrt.jaraspectjweaver.jar

       2.添加aop schema.

       3.定义xml元素:<aop:aspectj-autoproxy>

       4.编写java,并用@Aspect注解成通知

            AspectJ 支持 5 种类型的通知注解:

        @Before: 前置通知, 在方法执行之前执行

        @After: 后置通知, 在方法执行之后执行

        @AfterRunning: 返 回通知, 在方法 返回结果之后执行

        @AfterThrowing: 异 常通知, 在方法 抛出异常之后

        @Around: 环绕通知, 围绕着方法执行

       配置成普通bean元素即可.

    注意:

    JoinPoint参数可访问连接点细节,入方法名和参数等.

今天知识点蛮多的,对面试挺有用的,好好掌 握!

    


posted on 2010-02-28 01:11 d66380022 阅读(258) 评论(0)  编辑  收藏