`

Spring aop--几种不同的使用方式

 
阅读更多

最近听老师讲关于AOP关于容器的课,突然觉得之前对aop的理解都不是很到位,先不说理解就是应用都很少,最近也写了几篇关于AOP的博客,都是一些简单的demo,今天在这里再说一下关于Spring AOP的几种实现方式。

        我们经常会用到的有如下几种

        1、基于代理的AOP

        2、纯简单java对象切面

        3@Aspect注解形式的

        4、注入形式的Aspcet切面

下面我们就一个一个来应用吧.

下面先写一下几个基本的类。

接口类:

 

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 定义一个接口 
  3.  * @author 陈丽娜 
  4.  * @version 2015年5月31日上午9:16:50 
  5.  */  
  6. public interface Sleepable {  
  7.   
  8.     /** 
  9.      * 睡觉方法 
  10.      * @author 陈丽娜 
  11.      * @version 2015年5月31日上午9:17:14 
  12.      */  
  13.     void sleep();  
  14. }  

 

 

实现类:

 

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 陈丽娜 本人实现睡觉接口 
  3.  * @author 陈丽娜 
  4.  * @version 2015年5月31日下午4:51:43 
  5.  */  
  6. public class ChenLliNa implements Sleepable {  
  7.   
  8.     @Override  
  9.     public void sleep() {  
  10.         // TODO Auto-generated method stub  
  11.         System.out.println("乖,该睡觉了!");  
  12.     }  
  13. }  



 

增强类:

 

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 定义一个睡眠的增强 同时实现前置 和后置 
  3.  * @author 陈丽娜 
  4.  * @version 2015年5月31日上午9:24:43 
  5.  */  
  6. public class SleepHelper implements MethodBeforeAdvice, AfterReturningAdvice {  
  7.   
  8.     @Override  
  9.     public void afterReturning(Object returnValue, Method method,  
  10.             Object[] args, Object target) throws Throwable {  
  11.          System.out.println("睡觉前要敷面膜");  
  12.     }  
  13.   
  14.     @Override  
  15.     public void before(Method method, Object[] args, Object target)  
  16.             throws Throwable {  
  17.         System.out.println("睡觉后要做美梦");  
  18.     }  
  19.   
  20. }  

 

 

一、基于代理的AOP

 

  

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <!-- 创建一个增强 advice -->  
  2.     <bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper"/>  
  3.   
  4.     <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>  
  5.     <!-- 定义切点   匹配所有的sleep方法-->  
  6.     <bean id ="sleepPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">  
  7.            <property name="pattern" value=".*sleep"></property>  
  8.     </bean>  
  9.       
  10.     <!-- 切面    增强+切点结合 -->  
  11.     <bean id="sleepHelperAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">  
  12.          <property name="advice" ref="sleepHelper"/>  
  13.          <property name="pointcut" ref="sleepPointcut"/>  
  14.     </bean>  
  15.       
  16.     <!-- 定义代理对象 -->  
  17.     <bean id="linaProxy" class="org.springframework.aop.framework.ProxyFactoryBean">  
  18.             <property name="target" ref="lina"/>  
  19.             <property name="interceptorNames" value="sleepHelperAdvisor"/>  
  20.             <!-- <property name="proxyInterfaces" value="com.tgb.springaop.service.Sleepable"/> -->  
  21.     </bean>  

 

 

如配置文件中:

pattern属性指定了正则表达式,他匹配所有的sleep方法

使用org.springframework.aop.support.DefaultPointcutAdvisor的目的是为了使切点和增强结合起来形成一个完整的切面

最后配置完后通过org.springframework.aop.framework.ProxyFactoryBean产生一个最终的代理对象。

 

二、纯简单java对象切面

纯简单java对象切面这话怎么说呢,在我看来就是相对于第一种配置,不需要使用代理,,而是通过spring内部机制去自动扫描,这时候我们的配置文件就该如下修改:

 

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <!-- 创建一个增强 advice -->  
  2. <bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper"/>  
  3. <!-- 目标类 -->  
  4. <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>  
  5.   
  6. <!--  配置切点和通知-->  
  7. <bean id ="sleepAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">  
  8.      <property name="advice" ref="sleepHelper"></property>  
  9.      <property name="pattern" value=".*sleep"/>  
  10. </bean>  
  11.   
  12. <!-- 自动代理配置 -->  
  13. <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>  

 

 

是不是相对于第一种简单了许多,不用再去配置代理了。

 

三、@Aspect注解形式

根据我们的经验也知道,注解的形式相对于配置文件是简单一些的,这时候需要在已有的方法或类上家注解:

 

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 通过注解的方式 添加增强 
  3.  * @author 陈丽娜 
  4.  * @version 2015年5月31日上午10:26:13 
  5.  */  
  6. @Aspect  
  7. @Component  
  8. public class SleepHelper03 {      
  9.       
  10.     /*@Pointcut("execution(* com.tgb.springaop.service.impl..*(..))")*/  
  11.     @Pointcut("execution(* *.sleep(..))")  
  12.     public void sleeppoint(){}  
  13.       
  14.     @Before("sleeppoint()")  
  15.     public void beforeSleep(){  
  16.         System.out.println("睡觉前要敷面膜");  
  17.     }  
  18.       
  19.     @AfterReturning("sleeppoint()")  
  20.     public void afterSleep(){  
  21.         System.out.println("睡觉后要做美梦");  
  22.     }  



 

配置文件中只需写:

 

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <!--扫描包 -->  
  2.      <context:component-scan base-package="com.tgb" annotation-config="true"/>   
  3.      <!-- ASPECTJ注解 -->  
  4.      <aop:aspectj-autoproxy  proxy-target-class="true" />    
  5.        
  6.      <!-- 目标类 -->  
  7.       <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>   



 

 

四、注入形式的Aspcet切面

个人感觉这个是最简单的也是最常用的,也是最灵活的。配置文件如下:

 

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <!-- 目标类 -->  
  2.     <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>  
  3.     <bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper02"/>  
  4.       
  5.     <aop:config>  
  6.         <aop:aspect ref="sleepHelper">  
  7.              <aop:before method="beforeSleep" pointcut="execution(* *.sleep(..))"/>  
  8.              <aop:after method="afterSleep" pointcut="execution(* *.sleep(..))"/>  
  9.         </aop:aspect>  
  10.     </aop:config>  



 

配置文件中提到的SleepHelper02类如下:

 

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 通过注解的方式 添加增强 
  3.  * @author 陈丽娜 
  4.  * @version 2015年5月31日上午10:26:13 
  5.  */  
  6.   
  7. public class SleepHelper02 {  
  8.     public void beforeSleep(){  
  9.         System.out.println("睡觉前要敷面膜");  
  10.     }  
  11.     public void afterSleep(){  
  12.         System.out.println("睡觉后要做美梦");  
  13.     }  
  14. }  

 

 

是不是看上去都很简单呀,这样是不是大家都会使用spring aop了?!

 

关于如何调用,这里写了几个测试类,可以看一下,基本都一样:

 

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 配置文件 spring_aop.xml  通过代理 
  3.  * @author 陈丽娜 
  4.  * @version 2015年5月31日上午10:09:10 
  5.  */  
  6. @Test  
  7. public void test(){  
  8.     ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop.xml");  
  9.       
  10.     Sleepable sleeper =(Sleepable) ct.getBean("linaProxy");  
  11.       
  12.     sleeper.sleep();  
  13. }  
  14.   
  15. /** 
  16.  * 配置文件 spring_aop_01.xml   简答的java对象 
  17.  * @author 陈丽娜 
  18.  * @version 2015年5月31日上午10:09:37 
  19.  */  
  20. @Test  
  21. public void test01(){  
  22.     ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop_01.xml");  
  23.       
  24.     Sleepable sleeper = (Sleepable)ct.getBean("lina");  
  25.       
  26.     sleeper.sleep();  
  27. }  
  28.   
  29. /** 
  30.  * 配置文件 spring_aop_03.xml  通过aspect注解 
  31.  * @author 陈丽娜 
  32.  * @version 2015年5月31日上午10:09:37 
  33.  */  
  34. @Test  
  35. public void test03(){  
  36.     ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop_03.xml");  
  37.       
  38.        Sleepable sleeper = (Sleepable)ct.getBean("lina");  
  39.       
  40.     sleeper.sleep();  
  41. }  
  42. /** 
  43.  * 配置文件 spring_aop_02.xml  通过apsect配置文件 
  44.  * @author 陈丽娜 
  45.  * @version 2015年5月31日上午10:09:37 
  46.  */  
  47. @Test  
  48. public void test02(){  
  49.     ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop_02.xml");  
  50.       
  51.     Sleepable sleeper = (Sleepable)ct.getBean("lina");  
  52.       
  53.     sleeper.sleep();  
  54. }  

 

分享到:
评论

相关推荐

    Spring--3.Spring AOP-2

    在Spring AOP中,有两种主要的实现方式:基于接口的JDK动态代理和基于类的CGLIB代理。JDK代理适用于目标对象实现了接口的情况,而CGLIB则在目标对象没有接口时提供代理功能。 使用Spring AOP的步骤通常包括: 1. ...

    Spring--3.Spring AOP-1

    在实际应用中,Spring AOP提供了两种主要的配置方式: - **XML配置**:在Spring的配置文件中声明切面、通知、切入点等信息。 ```xml &lt;aop:config&gt; &lt;aop:aspect id="loggingAspect" ref="loggingService"&gt; &lt;aop:...

    spring aop4.3.10

    在Spring AOP 4.3.10中,我们主要关注以下几个关键知识点: 1. **切面(Aspect)**:切面是AOP的核心概念,它封装了多个相关操作,包括通知(Advice)、引入(Introduction)、目标对象(Target Object)、织入...

    spring-aop.xsd

    `spring-aop.xsd`包含了不同版本(2.5、3.1、3.2)的XML配置元素和属性定义,这意味着随着Spring框架的版本更新,AOP的配置方式可能会有所变化。例如,`aspect`元素用于定义一个切面,它包含`pointcut`子元素来定义...

    spring aop jar 包

    Spring AOP支持三种织入方式:编译时织入、加载时织入和运行时织入。Spring默认使用运行时织入,通过动态代理实现。 6. **代理(Proxy)**:代理是AOP的核心,它是目标对象的增强版本,负责在调用目标方法前后执行...

    spring Aop文档

    Spring AOP主要通过两种方式实现: 1. **基于XML的配置**:通过在Spring配置文件中声明切面、切入点和通知来实现。 2. **基于注解的方式**:使用`@AspectJ`风格的注解来声明切面和通知。 #### 四、Spring AOP 的...

    Spring aop 之 静态代理 动态代理 Aspectj aop-config 等实现方式

    主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...

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

    标题中的“API 线索图”可能意味着本文将通过一种图解的方式,即流程图或者类图的形式,来阐述Spring AOP的编程思想和API的使用。 描述中,“小马哥讲 Spring AOP 编程思想”表明这是由一位专家小马哥讲解的内容,...

    spring AOP配置的几种方式

    本文主要介绍几种常见的Spring AOP配置方式,并通过具体的示例来说明每种配置的特点。 #### 二、AOP配置所需基本元素 配置AOP时需要以下三个基本元素: 1. **Advice**:这是实际执行的代码,即我们所说的“切面”...

    Spring AOP 常用的四种实现方式

    本篇文章将深入探讨Spring AOP的四种常见实现方式。 一、基于接口的代理(Interface-Based Proxy) 这是Spring AOP最基础的实现方式,适用于目标对象实现了特定接口的情况。Spring会创建一个代理对象,该对象实现...

    java开发常用jar包之spring--aop.rar

    使用Spring AOP,开发者可以通过声明式方式配置切面,无需侵入核心业务代码,提高了代码的可读性和可维护性。例如,通过在方法上添加`@Transactional`注解,可以轻松实现事务管理。 总的来说,"java开发常用jar包之...

    spring入门学习-6、AOP几种配置方式详解.pdf

    ### Spring AOP 几种配置方式详解 #### 一、Spring AOP 概述 Spring AOP(面向切面编程)是一种强大的编程模式,用于在应用程序中管理横切关注点,如日志记录、安全控制等。Spring 提供了多种方式来支持 AOP 的...

    spring aop spring aop

    总的来说,Spring AOP提供了一种优雅的方式来管理横切关注点,使代码更整洁,降低了模块间的耦合。在实际开发中,它可以用于日志记录、权限控制、事务管理等多个场景,极大地提高了代码的可维护性和复用性。

    spring-aop

    总结来说,Spring AOP是Spring框架的重要组成部分,它提供了一种优雅的方式去处理横切关注点,降低了代码的耦合度,提高了代码的可读性和可维护性。通过定义切面、切点和通知,我们可以轻松地实现常见的系统级服务,...

    spring - aop.zip

    Spring支持两种织入方式:编译时织入(使用AspectJ编译器)和运行时织入(在应用上下文初始化时通过代理机制实现)。 在实际使用中,我们通常会定义一个切面类,比如`LoggingAspect`,并使用注解来定义切入点和通知...

    Spring AOP demo (maven)

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理等。在本示例中,我们将深入探讨如何在Maven项目中设置和使用Spring AOP...

    spring-framework-master

    5. **MVC(Model-View-Controller)模块**:Spring MVC是Spring框架的一部分,提供了一种用于构建Web应用的模型-视图-控制器架构。 6. **Test模块**:提供了对JUnit和TestNG的支持,方便进行单元测试和集成测试。 ...

    springaop.zip

    在本示例中,"springaop.zip" 包含了一个使用XML配置的Spring AOP应用实例,可以直接运行,配合相关的博客文章学习效果更佳。 在Spring AOP中,我们首先需要了解几个核心概念: 1. **切面(Aspect)**:切面是关注...

    SpringAOP.zip

    Spring AOP,全称为Aspect Oriented Programming,是Spring框架中的一个重要模块,主要负责处理系统中的...文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从基础概念到进阶实践的详细讲解。

Global site tag (gtag.js) - Google Analytics