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

spring aop的使用(注解方式以及基于xml配置方式)

 
阅读更多

转载的。。原文地址

http://blog.csdn.net/xzf19901108/article/details/7835558

注解方式

 

*******************

beans.xml

*******************

 

[html] view plaincopy
 
 
  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:context="http://www.springframework.org/schema/context"  
  5.        xmlns:aop="http://www.springframework.org/schema/aop"  
  6.        xsi:schemaLocation="  
  7.            http://www.springframework.org/schema/beans  
  8.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  9.            http://www.springframework.org/schema/context   
  10.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  11.            http://www.springframework.org/schema/aop  
  12.            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  13.            ">  
  14.              
  15.           <aop:aspectj-autoproxy/>  
  16.           <bean id="myInterceptor" class="blog.service.MyInterceptor"/>  
  17.           <bean id="personService" class="blog.service.impl.PersonServiceBean"></bean>  
  18.             
  19. </beans>  



 

 

***************

MyInterceptor.java

***************

 

[java] view plaincopy
 
 
  1. package blog.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.  * 
  15.  */  
  16. @Aspect  
  17. public class MyInterceptor {  
  18.     @Pointcut("execution (* blog.service.impl.PersonServiceBean.*(..))")  
  19.     public void anyMethod() {  
  20.         //表达式解释:* blog.service.impl.PersonServiceBean.*(..):第一个*号表示返回类型;  
  21.         //blog.service.impl.PersonServiceBean.*:表示PersonServiceBean类下的所有方法  
  22.         //blog.service.impl..*.*:表示blog.service.impl包及其子包下的所有类的所有方法  
  23.         //(..):表示所有的参数类型几个数都不限  
  24.     }// 声明一个切入点  
  25.   
  26.     //会拦截参数签名位 (String , int)或(String , Integer )类型的方法,  
  27.     //参数顺序与args(uname,id)一致,参数类型由(int id,String uname)决定  
  28.     @Before("anyMethod() && args(uname,id)")  
  29.     public void doAccessCheck(int id,String uname) {  
  30.         System.out.println("前置通知:" + uname + id);  
  31.     }  
  32.   
  33.     @AfterReturning(pointcut="anyMethod()",returning="result")  
  34.     public void doAfterReturning(String result) {  
  35.         System.out.println("后置通知:" + result);  
  36.     }  
  37.   
  38.     @After("anyMethod()")  
  39.     public void doAfter() {  
  40.         System.out.println("最终通知");  
  41.     }  
  42.   
  43.     @AfterThrowing(pointcut="anyMethod()",throwing="e")  
  44.     public void doAfterThrowing(Exception e) {  
  45.         System.out.println("例外通知:" + e.getMessage());  
  46.     }  
  47.       
  48.     @Around("anyMethod()")  
  49.     public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{  
  50.         //if(){//判断用户是否有权限  
  51.         System.out.println("进入方法");  
  52.         Object result = pjp.proceed();  
  53.         System.out.println("退出方法");  
  54.         //}  
  55.         return result;  
  56.     }  
  57. }  



 

***************

PersonService.java

***************

 

[java] view plaincopy
 
 
  1. package blog.service;  
  2.   
  3.   
  4. public interface PersonService {  
  5.     public String save(String name);  
  6.     public String update(String name,Integer userId);  
  7.     public String delete(int id,String dept);  
  8.       
  9. }  



 

 

***************

PersonServiceBean.java

***************

 

[java] view plaincopy
 
 
  1. package blog.service.impl;  
  2.   
  3. import blog.service.PersonService;  
  4.   
  5. public class PersonServiceBean implements PersonService {  
  6.     private String username = null;  
  7.   
  8.     public String getUsername() {  
  9.         return username;  
  10.     }  
  11.   
  12.     public PersonServiceBean() {  
  13.     }  
  14.   
  15.     public PersonServiceBean(String username) {  
  16.         this.username = username;  
  17.     }  
  18.   
  19.     @Override  
  20.     public String save(String name) {  
  21.         if (name.equals("") || name == null) {  
  22.             throw new RuntimeException("出错啦");  
  23.         }  
  24.         System.out.println("in save method!" + name);  
  25.   
  26.         return "in save method!" + name;  
  27.     }  
  28.   
  29.     @Override  
  30.     public String update(String name, Integer userId) {  
  31.         System.out.println("in update method! name = " + name + " id = "  
  32.                 + userId + " username = " + username);  
  33.         return "in update method!name = " + name + " id = " + userId;  
  34.     }  
  35.   
  36.     @Override  
  37.     public String delete(int id, String dept) {  
  38.         System.out.println("id = " + id + " dept = " +  dept);  
  39.         return "in delete method! + nameid = " + id + " dept = " +  dept;  
  40.     }  
  41.   
  42. }  



 

 

