`
丶折子戏
  • 浏览: 12671 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

[转] Spring AOP 详解——注解方式

 
阅读更多

Spring对AOP的实现提供了很好的支持。下面我们就使用Spring的注解来完成AOP做一个例子。

首先,为了使用Spring的AOP注解功能,必须导入如下几个包。aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar.

然后我们写一个接口

  1. package com.bird.service;  
  2.   
  3. public interface PersonServer {  
  4.   
  5.     public void save(String name);  
  6.     public void update(String name, Integer id);  
  7.     public String getPersonName(Integer id);  
  8.       
  9. }  

和一个接口实现类

  1. package com.bird.service.impl;  
  2.   
  3. import com.bird.service.PersonServer;  
  4.   
  5. public class PersonServiceBean implements PersonServer{  
  6.       
  7.     @Override  
  8.     public void save(String name) {  
  9.           
  10.         System.out.println("我是save方法");  
  11.     //  throw new RuntimeException();   
  12.     }  
  13.   
  14.     @Override  
  15.     public void update(String name, Integer id) {  
  16.           
  17.         System.out.println("我是update()方法");  
  18.     }  
  19.   
  20.     @Override  
  21.     public String getPersonName(Integer id) {  
  22.           
  23.         System.out.println("我是getPersonName()方法");  
  24.         return "xxx";  
  25.     }  
  26.   
  27. }  

下面使用Spring注解方式对这个Bean进行方法拦截

  1. package com.bird.service;  
  2.   
  3. import org.aspectj.lang.ProceedingJoinPoint;  
  4. import org.aspectj.lang.annotation.After;  
  5. import org.aspectj.lang.annotation.AfterReturning;  
  6. import org.aspectj.lang.annotation.AfterThrowing;  
  7. import org.aspectj.lang.annotation.Around;  
  8. import org.aspectj.lang.annotation.Aspect;  
  9. import org.aspectj.lang.annotation.Before;  
  10. import org.aspectj.lang.annotation.Pointcut;  
  11.   
  12. /** 
  13.  * 切面 
  14.  * @author Bird 
  15.  * 
  16.  */  
  17. @Aspect  
  18. public class MyInterceptor {  
  19.     @Pointcut("execution(* com.bird.service.impl.PersonServiceBean.*(..))")  
  20.     private void anyMethod(){}//定义一个切入点   
  21.       
  22.     @Before("anyMethod() && args(name)")  
  23.     public void doAccessCheck(String name){  
  24.         System.out.println(name);  
  25.         System.out.println("前置通知");  
  26.     }  
  27.       
  28.     @AfterReturning("anyMethod()")  
  29.     public void doAfter(){  
  30.         System.out.println("后置通知");  
  31.     }  
  32.       
  33.     @After("anyMethod()")  
  34.     public void after(){  
  35.         System.out.println("最终通知");  
  36.     }  
  37.       
  38.     @AfterThrowing("anyMethod()")  
  39.     public void doAfterThrow(){  
  40.         System.out.println("例外通知");  
  41.     }  
  42.       
  43.     @Around("anyMethod()")  
  44.     public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{  
  45.         System.out.println("进入环绕通知");  
  46.         Object object = pjp.proceed();//执行该方法   
  47.         System.out.println("退出方法");  
  48.         return object;  
  49.     }  
  50. }  

 execution表达式

Java代码  收藏代码
  1. execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)  

modifiers-pattern:方法的操作权限

ret-type-pattern:返回值

declaring-type-pattern:方法所在的包

name-pattern:方法名

parm-pattern:参数名

throws-pattern:异常

其中,除ret-type-pattern和name-pattern之外,其他都是可选的。上例中,execution(* com.spring.service.*.*(..))表示com.spring.service包下,返回值为任意类型;方法名任意;参数不作限制的所有方法。

  1. @Pointcut("execution(* com.bird.service.impl.PersonServiceBean.*(..))")  

这句话是方法切入点,execution为执行的意思,*代表任意返回值,然后是包名,.*意思是包下面的所有子包。(..)代

 

表各种方法.

然后下面的注解就比较简单了,就是在使用方法前和中,还有环绕拦截/

然后在Spring的配置文件中继续配置Bean,需要打开AOP命名空间

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:aop="http://www.springframework.org/schema/aop"  
  5.        xsi:schemaLocation="  
  6.        http://www.springframework.org/schema/beans    
  7.        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  8.        http://www.springframework.org/schema/aop    
  9.        http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">   
  10.           
  11.         <aop:aspectj-autoproxy/>  
  12.     <bean id="personServiceBean" class="com.bird.service.impl.PersonServiceBean"/>  
  13.     <bean id="myInterceptor" class="com.bird.service.MyInterceptor"/>  
  14.      
  15. </beans>  

然后建立一个Junit测试

  1. package junit.test;  
  2.   
  3. import org.junit.Test;  
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6.   
  7. import com.bird.service.PersonServer;  
  8.   
  9. public class SpringAOPTest {  
  10.       
  11.     @Test  
  12.     public void inteceptorTest(){  
  13.         ApplicationContext ctx = new ClassPathXmlApplicationContext("beanAop.xml");  
  14.         PersonServer bean = (PersonServer)ctx.getBean("personServiceBean");  
  15.         bean.save(null);  
  16.     }  
  17.       
  18.   
  19. }  

测试结果为

  1. 2012-3-12 18:08:39 org.springframework.context.support.AbstractApplicationContext prepareRefresh  
  2. 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6: display name [org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6]; startup date [Mon Mar 12 18:08:39 CST 2012]; root of context hierarchy  
  3. 2012-3-12 18:08:40 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
  4. 信息: Loading XML bean definitions from class path resource [beanAop.xml]  
  5. 2012-3-12 18:08:40 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory  
  6. 信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@dd20f6]: org.springframework.beans.factory.support.DefaultListableBeanFactory@b0bad7  
  7. 2012-3-12 18:08:40 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons  
  8. 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@b0bad7: defining beans [org.springframework.aop.config.internalAutoProxyCreator,personServiceBean,myInterceptor]; root of factory hierarchy  
  9. null  
  10. 前置通知  
  11. 进入环绕通知  
  12. 我是save方法  
  13. 后置通知  
  14. 退出方法  
  15. 最终通知  
分享到:
评论

相关推荐

    spring注解aop配置详解

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

    详解使用Spring AOP和自定义注解进行参数检查

    使用Spring AOP和自定义注解进行参数检查 了解使用Spring AOP和自定义注解进行参数检查的技术细节。通过自定义注解和spring AOP,我们可以实现参数的校验,提高代码的可读性和可维护性。 自定义注解 在本篇文章中...

    SpringAOP中的注解配置详解

    SpringAOP中的注解配置详解 ...SpringAOP中的注解配置详解是实现AOP功能的重要技术之一,它提供了一种灵活、可扩展的方式来拦截和扩展业务逻辑。通过使用注解和XML配置,开发者可以轻松地实现对业务逻辑的拦截和扩展。

    spring aop 注解例子

    **Spring AOP 注解例子详解** 在 Spring 框架中,面向切面编程(Aspect Oriented Programming,AOP)是一种强大的设计模式,它允许我们分离关注点,将业务逻辑与系统服务(如日志、事务管理等)解耦。在 Spring AOP...

    springAOP详解

    ### Spring AOP 详解 #### 5.1 AOP 基本思想 **5.1.1 认识 AOP** AOP (Aspect Oriented Programming) 面向切面编程,是一种软件开发思想,它允许开发者将那些分散在整个应用各处的“切面”(如日志记录、安全控制...

    Spring AOP实现机制

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

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

    Spring AOP支持多种方式来定义切入点,包括但不限于方法名、类名、注解等。 5. **引入(Introduction)**:允许向被通知对象添加新的接口实现或者新的方法。例如,可以使用引入让任何对象实现`IsModified`接口,...

    Spring AOP依赖jar包

    **Spring AOP 依赖 Jar 包详解** 在 Spring 框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,这些切面可以封装跨多个对象的行为或责任。Spring AOP 提供了在运行时实现切面的功能,...

    spring aop

    **Spring AOP 知识点详解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在程序运行时动态插入代码的能力,以实现跨切面的关注点,如日志、事务管理、权限...

    SpringAop学习笔记以及实现Demo

    2. **基于注解的AOP**:Spring 2.5开始支持注解驱动的AOP,通过在方法上使用`@Before`、`@After`、`@AfterReturning`、`@AfterThrowing`、`@Around`等注解来定义通知。 3. **基于XML配置的AOP**:在Spring的配置...

    spring aop实例

    **Spring AOP 实例详解** 在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它允许开发者将关注点从核心...

    springAOP中文文档

    ### Spring AOP 概念与实践 #### 一、AOP 概述 ...Spring AOP 提供了灵活的机制来实现这一目标,无论是通过 AspectJ 注解还是 XML 配置,开发者都可以根据项目的需求选择最适合的方式来实现 AOP。

    Spring AOP实现 项目源码 Myeclipse 直接导入可用

    **Spring AOP 实现详解** 在Java开发中,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它允许开发者将关注点从核心业务...

    Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现.doc

    Spring AOP 实现原理详解之 AOP 切面的实现 Spring AOP 是基于 IOC 的 Bean 加载来实现的,本文主要介绍 Spring AOP 原理解析的切面实现过程。AOP 切面的实现是将切面类的所有切面方法根据使用的注解生成对应 ...

    Spring——aop

    **Spring AOP 知识详解** 在Java开发领域,Spring框架是不可或缺的一部分,它提供了许多强大的功能,其中AOP(面向切面编程)是其重要特性之一。AOP允许开发者将关注点分离,使得业务逻辑代码与系统服务如日志、...

    Spring AOP详解

    **Spring AOP详解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在程序运行期间通过代理方式实现横切关注点(如日志、事务管理等)的技术。相较于...

    spring aop管理xml版

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

    spring Aop文档

    ### Spring AOP 文档知识点详解 #### 一、Spring AOP 概述 Spring AOP(面向切面编程)是Spring框架中的一个关键模块,它为开发者提供了在应用程序中实现横切关注点(Cross-cutting Concerns)的能力。横切关注点...

Global site tag (gtag.js) - Google Analytics