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

spring aop xml、注解的使用

 
阅读更多

AOP系列文章: 
      Spring AOP:http://ray-yui.iteye.com/blog/2024759 


什么是AOP? 
      AOP是对传统面向对象开发的一种有效的补充,在AOP中概念非常多,请容许笔者省略数千字的概念,只举出一个示例,面向对象中的类就好比是士兵,我们编写每个类就等同于为每个士兵增加装备和训练士兵的体能,从而达到可以上战场打仗的目的,然而有一天AOP这个魔法师出现了,打开了一个魔法门,告诉每个士兵(类),不用再每个士兵单独这样训练了(编码),从我这个魔法门(切面)走过就能增强士兵自身的能力,而这种方式,就是AOP,面向切面编程 


AOP的实现方式: 
      Spring中有AOP的实现,但Spring的AOP更多是借鉴了AspectJ的方式,SpringAOP是基于动态代理的,所以只是方法级别的连接点模型,无法做到例如字段或构造函数的接入点,无法让我们创建更细粒度的通知,若然读者有需要更精确的AOP,请考虑使用AspectJ或JBoss的AOP实现 


SpringAOP使用(基于XML) 

Java代码   收藏代码
  1. package com.accentrix.ray;  
  2.   
  3. import org.aspectj.lang.ProceedingJoinPoint;  
  4. package com.accentrix.ray;  
  5.   
  6. import org.aspectj.lang.ProceedingJoinPoint;  
  7.   
  8. /* 
  9.  * 声明切面(Aspect) 
  10.  */  
  11. public class Advice {  
  12.   
  13.     // 前置执行方法  
  14.     public void beforeMethod() {  
  15.         System.out.println("method before execute");  
  16.     }  
  17.   
  18.     // 后置执行方法  
  19.     public void afterMethod() {  
  20.         System.out.println("method after execute");  
  21.     }  
  22.   
  23.     // 抛出异常时方法  
  24.     public void exceptionMethod() {  
  25.         System.out.println("method throw exception execute");  
  26.     }  
  27.   
  28.     // 环绕通知  
  29.     public void aroundMethod(ProceedingJoinPoint joinPoint) {  
  30.         /* 
  31.          * 环绕通知就类似Filter,在一个方法中包含开始,执行,结束,抛出异常 , 
  32.          * 甚至可以不调用joinPoint的proceed方法执行真实逻辑 亦可以多次调用 
  33.          * ,全由开发者业务逻辑决定 
  34.          */  
  35.         try {  
  36.             System.out.println("before");  
  37.             joinPoint.proceed();  
  38.             System.out.println("after");  
  39.         } catch (Throwable e) {  
  40.             e.printStackTrace();  
  41.             System.out.println("throw exception");  
  42.         }  
  43.     }  
  44.   
  45.     // 接受参数通知  
  46.     public void hasParamterAfterMethod(String name) {  
  47.         System.out.println("before method " + name);  
  48.     }  
  49. }  

 

Xml代码   收藏代码
  1. <!-- 声明Bean -->  
  2. <bean id="advice" class="com.accentrix.ray.Advice" />  
  3.   
  4. <!-- 配置AOP -->  
  5. <aop:config>  
  6.     <!-- 引用注册的Bean ID -->  
  7.     <aop:aspect ref="advice">  
  8.         <!-- 声明切入点,过滤service下的所有类型和所有方法,不限制参数和返回类型 -->  
  9.         <aop:pointcut expression="execution(* com.accentrix.ray.service.*.*(..))"  
  10.             id="servicePoincut" />  
  11.   
  12.         <!-- 引用servicePoincut的切入点,调用advice的beforeMethod方法进行前置处理 -->  
  13.         <aop:before pointcut-ref="servicePoincut" method="beforeMethod" />  
  14.   
  15.         <!-- 引用servicePoincut的切入点,调用advice的afterMethod方法进行后置处理 -->  
  16.         <aop:after pointcut-ref="servicePoincut" method="afterMethod" />  
  17.   
  18.         <!-- 引用servicePoincut的切入点,调用advice的exceptionMethod方法进行异常处理 -->  
  19.         <aop:after-throwing pointcut-ref="servicePoincut"  
  20.             method="exceptionMethod" />  
  21.   
  22.         <!-- 引用servicePoincut的切入点,调用advice的aroundMethod方法进行环绕处理 -->  
  23.         <aop:around pointcut-ref="servicePoincut" method="aroundMethod" />  
  24.   
  25.         <!-- 使用如下pointcut即可为advice传递调用真实业务时传递的参数 -->  
  26.         <aop:after  
  27.             pointcut="execution(* com.accentrix.ray.service.*.*(String)) and args(name)"  
  28.             method="hasParamterAfterMethod" />  
  29.     </aop:aspect>  
  30. </aop:config>  



      SpringAOP基于Annotation方式 