***************

SpringAOPTest.java

***************

 

[java] view plaincopy
 
 
  1. package junitTest;  
  2.   
  3.   
  4. import org.junit.BeforeClass;  
  5. import org.junit.Test;  
  6. import org.springframework.context.ApplicationContext;  
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  8.   
  9. import blog.service.PersonService;  
  10.   
  11. public class SpringAOPTest {  
  12.   
  13.     @BeforeClass  
  14.     public static void setUpBeforeClass() throws Exception {  
  15.     }  
  16.       
  17.     @Test  
  18.     public void AopTest(){  
  19.         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");  
  20.         PersonService service = (PersonService)ctx.getBean("personService");  
  21.         try {  
  22.               
  23.             service.delete(12"it");  
  24.             service.update("发多个地方",324);  
  25.             service.save("");  
  26.               
  27.         } catch (Exception e) {  
  28.             e.printStackTrace();  
  29.         }  
  30.     }  
  31.   
  32. }  



 

 

***************

运行结果

***************

 

 

基于xml配置方式

 

 

*************

beans.xml

************

 

[html] view plaincopy
 
 
  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:context="http://www.springframework.org/schema/context"  
  5.        xmlns:aop="http://www.springframework.org/schema/aop"  
  6.        xsi:schemaLocation="  
  7.            http://www.springframework.org/schema/beans  
  8.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  9.            http://www.springframework.org/schema/context   
  10.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  11.            http://www.springframework.org/schema/aop  
  12.            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  13.            ">  
  14.              
  15.           <aop:aspectj-autoproxy/>  
  16.           <bean id="myInterceptor" class="blog.service.MyInterceptor"/>  
  17.           <bean id="personService" class="blog.service.impl.PersonServiceBean"></bean>  
  18.             
  19.           <aop:config>  
  20.             <aop:aspect id="aspectBean" ref="myInterceptor" >  
  21.                 <aop:pointcut  id="point"  expression="execution (!void blog.service.impl.PersonServiceBean.*(..))"/>  
  22.                 <aop:before method="doAccessCheck" pointcut-ref="point" />  
  23.                 <aop:after-returning method="doAfterReturning" pointcut-ref="point" />  
  24.                 <aop:after-throwing method="doAfterThrowing" pointcut-ref="point"/>  
  25.                 <aop:after method="doAfter" pointcut-ref="point"/>  
  26.                 <aop:around method="doBasicProfiling" pointcut-ref="point" />  
  27.                   
  28.             </aop:aspect>  
  29.           </aop:config>  
  30.             
  31. </beans>  

 

 

*******************

MyInterceptor.java

*******************

 

[java] view plaincopy
 
 
  1. package blog.service;  
  2.   
  3. import org.aspectj.lang.ProceedingJoinPoint;  
  4.   
  5.   
  6. public class MyInterceptor {  
  7.     public void anyMethod() {  
  8.     }  
  9.   
  10.     public void doAccessCheck() {  
  11.         System.out.println("前置通知" );  
  12.     }  
  13.   
  14.     public void doAfterReturning() {  
  15.         System.out.println("后置通知");  
  16.     }  
  17.   
  18.     public void doAfter() {  
  19.         System.out.println("最终通知");  
  20.     }  
  21.   
  22.     public void doAfterThrowing() {  
  23.         System.out.println("例外通知");  
  24.     }  
  25.       
  26.     public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{  
  27.         //if(){//判断用户是否有权限  
  28.         System.out.println("进入方法");  
  29.         Object result = pjp.proceed();  
  30.         System.out.println("退出方法");  
  31.         //}  
  32.         return result;  
  33.     }  
  34. }  

 

 

 

aop表达式的使用方法

