`
dr.han
  • 浏览: 46302 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 实现 AOP

阅读更多
用java编写spring通知

spring中所有的通知都是java类的形式编写,定义在什么地方应用通用的切入点通常编写在spring的配置文件中,而其他框架比如AspectJ,需要特定的语法编写切面和定义切入点,虽然这样可以得到更强大和细致的控制,以及更加丰富的AOP工具,然而,需要学习新工具和语法。

Spring的运行时通知对象
代理Bean只有在第一次被应用系统需要的时候才被创建,如果使用的是ApplicationContext,代理对象在BeanFactory载入所有Bean的时候创建
Spring有2种代理创建方式
  一:如果目标对象实现了一个或多个接口暴露的方法,Spring将使用JDK的java.lang.reflect.Proxy类创建代理,这个类让Spring动态产生一个新的类,它实现了所有的接口,织入了通知,并且代理对目标对象的所有请求。
  二:如果目标对象没有实现任何接口,Spring使用CGLIB库生成目标对象的子类,在创建子类的时候,Spring将通过织入,并且将对目标对象的调用委托给这个子类,使用这种方式应注意两个要点:(1)对接口创建代理优于对类创建代理,因为这样会产生更加松耦合的系统,对类生成代理是让遗留系统或者无法实现接口的第三方类库同样的可以得到通知,这种方式是备用方案(2)标记为final的方法不能被通知,Spring是为目标类产生子类,任何需要被通知的方法都会被复写,将通知织入,final方法是不可能做到的。

Spring 实现了AOP联盟接口
AOP联盟的目标是标准化AOPjava接口,使各种JavaAop的实现可以互通。

Spring只支持方法连接点
AspectJ和Jboss提供了属性接入点,Spring的观点是属性拦截破坏了封装,面向对象的基本概念是对象自己处理工作,其他对象只能通过方法调用得到处理结果。

创建Spring通知
基本通知有以下几种:
一:Around----org.aopllliance.intercept.MethodInterceptor
              拦截对目标对象方法调用
二:Before----org.springframework.aop.BeforeAdvice
              在目标方法被调用前调用
三:After------org.springframework.aop.AfterRetruningAdvice
              在方法被调用之后调用
四:Throws----org.springframework.aop.ThrowsAdvice
              在目标方法抛出异常时调用
通知事例:

(1)接口类 SimpleInterface
    
public interface SimpleInterface{
          Home getPerHome(Person person) throws NoPersonException;
     }

(2)实现类
     
public class SimpleClass implements SimpleInterface{
        private boolean noHome;
        public Home getPerHome(Person person)throws NoPersonException{
           if(person.getName().eq("")){
               thorws new EmptyPersonException();
           }
           return person.getHome();
        }
      }


(3)前置通知
      我们的目标是在getPerHome方法调用之前,先打印出用户Person的姓名
    
public class BeforeAdvice implements MethodBeforeAdvice{
        public void before(Method method,Object[] args,Object target){
           Person person = (Person)args[0];//因为getPerHOme方法中只有一个参数,我们将第一个参数转换为Person对象
           System.out.println(person.getName());
//在方法结束后不返回任何结果,因为它返回后目标方法将被调用。
        }
     }
     MethodBeforeAdvice唯一能阻止目标方法被调用的途径是抛出异常,或者调用System.exit();抛出异常的结果依赖异常的类型,如果是runtimeException或者目标方法声明的异常,异常将传播到调用方法,否则Spring框架将捕获异常,并重新包装在RuntimeException中再次抛出
(4)配置目标对象
<beans>
       //创建代理的目标对象
       <bean id="simpleClassTarget" class="SimpleClass"/>
       //创建通知
       <bean id="myadvice" class="BeforeAdvice"/>
       //创建代理
       <bean id="sipleClassProxy"   class="org.springframework.aop.
                                      framework.ProxyFactoryBean">
        //要实现的接口
         <property name="proxyInterfaces">
             <value>SimpleInterface</value>
         </property>
        //被织入的通知
         <property name="interceptorNames">
            <list>
             <value>myadvice</value>
            </list>
         </property>
         //被代理的目标对象
           <property name="target">
             <ref bean=""/>
         </property>
       </bean>
</beans>
ProxyFactoryBean类是一个在BeanFactory中显示地创建代理对象的中心类,给它一个要实现的接口,一个要代理的目标对象,一个要织入的通知,它将创建一个崭新的代理对象,通常配置ProxyFactoryBean,让它实现和目标对象一样的接口。

(5)后置通知
    我们的目标是在getPerHome方法调用之前,先打印出成功提示。
   
public class AfterAdvice implements AfterReturnningAdvice {
      public void afterReturnning(Object returnValue,Method  method,
                     Object [] arg,Object target)throws Throwable{
            System.out.println("scusess");
      }
   }

(6)环绕通知
    目标,我们想控制目标方法是否被调用以及控制返回的对象。
    具体要求,SimpleClass 得getPerHome方法只能返回CurPerson的name不为null的Home.
  
public class myInterceptor implements MethodInterceptor{
     public Object invoke(MethodInvocation invoca)throws Throwable{
        //得到当前的Person
        Person person = (Person)invoca.getArguments[0];
        //判断是否满足目标要求
        if(person.name == "CuiPerson"){
             throws new UserCustomException();
         }
        //调用目标方法
          Object home = invoca.proceed();
         reuturn home ;
      }
   }

    此接口是AOP联盟接口 ,它在目标方法的前后都有逻辑操作,但你必须显示的调用invoca.proceed();方法
  (7)异常通知
      目标,我们想在执行目标方法抛出异常时打印出异常的出现时间
      ThrowsAdvice是一个标示接口,没有任何必须实现的接口,但这个接口必须有一个如下形式的方法:
     
void afterThrowing(Throwable throwable);
     //被调用的方法,参数,目标对象
     void afterThrowing(Method method,Object[] args,Object target,
                       Throwable throwable)
    
     例如:afterThrowing(MyException e),将捕获所有的MyException异常。因此你可以在类中实现多个afterThrowing方法,处理不同的异常。

     具体实现代码:
     
public class MyExceptionAdevice implements ThrowsAdvice{
        public void afterThrowing([b]EmptyPersonException[/b] e){
            System.out.println(new Date().toString);
        }
     }
    
     注:ThrowAdvice被执行后,原来的异常继续抛出,并且象其他异常一样被传播出去,ThrowAdvice能做的改变是抛出另外一个异常

  (8)引入通知
      引入通知是给目标对象添加新的方法以及属性。
  


       
分享到:
评论
1 楼 blliy117 2008-11-18  

    [list=1]
  1. [list=1]
  2. [*][*]
[/list]
[/list]

相关推荐

    Spring实现AOP的4种方式

    本篇文章将详细探讨Spring实现AOP的四种主要方法:基于代理的方式、基于AspectJ的注解方式、基于XML的AOP配置以及基于Java的AOP配置。 1. 基于代理的实现 Spring的AOP支持两种代理类型:JDK动态代理和CGLIB代理。...

    Spring实现AOP的4种方式 - Java -

    下面我们将详细探讨Spring实现AOP的四种主要方式。 1. **基于注解的AOP** Spring框架自2.5版本开始支持基于注解的AOP,这种方式无需XML配置,更加简洁直观。开发者可以在方法上使用`@Aspect`、`@Before`、`@After`...

    Spring实现AOP的四种方式

    本文将详细介绍Spring实现AOP的四种方式,包括基于代理的经典方式、@AspectJ注解驱动、纯POJO切面以及注入式AspectJ切面。 首先,理解AOP的基本概念: 1. **通知(Advice)**:通知定义了切面在何时执行,Spring支持...

    Spring实现AOP的多种方式 切点函数

    里面包括4个例子:(1)Spring实现AOP方式之一:基于XML配置的Spring AOP (2)Spring实现AOP方式之二:使用注解配置 Spring AOP (3)Spring AOP : AspectJ Pointcut 切点 (4)Spring AOP : Advice 声明 (通知注解)

    Spring实现AOP以及AOP的定义

    **Spring 实现AOP及其定义** AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,它旨在提高代码的可复用性和模块化,通过将关注点分离为独立的“切面”来组织代码。在Spring框架中,AOP被用来处理...

    redis集成spring实现aop.zip

    当我们谈论"redis集成spring实现aop"时,我们指的是如何将Redis缓存系统与Spring框架结合,并利用Spring的面向切面编程(AOP)功能来优化应用程序的性能。 首先,让我们深入了解Redis。Redis是一种内存数据结构存储...

    spring 实现AOP所需的三个jar包

    spring 实现AOP不仅仅需要自己的jar包,还需要第三方的jar,分别是aspectjrt.jar,aspectjweaver.jar,aopalliance-1.0.jar,将这三个jar包放入项目中就可以spring的aop编程了。

    Spring实现AOP的四种方式.pdf

    Spring 实现 AOP 的四种方式 Spring 框架提供了四种方式来实现Aspect-Oriented Programming(AOP),分别是经典的基于代理的 AOP、@AspectJ 注解驱动的切面、纯 POJO 切面和注入式 AspectJ 切面。下面将详细介绍这...

    个人对spring实现AOP的方法总结

    "个人对spring实现AOP的方法总结" AOP(Aspect Oriented Programming),即面向方面编程, 是一种新的编程范式。它的主要思想是将散落在应用程序中的各种关注点(Cross-Cutting Concerns)抽象化出来,并将它们封装...

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    适用spring 实现AOP思想

    在本文中,我们将深入探讨Spring AOP的核心概念、工作原理以及如何在实际项目中实现AOP思想。 1. **AOP概述** 面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,旨在减少代码的重复性,提高模块...

    研究下Spring中AOP的实现?

    本篇文章将深入探讨Spring AOP的实现原理,并通过一个名为`myAOPExample`的示例来阐述其工作方式。 首先,理解AOP的基本概念至关重要。AOP的核心是切面(Aspect)、通知(Advice)、连接点(Join Point)、切点...

    Flex整合Spring实现aop日志管理

    本文将深入探讨如何使用Flex与Spring框架整合,实现AOP(面向切面编程)来达到日志管理的目标。AOP允许我们在不修改原有业务逻辑的情况下,插入日志记录代码,使得日志功能的实现更加灵活和高效。 首先,让我们理解...

    spring-aop-jar

    Spring AOP模块提供了实现AOP规范的功能,它允许开发者定义“切面”来封装系统中的横切关注点,如日志、事务管理等。该jar文件包含了Spring AOP的核心类和接口,如`org.springframework.aop.*`包下的`...

    redis集成spring实现aop

    下载分设置的比较高,不过绝对的...为了在接下来的项目中能够方便的控制和使用 redis,所以也粗略的模仿了下membercache的aop代码,写了一份spring-redis-aop。当然方法有很多种,也许你有更好的 使用方法当然更好哈。

    spring-boot aop

    本示例是关于如何在Spring Boot项目中实现AOP功能的一个简单演示。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或关注点,如日志记录。切点(Pointcut)定义了在何处...

    Spring示例_Printer_Spring_AOP_Spring_Proxy

    Spring Proxy是Spring实现AOP的一种方式,它是创建代理对象的机制。当我们的类需要被Spring管理并应用AOP时,Spring会生成一个代理类,这个代理类会在目标对象的方法调用前后执行额外的操作。代理可以是JDK动态代理...

    使用Spring的注解方式实现AOP的细节

    本篇文章将深入探讨如何通过Spring的注解方式实现AOP的细节。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或责任。切点(Pointcut)定义了哪些方法会被通知(Advice...

    Spring使用AOP的三个jar包

    其次,`aspectjweaver.jar`是AspectJ织入代理的核心库,它主要负责在应用运行时动态地修改字节码来实现AOP的功能。即使你没有直接使用AspectJ语法编写切面,Spring的AOP代理也可以利用这个库进行代理对象的创建,以...

Global site tag (gtag.js) - Google Analytics