`

Spring基础:AOP编程(5)

阅读更多
基于Schema的AOP编程
基于AspectJ的AOP编程已经可以满足我们的编程需要,为什么这里还要做一套基于Schema的逻辑呢,这里有两个理由:
1.Java语言直到5.0才支持注解功能,所以在5.0之前的版本如果也想体验到AspectJ的便利,就需要使用特殊的方法。
2.AspectJ无法针对切面Advisor编程,但是Schema可以。

前置增强:
public class AdviceMethods {
    public void preGreeting() {
        System.out.println("--how are you--");
    }
}

<bean id="naiveWaiter" class="com.firethewhole.maventest08.NaiveWaiter"/>
<bean id="naughtyWaiter" class="com.firethewhole.maventest08.NaughtyWaiter"/>
<bean id="adviceMethods" class="com.firethewhole.maventest08.schema.AdviceMethods"/>
<bean id="smartSeller" class="com.firethewhole.maventest08.SmartSeller"/>
<aop:config proxy-target-class="true">
    <aop:aspect ref="adviceMethods">
        <aop:pointcut expression="target(com.firethewhole.maventest08.NaiveWaiter) and execution(* greetTo(..))" id="greetToPointcut"/>
        <aop:before method="preGreeting" pointcut-ref="greetToPointcut"/>
    </aop:aspect>
</aop:config>

测试代码:
public class SchemaProxyTest {
    public static void main(String[] args) {
        String configLocation = "com/firethewhole/maventest08/schema/beans.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocation);
        Waiter naiveWaiter = (Waiter) ctx.getBean("naiveWaiter");
        Waiter naughtyWaiter = (Waiter) ctx.getBean("naughtyWaiter");
        naiveWaiter.greetTo("John");
        naughtyWaiter.greetTo("John");
    }
}

输出:

--how are you--
NaiveWaiter.greet to John
NaughtyWaiter: greet to John

我们并没有使用注解或者AspectJ的相关功能,只是在XML配置类相关的Bean和<aop:config>,也达到了相同的效果。

后置增强:
<aop:after-returning method="afterReturning" pointcut="target(com.firethewhole.maventest08.SmartSeller)" returning="retVal"/>

可以看到我们依然可以在配置文件中绑定返回值。

环绕增强:
<aop:around method="aroundMethod" pointcut="execution(* serveTo(..)) and target(com.firethewhole.maventest08.Waiter)"/>

环绕增强可以绑定连接点信息
public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
    System.out.println("开始进入方法:" + pjp.getTarget().getClass());
    System.out.println("参数为:" + pjp.getArgs()[0]);
    pjp.proceed();
    System.out.println("开始退出方法:" + pjp.getTarget().getClass());
}


抛出异常增强:
<aop:after-throwing method="afterThrowingMethod" pointcut="execution(* checkBill(..)) and target(com.firethewhole.maventest08.SmartSeller)" throwing="iae"/>

public void afterThrowingMethod(IllegalArgumentException iae) {
    System.out.println("抛出异常:" + iae.getMessage());
}

这里绑定类异常信息。

Final增强:
<aop:after method="afterMethod" pointcut="execution(* com..*.Waiter.greetTo(..))"/>

无论是否有异常都会执行。

引介增强:
<aop:declare-parents types-matching="com.firethewhole.maventest08.Waiter+" implement-interface="com.firethewhole.maventest08.Seller" default-impl="com.firethewhole.maventest08.SmartSeller"/>


增强绑定参数:
<aop:before method="bindParams" pointcut="target(com.firethewhole.maventest08.NaiveWaiter) and args(name,num,..)"/>

public void bindParams(int num, String name) {
    System.out.println("-----bindParams-----");
    System.out.println("name:" + name);
    System.out.println("num:" + num);
    System.out.println("-----bindParams-----");
}

public class SchemaProxyTest {
    public static void main(String[] args) {
        String configLocation = "com/firethewhole/maventest08/schema/beans.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocation);
        Waiter naiveWaiter = (Waiter) ctx.getBean("naiveWaiter");
        ((NaiveWaiter)naiveWaiter).smile("John", 2);
    }
}

输出:

-----bindParams-----
name:John
num:2
-----bindParams-----
NaiveWaiter.smile to John 2 times
分享到:
评论

相关推荐

    Spring基础:AOP编程(4)

    在本篇博客“Spring基础:AOP编程(4)”中,我们将深入探讨Spring框架中的面向切面编程(Aspect-Oriented Programming,简称AOP),这是一个强大的功能,它允许我们在不修改原有业务代码的情况下,实现对系统中横切...

    Spring基础:AOP编程(1)

    这篇博客“Spring基础:AOP编程(1)”可能介绍了AOP的基础知识及其在Spring中的实现。 面向切面编程(AOP)是一种编程范式,旨在减少代码的重复性,提高模块间的解耦度。AOP通过将横切关注点(如日志、事务管理、...

    Spring基础:AOP编程(2)

    在本篇关于“Spring基础:AOP编程(2)”的文章中,我们将深入探讨Spring框架中的面向切面编程(Aspect-Oriented Programming, AOP),这是一种强大的设计模式,它允许我们分离关注点,尤其是那些横切关注点,如日志、...

    Spring基础:AOP编程(3)

    **Spring AOP编程详解** 在Java开发中,Spring框架因其强大的功能和易用性而备受推崇,其中AOP(Aspect-Oriented Programming,面向切面编程)是其核心特性之一。AOP允许开发者将关注点从核心业务逻辑中分离出来,...

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

    Spring AOP是在Spring框架的基础上实现的一种面向方面编程机制。 1. **方面(Aspect)**:这是AOP的核心概念之一,指代一个关注点的模块化,该关注点可能会横切多个对象。例如事务管理就是一个典型的横切关注点,...

    Spring基础:Spring AOP简单使用

    Spring AOP,全称Aspect Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它扩展了传统的面向对象编程(OOP),使得开发者能够更好地处理系统中的横切关注点,如日志、事务管理、权限控制等。...

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

    在讨论Spring AOP(面向切面编程)时,首先需要理解几个核心概念。Spring AOP 是Spring框架提供的一个功能模块,它允许开发者将横切关注点(cross-cutting concerns)从业务逻辑中解耦出来,通过在方法调用前后进行...

    hualinux spring 3.15:Spring AOP.pdf

    根据提供的文件内容,可以提取出以下知识点: ...文档中提到的实践示例,例如前置通知、后置通知、返回通知、异常通知和环绕通知的具体编码实现,都是通过具体的代码示例来说明如何在Spring中应用AspectJ进行AOP编程。

    spring-boot aop

    Spring Boot AOP(面向切面编程)是一种强大的设计模式,它允许我们在不修改现有代码的情况下,插入额外的功能或监控代码。在Spring框架中,AOP主要用于日志记录、事务管理、性能统计等场景。本示例是关于如何在...

    spring AOP切面编程

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它扩展了传统的面向对象编程,使得开发者可以方便地实现横切关注点,如日志、事务管理、性能监控等。在Spring中,AOP通过代理...

    spring源代码分析:aop的实现

    其中,面向切面编程(Aspect Oriented Programming,简称AOP)是Spring的重要特性之一,它极大地简化了代码中的横切关注点,如日志、事务管理等。本文将深入Spring源码,探索AOP的实现原理。 首先,我们需要理解AOP...

    AOP_使用spring框架进行面向切面编程

    面向切面编程(AOP)是一种编程范式,它旨在减少代码中的重复部分,特别是那些与核心业务逻辑无关但又必须处理...同时,通过分析和操作`springAOP`压缩包中的示例代码,可以更直观地了解AOP在Spring框架中的具体实现。

    Spring中aop编程所需要的jar包

    为了在Spring中进行AOP编程,我们需要一些特定的JAR包。以下是对这些关键组件的详细说明: 1. **Spring核心包**: - `spring-core.jar`: 这是Spring框架的基础,包含了IoC(Inversion of Control,控制反转)容器...

    Spring切面AOP编程的简单模拟实现

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从核心业务逻辑中分离出来,例如日志记录、事务管理等。本教程将通过模拟Spring AOP来阐述如何实现一个简单的切面编程。我们将讨论...

    spring-aop-jar

    在IT领域,Spring框架是一个广泛使用的Java应用框架,它提供了许多功能,包括依赖注入、面向切面编程(AOP)等。"spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨...

    使用动态代理演示Spring的AOP编程原理

    为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...

    spring aop 编程所需要的搜友JAR包

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的核心概念是切面(Aspect)、通知(Advice)、连接点...

    Spring4—AOP编程

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要特性,主要用于解决程序中的横切关注点,如日志、事务管理、安全性等。AOP通过将这些关注点与核心业务逻辑分离,实现了代码的...

Global site tag (gtag.js) - Google Analytics