<aop:pointcut  id="point"  expression="execution (!void blog.service.impl.PersonServiceBean.*(..))"/>

!void blog.service.impl.PersonServiceBean.*(..)中!void 表示拦截所有返回类型为非void类型的方法

java.lang.String表示拦截所有返回类型为String类型的方法

* blog.service.impl.PersonServiceBean.*(java.lang.String,..)表示拦截所有第一个参数为String类型的方法

 

分享到:
评论

相关推荐

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

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

    Spring AOP 的实现例子(基于XML配置实现)

    Spring AOP,即Spring的面向切面编程,是Spring框架中的一个重要组成部分,它提供了一种在不修改原有代码的情况下,对程序...虽然现在更多地使用注解式配置,但理解XML配置方式对于全面掌握Spring AOP仍然至关重要。

    Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)

    本教程将探讨如何在Spring中结合AspectJ实现AOP,包括基于XML配置和基于注解的方式。 **一、AOP基本概念** AOP的核心概念有切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)和引入...

    SpringAOP的注解配置

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

    spring注解aop配置详解

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

    SpringAop xml方式配置通知

    **Spring AOP XML方式配置通知** 在Java世界中,Spring框架是广泛应用的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。AOP允许开发者定义“方面”,这些方面可以封装关注点,如日志、事务...

    基于xml的SpringAOP实例

    在基于XML的配置方式下,Spring AOP提供了直观且灵活的声明式方法来实现这些关注点的分离,使得业务逻辑代码更为简洁。 在Spring AOP中,我们首先需要定义一个切面(Aspect),它包含了若干个通知(Advice)。通知...

    AOP的相关概念,基于XML的AOP的配置,基于注解的AOP配置

    ### AOP的相关概念 **AOP**,全称为**Aspect-Oriented Programming**,即面向切面编程。这种编程范式旨在将横切...而对于大型项目或复杂的团队协作,则可能更倾向于使用基于XML的配置来获得更高的灵活性和可维护性。

    Spring注解方式实现AOP demo

    总结来说,这个Spring AOP注解方式的Demo展示了如何通过简单的注解定义切面、切点和通知,实现对业务逻辑的无侵入式增强。这种方式使得代码更简洁、可读性更强,同时也充分利用了Spring框架的优势。对于理解和实践...

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

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

    Spring 基于基于XML配置方式实现AOP

    然而,随着Spring的发展,基于注解的AOP配置逐渐成为主流,因为它的简洁性和可读性更强。但这并不意味着XML配置方式失去了价值,尤其是在需要更细粒度控制或者与旧项目集成时,XML配置依然有着其独特的优势。 总的...

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

    总的来说,Spring AOP通过XML配置为我们提供了一种灵活的方式来管理横切关注点,使我们的代码更加模块化和可维护。通过定义Advisor、切点和通知,我们可以将如日志记录、事务处理等通用功能轻松地插入到业务逻辑中,...

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

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

    基于注解配置和使用spring AOP(spring mvc框架)

    本篇文章将深入探讨如何在Spring MVC中配置和使用基于注解的AOP。 一、Spring AOP基础知识 1. **切面(Aspect)**:切面是关注点的模块化,例如日志、事务管理等。在Spring AOP中,切面可以是Java类或@Aspect注解...

    spring aop jar 包

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

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

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

    springAop默认代理方式.zip

    4. **代理模式的创建**:Spring AOP 使用`org.springframework.aop.framework.ProxyFactoryBean`或`@EnableAspectJAutoProxy`注解来配置代理。`ProxyFactoryBean`是XML配置方式,而`@EnableAspectJAutoProxy`是基于...

    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使用实例

    Spring AOP有两种实现方式:基于代理的AOP(JDK动态代理和CGLIB代理)和基于注解的AOP。 - **JDK动态代理**:当目标类实现了接口时,Spring会使用JDK的Proxy类创建一个代理对象,该代理对象会在调用接口方法时插入...

    使用Spring配置文件实现AOP

    这种方式虽然相比注解方式略显繁琐,但对于大型项目或者需要精细控制AOP配置的情况,仍然是一个很好的选择。通过深入理解和实践,我们可以更好地利用Spring AOP来优化我们的应用程序,提高代码的可读性和可维护性。

Global site tag (gtag.js) - Google Analytics