`

Spring AOP 之AfterReturningAdvice & MethodBeforeAdv

阅读更多
Spring框架中成功吸引人的一点就是容器事务的管理,提供了一个轻量级的容器事务处理,针对的对象是普通的java类,使用Spring事务管理的话 ,你可以按照自己的业务把一些相关的方法纳入其事务管理里面,这就避免了程序员在处理事务的过程中繁琐的工作.同时这些也是ejb2.X规范里 面吸引人的一点,这在spring里面都很好的提供.虽然在跨容器的事务管理,spring里面并没有提供,但是对于一般的web程序来说,也不需要仅仅 为了那些功能而不得不使用ejb.不过,最近jboss的嵌入式的ejb容器也可以做的更小了,也是开源中的选择之一.无论技术是怎样发展的,当前,我 们先来研究其中AOP实现的方法.
  
  事实上,Spring中的事务处理是通过AOP思想来实现的,Spring AOP与Aspect J和JBoss具有很 大的不同,首先,使用Spring AOP框架的用户要记住的一点是,Spring AOP针对的是方法层次上的实现,而其他两者对字段也提供了支持.说到 Spring AOP的内幕,其实也不难,对于有接口的类,使用的是Java内部类提供的Proxy;而对于那些不实现接口的类,使用的是cglib库,动态创建一 个子类来实现.
  
  在Spring AOP中提供了4种处理切入类型:around,before,after,introduction.顾名思义,
  
   1)around是针对具体的某个切入点的方法(比如,现在有个OrderBook方法,around的切入类型是就这个方法的内部调用,是通过java的元数据,在 运行时通过Method.invoke来调用,具有返回值,当发生意外的时候会终止.记住的一点是,返回值.);
  
   2)before是在方法调用前 调用(在OrderBook方法前调用,但是没有返回值,同时在通常意外情况下,会继续运行下一步方法.记住的一点是没有返回值);
  
   3)after和before刚好相反,没有什么特别的地方.
  
   4)introduction是一个更加特殊的,但功能更加强大的切入类型.比如(你现 在有Book对象,Computer对象,还有几十个这种业务对象,现在你希望在每个这样的对象中都加入一个记录最后修改的时间.但是你又不希望对每 个类都进行修改,因为太麻烦了,同时更重要的一点,破坏了对象的完整性,说不定你以后又不需要这个时间数据了呢...这时怎么办呢?Spring AOP就为你专门实现这种思想提供了一个切入处理,那就是introduction.introduction可以为你动态加入某些方法,这样可以在运行时,强制转换 这些对象,进行插入时间数据的动作,更深的内幕就是C++虚函数中的vtable思想).不过这种动态是以性能作为代价的,使用之前要慎重考虑,这里 我们谈的是技术,所以就认为他是必需的.

程序包图结构如下图:


 

下面先将代码贴出再说:

Hello.java

 

/** *//**
 * BeforeAdviceSample
 
*/

package com.fhway.spring.aop;

/** *//**
 * 
@author fuhw
 * 2006-10-5   下午12:17:40
 
*/

public interface Hello ...{
    
public void sayHello(String name);
}

HelloImpl.java

 

/** *//**
 * BeforeAdviceSample
 
*/

package com.fhway.spring.aop;

/** *//**
 * 
@author fuhw 2006-10-5 下午01:07:03
 
*/

public class HelloImpl implements Hello ...{
    
public void sayHello(String name) ...{
        System.out.println(
"Hello, the world.Your name is " + name);
    }

}

TestAfterAdvice.java

 

/** *//**
 * BeforeAdviceSample
 
*/

package com.fhway.spring.aop;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

/** *//**
 * 
@author fuhw
 * 2006-10-5   下午01:31:06
 
*/

public class TestAfterAdvice implements AfterReturningAdvice...{

    
public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable ...{
        
// TODO Auto-generated method stub
        System.out.println("Thank you,Come again! ");
    }

}

TestBeforeAdvice.java

 

/** *//**
 * BeforeAdviceSample
 
*/

package com.fhway.spring.aop;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;
/** *//**
 * 
@author fuhw
 * 2006-10-5   下午01:14:06
 
*/

public class TestBeforeAdvice implements MethodBeforeAdvice...{
    
public void before(Method method,Object[] args,Object target) throws Throwable...{
        System.out.println(
"Hi,this is "+this.getClass().getName());
   }


}

Main.java

 

/** *//**
 * BeforeAdviceSample
 
*/

package com.fhway.spring.aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

/** *//**
 * 
@author fuhw 2006-10-5 下午01:16:37
 
*/

public class Main ...{
    
public static void main(String[] args) throws Exception ...{
        ApplicationContext ctx 
= new FileSystemXmlApplicationContext("applicationContext.xml");
        Hello h 
= (Hello) ctx.getBean("hello");
        h.sayHello(
"fhway");
    }


}

applicationContext.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 

"http://www.springframework.org/dtd/spring-beans.dtd"
>

<beans>

    
<bean id="beanTarget" class="com.fhway.spring.aop.HelloImpl"></bean>

<!-- 1.MethodBeforeAdvice -->
    
<bean id="theBeforeAdvice"
        class
="com.fhway.spring.aop.TestBeforeAdvice">
    
</bean>
<!-- 2.AfterReturningAdvice -->
    
<bean id="theAfterAdvice"
        class
="com.fhway.spring.aop.TestAfterAdvice">
    
</bean>


    
<bean id="theAdvisor"
        class
="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
        
<property name="advice">
<!-- 
            <ref local="theBeforeAdvice" />
-->            <ref local="theAfterAdvice" />
        
</property>
        
        
<property name="mappedName">
            
<value>say*</value>
        
</property>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
    
</bean>

    
<bean id="hello"
        class
="org.springframework.aop.framework.ProxyFactoryBean">
        
<property name="proxyInterfaces">
            
<value>com.fhway.spring.aop.Hello</value>
        
</property>
        
<property name="target">
            
<ref local="beanTarget" />
        
</property>
        
<property name="interceptorNames">
            
<list>
                
<value>theAdvisor</value>
            
</list>
        
</property>
    
</bean>

</beans>

         1.从代码可以看出Hello.java是target的实现接口;而HelloImpl.java是其实现;

         2.TestAfterAdvice.java为AfterReturningAdvice的AOP实现方式;TestBeforeAdvice.java为MethodBeforeAdvice的实现方式;Main.java为测试方法;OK?

         3.关于applicationContext.xml应该是我们要谈的重点;"org.springframework.aop.framework.ProxyFactoryBean"有几个属性"proxyInterfaces"(代理接口)"target"(代理目标),"interceptorNames"(目标的通知bean名称),其他属性我将在下一篇文章中介绍;

      4.<!-- 1.MethodBeforeAdvice -->&<!-- 2.AfterReturningAdvice -->是可选的切入类型,在测试的时候我们任选其一就可以了,在通知置入点的配置bean "theAdvisor"的23-25的代码就可以对这个类型进行切换的;

分享到:
评论

相关推荐

    spring aop jar 包

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...

    Spring AOP 16道面试题及答案.docx

    Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...

    简单spring aop 例子

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...

    spring-aop.jar各个版本

    spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...

    Spring AOP完整例子

    Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过插入切面来增强或改变程序的行为。在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型...

    spring aop依赖jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式的企业级服务,如事务管理、性能监控等。在Spring AOP中,我们可以通过定义切面(Aspect...

    老王读spring-aop源码分析&amp;测试代码.zip

    老王读 Spring AOP 系列文章的源码分析&测试代码 帮助大家学习 Spring 源码,更加了解 Spring 的底层 博客专栏地址:https://blog.csdn.net/wang489687009/category_11269905.html

    Spring Aop四个依赖的Jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...

    Spring AOP面向方面编程原理:AOP概念

    Spring框架作为Java开发领域的领头羊之一,提供了强大的AOP支持。本文旨在深入探讨Spring AOP的核心概念及其原理。 #### 二、AOP基本概念 AOP是一种编程范式,其目的是提高模块化程度,特别是将那些对很多类都具有...

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    一、适合人群 1、具备一定Java编程基础,初级开发者 2、对springboot,mybatis,mysql有基本认识 3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 ...4、spring boot,mybatis,druid,spring aop的使用

    Spring AOP实现机制

    Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的可复用性和可维护性。 ### 1. ...

    小马哥讲 Spring AOP 编程思想 - API 线索图.pdf

    在讨论Spring AOP(面向切面编程)时,首先需要理解几个核心概念。Spring AOP 是Spring框架提供的一个功能模块,它允许开发者将横切关注点(cross-cutting concerns)从业务逻辑中解耦出来,通过在方法调用前后进行...

    基于注解实现SpringAop

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

    spring AOP依赖三个jar包

    Spring AOP,即Spring的面向切面编程模块,是Spring框架的重要组成部分,它允许开发者在不修改源代码的情况下,对程序进行横切关注点的处理,如日志、事务管理等。实现这一功能,主要依赖于三个核心的jar包:aop...

    spring-aop-jar

    "spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨Spring AOP、相关jar文件以及它们在实际开发中的作用。 首先,我们来看一下提供的文件: 1. aopalliance.jar:这是一...

    spring AOP 引入jar包,spring IOC 引入Jar包

    Spring AOP 和 Spring IOC 是 Spring 框架的两个核心组件,它们对于任何基于 Java 的企业级应用开发都至关重要。Spring AOP(面向切面编程)允许开发者在不修改源代码的情况下,通过“切面”来插入新的行为或增强已...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。...利用Java反射机制和Spring AOP框架,开发者可以方便地实现AOP,从而提升代码的模块化和可维护性。

    spring aop 五个依赖jar

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理等。在Java应用中,AOP通过代理模式实现了切面编程,使得我们可以将业务逻辑...

    springAop的配置实现

    **Spring AOP 配置实现详解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它允许我们通过分离关注点来简化应用程序的开发。在传统的面向对象编程中,业务逻辑与日志记录...

Global site tag (gtag.js) - Google Analytics