`
liusg123
  • 浏览: 17936 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

基于XML和注解的Spring的AOP使用

阅读更多
1。首先基于注解配置的AOP使用:(在学习Spring的AOP之前建意先去学习一下Java的JDK动态代理和CGLIB的代理技术,AOP是基于代理实现的,JDK的动态代理需要目标对象实现一个接口,若没有实现接口则可以使用CGLIB,它的代理对象是继承目标对象。)

目标对象的接口如下:

Java代码 
1.public interface PersonService { 
2. 
3.    public abstract void save(String name); 
4. 
5.    public abstract String getPersonName(String personId); 
6. 
7.    public abstract void deletePerson(Integer id); 
8.} 


目标对象(PersonServiceImple):


Java代码 
1.public class PersonServiceImple implements PersonService { 
2. 
3.    public void save(String name) { 
4.        System.out.println("aop.annotation.service.imple.PersonServiceImple的save()方法"); 
5.        // throw new RuntimeException("手动引用的一个异常信息"); 
6.    } 
7. 
8.    public String getPersonName(String personId) { 
9.//      throw new RuntimeException("手动抛出的异常信息...."); 
10.        return "http://zmx.iteye.com"; 
11.         
12.    } 
13.     
14.    public void deletePerson(Integer id){ 
15.        throw new RuntimeException("手动抛出的异常信息...."); 
16.    } 
17.} 

使用Spring的注解配置一个Spring的切面

Java代码 
1.import org.aspectj.lang.ProceedingJoinPoint; 
2.import org.aspectj.lang.annotation.After; 
3.import org.aspectj.lang.annotation.AfterReturning; 
4.import org.aspectj.lang.annotation.AfterThrowing; 
5.import org.aspectj.lang.annotation.Around; 
6.import org.aspectj.lang.annotation.Aspect; 
7.import org.aspectj.lang.annotation.Before; 
8.import org.aspectj.lang.annotation.Pointcut; 
9. 
10.//@Aspect用来标示一个类为切面 
11.@Aspect 
12.public class MyInterceptor { 
13.    // @Pointcut用来设置一个切入点。aop.annotation.service..包(子包)内的所有类,所有方法,任何参数 
14.    @Pointcut("execution(* aop.annotation.service.imple..*.*(..))") 
15.    private void anyMethod() { 
16. 
17.    } 
18. 
19.    // 使用@Before(切入点)用来表示目标方法执行前执行的操作(前置通知) 
20.    // @Before("anyMethod()") 
21.    @Before("anyMethod() && args(nameArg)") 
22.    // 使用这个方法可以获取参数。即:在原来的切入点条件上加了另一个条件即:拦截方法的参数有一个并且是String类型 
23.    public void doBefore(String nameArg) { 
24.        System.out.println("前置通知...拦截方法执行参数:" + nameArg); 
25.    } 
26. 
27.    // 使用@AfterReturning(切入点)用来表示目标方法执行完执行的操作(后置通知) 
28.    // @AfterReturning("anyMethod()") 
29.    @AfterReturning(pointcut = "anyMethod()", returning = "returnArg") 
30.    // 使用这个方法可以获取返回结果。即:在原来的切入点条件上加了另一个条件即:拦截方法的返回值类型是String类型 
31.    public void doAfterReturning(String returnArg) { 
32.        System.out.println("后置通知...拦截方法返回结查:" + returnArg); 
33.    } 
34. 
35.    // 使用@After(切入点)用来表示目标方法执行无论是否出现异常都执行的操作(最终通知) 
36.    @After("anyMethod()") 
37.    public void doFinally() { 
38.        System.out.println("最终通知..."); 
39.    } 
40. 
41.    // 使用@AfterThrowing(切入点)用来表示目标方法执行出现异常时执行的操作(例外通知) 
42.    // @AfterThrowing("anyMethod()") 
43.    @AfterThrowing(pointcut = "anyMethod()", throwing = "ex") 
44.    public void doException(Exception ex) { 
45.        System.out.println("例外通知...取获异常信息:" + ex); 
46.    } 
47. 
48. 
49.    // 使用@Around(切入点)用来表示整个通知(环绕通知:该方法必须接受一个org.aspectj.lang.ProceedingJoinPoint类型的参数) 
50.    @Around("anyMethod()") 
51.    public Object doAround(ProceedingJoinPoint pjp) throws Throwable { 
52.        System.out.println("环绕通知之前..."); 
53.        Object result = pjp.proceed(); 
54.        System.out.println("环绕通知之后..."); 
55.        return result; 
56.    } 
57. 
58.} 

在Spring的配置XML中打开对象上述注解的功能和向Spring容器中注册该目标对象

Xml代码 
1.<beans xmlns="http://www.springframework.org/schema/beans" 
2.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
3.    xmlns:aop="http://www.springframework.org/schema/aop" 
4.    xsi:schemaLocation="http://www.springframework.org/schema/beans 
5.           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
6.           http://www.springframework.org/schema/aop 
7.           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> 
8.    <!-- 基于注解方式的声明切面 --> 
9.    <aop:aspectj-autoproxy /> 
10.     
11.    <bean id="personService" 
12.        class="aop.annotation.service.imple.PersonServiceImple"> 
13.    </bean> 
14.    <bean id="myInterceptor" class="aop.annotation.aspect.MyInterceptor"></bean> 
15.     
16.</beans> 


测试:

Java代码 
1.public static void main(String[] args) { 
2.        ApplicationContext ctx = new ClassPathXmlApplicationContext("beansAOP.xml"); 
3.        PersonService personService = (PersonService) ctx.getBean("personService"); 
4.        //personService.save("小张");//执行参数 
5.        personService.getPersonName("mengya");//返回结果 
6.        //personService.deletePerson(123); 
7.    } 

2。首先基于XML配置的AOP使用:

目标对象接口:


Java代码 
1.public interface PersonService { 
2. 
3.    public abstract void save(String name); 
4. 
5.    public abstract String getPersonName(String personId); 
6. 
7.    public void deletePerson(Integer id); 
8.} 


目标对象:

Java代码 
1.public class PersonServiceImple implements PersonService { 
2. 
3.    public void save(String name) { 
4.        System.out 
5.                .println("aop.xml.service.imple.PersonServiceImple的save()方法"); 
6.        // throw new RuntimeException("手动引用的一个异常信息"); 
7.    } 
8.    public String getPersonName(String personId) { 
9.//      throw new RuntimeException("手动抛出的异常信息...."); 
10.        return "http://zmx.iteye.com"; 
11.         
12.    } 
13.    public void deletePerson(Integer id){ 
14.        throw new RuntimeException("手动抛出的异常信息...."); 
15.    } 
16.} 

Spring的切面对象:

Java代码 
1.public class MyInterceptor { 
2. 
3.    public void doBefore() { 
4.        System.out.println("前置通知..."); 
5.    } 
6. 
7.    public void doAfterReturning(String returnArg) { 
8.        System.out.println("后置通知...拦截方法返回结查:" + returnArg); 
9.    } 
10. 
11.    public void doFinally() { 
12.        System.out.println("最终通知..."); 
13.    } 
14. 
15.    public void doException(Exception ex) { 
16.        System.out.println("例外通知...取获异常信息:" + ex); 
17.    } 
18. 
19.    public Object doAround(ProceedingJoinPoint pjp) throws Throwable { 
20.        System.out.println("环绕通知之前..."); 
21.        Object[] args = pjp.getArgs(); 
22.        for (int i = 0; i < args.length; i++) { 
23.            System.out.println(args); 
24.        } 
25.        Object result = pjp.proceed(); 
26.        System.out.println("环绕通知之后..."); 
27.        return result; 
28.    } 
29. 
30.} 

在XML配置上述内容:

Xml代码 
1.<beans xmlns="http://www.springframework.org/schema/beans" 
2.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
3.    xmlns:aop="http://www.springframework.org/schema/aop" 
4.    xsi:schemaLocation="http://www.springframework.org/schema/beans 
5.           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
6.           http://www.springframework.org/schema/aop 
7.           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> 
8. 
9.    <bean id="personService" 
10.        class="aop.xml.service.imple.PersonServiceImple"> 
11.    </bean> 
12.     
13.    <bean id="myInterceptor" class="aop.xml.aspect.MyInterceptor"></bean> 
14.     
15.    <!-- AOP配置 --> 
16.    <aop:config> 
17.        <!-- 切面 --> 
18.        <aop:aspect id="myAspect" ref="myInterceptor"> 
19.            <aop:pointcut id="myAnyMethod" 
20.                expression="execution(* aop.xml.service.imple.*.*(..))" /> 
21.            <aop:before pointcut-ref="myAnyMethod" method="doBefore"/> 
22.            <aop:after-returning method="doAfterReturning" pointcut-ref="myAnyMethod" returning="returnArg"/> 
23.            <aop:after-throwing method="doException" pointcut-ref="myAnyMethod" throwing="ex"/> 
24.            <aop:after method="doFinally" pointcut-ref="myAnyMethod"/> 
25.            <aop:around method="doAround" pointcut-ref="myAnyMethod"/> 
26.        </aop:aspect> 
27.    </aop:config> 
28. 
29.</beans> 

测试:

Java代码 
1.public static void main(String[] args) { 
2.        ApplicationContext ctx = new ClassPathXmlApplicationContext( 
3.                "beansAOP2.xml"); 
4.        PersonService personService = (PersonService) ctx.getBean("personService"); 
5.//      personService.save("AOP"); 
6.        personService.getPersonName("123"); 
7.         
8.    } 
分享到:
评论

相关推荐

    基于xml的SpringAOP实例

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

    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 基于基于XML配置方式实现AOP

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

    spring aop jar 包

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

    Spring Aop使用实例

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

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

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

    注解方式实现AOP编程

    在Spring框架中,AOP的实现有两种主要方式:一种是基于XML配置,另一种是基于注解。本篇将主要讨论如何通过注解方式来实现AOP编程。 首先,我们需要了解Spring中的核心注解。`@Aspect`是定义一个切面的注解,通常会...

    基于XML/注解的AOP模拟银行账户

    实验主题涉及Spring AOP(面向切面编程)的两种实现方式——基于XML配置和基于注解的编程,用于模拟银行账户的存钱和取钱操作。AOP的主要目的是分离关注点,将业务逻辑与横切关注点(如日志、事务管理等)解耦。 一...

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

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

    JavaEE Spring AOP使用

    压缩包中的`SpringAOPTest`可能包含了一个Spring AOP的示例,包括了注解和XML配置的两种方式。通过分析这个测试案例,你可以了解如何在实际项目中实现AOP。例如,它可能包含了一个带有切面逻辑的切面类,使用了`@...

    Spring基于注解实现AOP

    在Java开发领域,Spring框架是不可或缺的一部分,尤其在企业级应用中广泛使用。Spring AOP(面向切面编程)提供了一种优雅的方式来处理系统中的横切关注点,如日志、事务管理等。本篇文章将深入探讨如何在Spring中...

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

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

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

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

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

    Spring Aop四个依赖的Jar包

    Spring AOP就是基于这些接口进行设计的,因此这个库是Spring AOP和其他AOP实现之间协作的基础。 在实际使用中,我们需要在项目的类路径下包含这些Jar包,并在Spring配置文件中启用AOP支持。例如,可以通过以下XML...

    SpringAop xml方式配置通知

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

Global site tag (gtag.js) - Google Analytics