Xml代码   收藏代码
  1. <!-- 需要在applicationContext.xml中增加如下配置 -->  
  2. <aop:aspectj-autoproxy />  

 

Java代码   收藏代码
  1. package com.accentrix.ray;  
  2.   
  3. import org.aspectj.lang.ProceedingJoinPoint;  
  4. import org.aspectj.lang.annotation.After;  
  5. import org.aspectj.lang.annotation.AfterThrowing;  
  6. import org.aspectj.lang.annotation.Around;  
  7. import org.aspectj.lang.annotation.Aspect;  
  8. import org.aspectj.lang.annotation.Before;  
  9. import org.aspectj.lang.annotation.Pointcut;  
  10.   
  11. @Aspect  
  12. public class AnnotationAdvice {  
  13.   
  14.     // 声明切入点  
  15.     @Pointcut("execution(* com.accentrix.ray.service.*.*(..))")  
  16.     public void myPointcut() {  
  17.   
  18.     }  
  19.   
  20.     // 可声明多个切入点  
  21.     @Pointcut("execution(* com.accentrix.ray.service.*.*(String) and args(name)")  
  22.     public void hasParamterPointcut(String name) {  
  23.   
  24.     }  
  25.   
  26.     // 注解形式前置通知  
  27.     @Before("myPointcut()")  
  28.     public void beforeMethod() {  
  29.         System.out.println("before method execute");  
  30.     }  
  31.   
  32.     // 注解形式后置通知  
  33.     @After("myPointcut()")  
  34.     public void afterMethod() {  
  35.         System.out.println("after method execute");  
  36.     }  
  37.   
  38.     // 注解形式异常通知  
  39.     @AfterThrowing("myPointcut()")  
  40.     public void exceptionMethod() {  
  41.         System.out.println("method throw exception execute");  
  42.     }  
  43.   
  44.     // 注解形式环绕通知  
  45.     @Around("myPointcut()")  
  46.     public void aroundMethod(ProceedingJoinPoint joinPoint) {  
  47.         try {  
  48.             System.out.println("before");  
  49.             joinPoint.proceed();  
  50.             System.out.println("after");  
  51.         } catch (Throwable e) {  
  52.             e.printStackTrace();  
  53.             System.out.println("throw exception");  
  54.         }  
  55.     }  
  56.   
  57.     // 注解形式传递参数给通知  
  58.     @Before("hasParamterPointcut(name)")  
  59.     public void hasParamterBeforeMethod(String name) {  
  60.         System.out.println("before method execute " + name);  
  61.     }  
  62. }  



总结:AOP对面向对象的士兵式编程提供了更好的补充,亦在广大的开源框架有显著的效果,例如Spring Security就以AOP为核心,在业务程序开发当中AOP亦到处存在,例如拦截并缓存关于菜单和数据字典的数据,例如声明式事务,而Annotation的出现更加为快速便捷开发提供了很好的支持,从上面两种方式对比就得出Annotation的声明更加简洁方便,所以在业务当中有需要使用自定义的AOP建议采用Annotation的方式,但XML文件的方式亦必须掌握,因为我们时常需要使用到其他框架提供的切面 
<!--EndFragment-->

分享到:
评论

相关推荐

    spring aop注解方式、xml方式示例

    下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### 注解方式 #### 1. 定义切面(Aspect) 在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect ...

    SpringAop xml方式配置通知

    在Spring框架中,AOP通过代理实现,可以使用XML配置或注解进行配置。本篇文章主要聚焦于Spring AOP的XML配置通知。 **一、AOP概念解析** 1. **切面(Aspect)**:一个关注点的模块化,例如事务管理就是一个切面。...

    SpringAOP的注解配置

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是...在`myaop`项目中,你可以找到具体的示例代码,包括切面类、切入点表达式以及相应的注解使用,通过这些示例可以更深入地理解Spring AOP的注解配置。

    spring aop xml 实例

    Spring AOP主要通过两种方式实现:XML配置和注解。本实例主要探讨的是使用XML配置的方式来实现AOP。XML配置虽然相比注解方式略显繁琐,但它提供了更大的灵活性,尤其是在需要对多个类或方法应用相同通知(Advice)时...

    spring aop管理xml版

    **Spring AOP 管理XML版详解** 在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的设计模式,它扩展了传统的面向对象编程(OOP),使得我们可以将关注点分离,特别是那些横切关注...

    spring注解aop配置详解

    本篇将深入讲解如何通过注解来配置Spring AOP,以实现更加简洁、高效的代码编写。 首先,我们来看注解在Spring AOP中的应用。在传统的AOP配置中,我们需要定义切入点表达式和通知(advice)在XML配置文件中。然而,...

    Spring Mvc AOP通过注解方式拦截controller等实现日志管理

    在Spring中,我们通常使用基于注解的AOP,它简化了配置并使代码更易读。 二、注解驱动的AOP 1. 定义切面(Aspect):首先,我们需要创建一个切面类,这个类通常包含通知(Advice),也就是实际的日志记录方法。使用...

    spring aop jar 包

    在使用Spring AOP时,我们可以通过XML配置或注解的方式来定义切面。例如,可以使用`@Aspect`注解定义一个切面类,`@Before`、`@After`等注解来声明通知,`@Pointcut`定义切点表达式。 在实际开发中,Spring AOP广泛...

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

    Spring支持两种AOP的实现方式:Spring AspectJ注解风格和Spring XML配置风格。使用AspectJ注解风格是最常见的,它允许开发者直接在方法上使用注解来定义切面。 Spring AOP中有五种不同类型的的通知(Advice): 1....

    Spring中Aop的使用包括xml和注解

    这里我们将深入探讨两种在Spring中实现AOP的方式:XML配置和注解配置。 首先,让我们来看看**XML配置AOP**。在Spring的早期版本中,XML配置是主要的配置方式。在`spring-aop-xml`中,你可能会看到以下关键元素: 1...

    spring aop xml实现

    XML配置是Spring AOP早期版本中主要的配置方式,虽然在Spring 4.x及以后版本中,基于注解的配置更加常见,但理解XML配置仍然是学习AOP的基础。 首先,我们需要了解AOP的基本概念: 1. 切面(Aspect):一个关注点的...

    SpringAOP注解特棒例子

    Spring AOP,全称为Aspect-Oriented Programming,是Spring框架中的一个重要模块,它引入了面向切面编程的概念,使得开发者可以更加...学习并掌握Spring AOP的注解使用,对于提升开发效率和代码质量有着显著的帮助。

    Spring AOP完整例子

    在Spring XML配置中,我们可以使用`&lt;aop:config&gt;`元素来定义切点表达式,然后使用`&lt;aop:aspect&gt;`元素来声明切面,并将通知方法与切点关联起来。此外,还可以使用注解驱动的配置,通过`@EnableAspectJAutoProxy`注解...

    springboot spring aop 拦截器注解方式实现脱敏

    总结一下,通过上述步骤,我们已经在Spring Boot应用中利用Spring AOP和注解方式实现了数据脱敏。这个拦截器可以在不修改原有业务代码的情况下,确保敏感信息在响应给客户端之前得到处理,提高了应用的安全性。同时...

    spring aop依赖jar包

    现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...

    Spring框架xml注解配置方式实例

    在本实例中,我们将深入探讨如何使用XML和注解结合的方式来配置Spring框架。首先,我们先来理解每个文件的作用。 1. **Maven配置文件pom.xml** Maven是一个项目管理工具,通过pom.xml文件来管理项目的构建、依赖和...

    Spring Aop四个依赖的Jar包

    要使用Spring AOP,通常需要引入以下几个核心的Jar包: 1. **aspectj-1.7.3.jar**:这是AspectJ库的核心部分,提供了AOP语言支持,包括AspectJ编译器和运行时库。AspectJ是Java平台上的一个开源项目,它扩展了Java...

    用xml配置的方式进行SpringAOP开发

    通过以上步骤,我们就成功地使用XML配置完成了Spring AOP的开发。这种方式虽然相对繁琐,但它清晰地展示了AOP的各个组成部分,有利于理解和学习。然而,在实际开发中,更常见的是使用注解驱动的AOP,因为其更简洁且...

    用注解的方式进行SpringAOP开发

    本篇我们将深入探讨如何使用注解的方式来实现Spring AOP开发。 ### 一、注解基础 在Spring AOP中,主要使用以下几种注解: 1. `@Aspect`:定义一个切面类,切面是AOP的核心,包含通知(advisors)和切点...

    Spring注解方式实现AOP demo

    在Spring AOP中,我们主要使用以下注解: 1. `@Aspect`:标记一个类为切面,这个类将包含切点和通知。 2. `@Before`:前置通知,方法会在目标方法执行前被调用。 3. `@After`:后置通知,无论目标方法是否正常执行...

Global site tag (gtag.js) - Google Analytics