`

Spring AOP技术

阅读更多
spring AOP技术


6.通知应用实例(基于注解)

在前一节,我们应用了前置通知和后置通知,除了这两个通知外,下面接着演示其它通知的应用。

(1)最终通知

在切面类TheInterceptor中增加如下代码即可:略去测试。
@After("anyMethod()")// 最终通知

    public void after() {

    System.out.println("最终通知");

}

(2)异常通知

为了演示此实例,我们在UseDaoImp中增加如下代码以抛出异常:

int i=1/0;在然后在切面类TheInterceptor中增加如下代码:
@AfterThrowing("anyMethod()")   // 例外通知

public void AfterThrowing() {

    System.out.println("例外通知");

}
当获取代理对象并调用save方法时会抛出异常,例外通知便会得以执行。

(3)环绕通知

@Around("anyMethod()") //环绕通知

public Object around(ProceedingJoinPoint pjp) throws Throwable {

    System.out.println("进入环绕");

    //if(){    // 进行一些判断,再执行环绕

    Object result = pjp.proceed();

    //}

    System.out.println("退出环绕");

    return result;

}
注意的是方法的参数及抛出异常类型的固定写法(方法名可以是任意得),另在该方法中必须执行pjp.proceed()才能让环绕通知中的两处打印代码得以执行。即是说要想环绕通知的拦截处理代码起作用必须调用pjp.proceed方法。 补充:环绕通知通常可以用来测试方法的执行时间,在pjp.proceed前获取一个时间,在pjp.proceed方法后再获取一个时间。最后两个时间相减即可得方法执行时间。

(4)传递参数给通知

首先在UseDao接口中增加如下代码:
String add(String name);
然后再在UserDaoImp中实现此方法,代码如下:
public String add(String name) {

    System.out.println("add method is called [ " + name+" ]");

    return "添加成功";

}
需求:获取调用add方法传递的参数。操作步骤如下:在切面类增加如下代码:
@Before("anyMethod() && args(name)")// 前置通知,只针对UseDaoImp的add方法

public void beforeAdd(String name) {

    System.out.println("前置通知:" + name);

}
说明:在前置通知的方法中有一个参数,然后再把此参数作为拦截条件(即是说拦截带有一个String类型参数的方法)。args的名字和beforeAdd方法参数名字相同。
测试代码:
public void advieeTest() {

    ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");

    UserDao ud=(UserDao) ctx.getBean("userDaoImp");

    ud.add("xxx");

}

(5)获取方法的返回值

我们知道add方法有一个返回值,我们对此方法进行拦截并获取返回值,在切面类中增加如下代码:
@AfterReturning(pointcut = "anyMethod()", returning = "result")

// 后置通知,监听返回结果,针对UserDaoImp的getUsername()方法

public void afterReturningRes(String result) {

    System.out.println("后置通知,返回结果:" + result);

}
说明:afterReturningRes方法的参数就是要返回的参数类型,returning标记的就是的结果,它的取值与该方法参数名相同。  测试代码同(4)。

(6)获取抛出的异常

切面类的增加如下代码:

@AfterThrowing(pointcut="anyMethod",throwing="e")

public void catchException(Exception e){

    System.out.println("获取抛出的异常:"+e);

}
throwing的取值和方法的参数名相同,测试代码省略。

7. 通知应用实例(基于XML)

步骤一、复制TheInterceptorX类为TheInterceptorXML,并去掉所有注解。

步骤二、建立beansXML.xml配置文件,内容如下:
<aop:aspectj-autoproxy /><!-- 开启切面编程功能 -->

<bean id="userDaoImp" class="com.asm.dao.impl.UserDaoImp" />

<bean id="aspectBean"

    class="com.asm.dao.impl.factory.TheInterceptorXML" />

<aop:config>

<aop:aspect id="asp" ref="aspectBean">     --声明一个切面类

       <aop:pointcut id="thecut"                 --声明一个切入点

       expression="execution(* com.asm.dao.impl.UserDaoImp.*(..))" />

       <aop:after-returning pointcut-ref="thecut" method="afterReturningRes" returning="result" />

       <aop:around pointcut-ref="thecut" method="around"/>

       <aop:after-throwing pointcut-ref="thecut" method="catchException" throwing="e"/>                

       <aop:after pointcut-ref="thecut" method="after" />

       <aop:before pointcut-ref="thecut" method="before" />

    </aop:aspect>

</aop:config>

测试代码如下:
public void advieeTest() {

       ApplicationContext ctx = new ClassPathXmlApplicationContext("beansXML.xml");

       UserDao ud=(UserDao) ctx.getBean("userDaoImp");

       ud.add("xxx");     

}
未解决问题:不能成功传参给前置通知。

8.解析切入点表达式

1.格式:execution(返回值 空格 方法选择)。两部分组成,中间一定要有空格。
返回值:可以是*,说明拦截任何方法。Java.lang.String(全名),拦截返回值为String类型的方法。 常用的实例如下:

方法选择:包名[类名].*()。设定要拦截的方法签名。

表达式(省略execution)


说明

(java.lang.String 方法选择略)


拦截返回值为String类型的方法

(!void  方法选择略)


拦截返回值非空的方法

(* com.asm..*.*(..))


拦截com.asm包及子包下每个类的全部方法

(* com.asm.*.*(..))


拦截com.asm包下每个类的全部方法

(* com.asm.User.*(..))


拦截asm包下User类的所有方法

(* com.asm.User.*
(java.lang.String,..))


拦截User类中第一个参数为String,后面参数任一的方法

待增加




待增加




9.总结

面向切面的常见应用(如权限拦截)、spring的aop依赖两种方式实现代理(依被代理的对象是否实现接口而定)、通知概念、基于注解与基于XML两种方式来配置切面、基本步骤(依要拦截的方法来设定切入点,依据业务需求实现拦截通知代码,切面纳入spring容器管理,要被监控的类只能是通过Spring容器获取)、切入点的格式。
分享到:
评论

相关推荐

    模拟spring aop技术

    **模拟Spring AOP技术** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组件,它提供了一种在不修改源代码的情况下,通过代理模式来实现横切关注点(如日志、事务管理等)的...

    Spring AOP运用Spring AOP技术,要求包含前置通知、后置通知、环绕通知、返回通知、异常返回通知。

    1、编写切面类,包含权限审核方法和日志记录方法,这两个方法将来会织入到...5、编写案例,运用Spring AOP技术,要求包含前置通知、后置通知、环绕通知、返回通知、异常返回通知。请掌握这五种通知的特点,及应用场景

    spring aop jar 包

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...

    Spring AOP实现机制

    总之,Spring AOP通过代理技术实现了面向切面编程,使得开发者能够更专注于业务逻辑,而将通用的横切关注点剥离出来,提高了代码的可读性和可维护性。通过深入理解Spring AOP的实现机制,我们可以更好地利用这一强大...

    进击的编程思想!带你学Spring AOP核心编程思想教程 新角度学面向切面编程

    何谓Spring AOP? Spring AOP 是基于 AOP 编程模式的一个框架,它的...课程从Spring AOP概念开始引入,通过Spring AOP代理和判断模式进行,宝库各种模式,不断的深入学习,相信会给同学们带来不一样的Spring AOP技术

    Java进阶之SpringAOP源码深度剖析共17页.pd

    《Java进阶之Spring AOP源码深度剖析》是一份深度探讨Spring AOP技术的资料,共计17页。这份文档旨在帮助Java开发者更深入地理解Spring AOP的原理和实现,从而提升在实际开发中的应用能力。Spring AOP作为Spring框架...

    spring AOP 引入jar包,spring IOC 引入Jar包

    5. **代理(Proxy)**:Spring AOP 使用动态代理技术创建对象,有两种代理方式:JDK 动态代理和 CGLIB 代理。前者适用于接口实现类,后者适用于没有接口的类。 6. **注解使用**:如 @Aspect、@Before、@After、@...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    动态代理是实现AOP的一种常用技术,它允许在运行时创建代理对象,拦截对真实对象的调用,并在调用前后添加额外的行为。 在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的...

    spring aop 学习笔记

    - Spring AOP的实现涉及到反射、动态代理、代理模式等多个核心Java技术。 - `org.springframework.aop.framework.ProxyFactoryBean` 和 `org.springframework.aop.framework.JdkDynamicAopProxy` 是动态代理的关键...

    Spring AOP的底层实现技术

    下面我们将深入探讨Spring AOP的底层实现技术和相关知识点。 1. **代理模式** Spring AOP基于两种代理机制实现:JDK动态代理和CGLIB代理。JDK动态代理适用于实现了接口的目标对象,通过反射机制创建一个代理类来...

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

    描述中,“小马哥讲 Spring AOP 编程思想”表明这是由一位专家小马哥讲解的内容,虽然没有提供更多关于小马哥的信息,但可以合理推断他应该是一位经验丰富的开发者或者技术讲师。 在内容部分列出的诸多术语中,可以...

    SpringAOP.zip

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

    springAOP配置动态代理实现

    动态代理则是Spring AOP实现的核心技术之一,它允许我们在运行时创建具有额外行为的对象。下面将详细阐述Spring AOP的配置以及动态代理的实现。 一、Spring AOP基础知识 1. **什么是AOP**:AOP是一种编程范式,...

    spring aop所需jar包

    Spring AOP,即Spring的面向切面编程,是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下对程序进行功能增强的技术。在Java应用程序中,AOP主要用于日志记录、性能统计、安全控制、事务管理等...

    spring aop切面拦截指定类和方法实现流程日志跟踪

    为了解决这一问题,可以利用Spring框架中的AOP(Aspect Oriented Programming,面向切面编程)技术来实现。 #### 二、Spring AOP 概述 Spring AOP 是Spring框架提供的一种实现AOP的方法。通过AOP,开发者可以在不...

    spring AOP入门教程

    - **SpringAOP.avi**:可能是一个视频教程,详细讲解了Spring AOP的概念和实践。 - **SpringAOP.doc**:可能是文档教程,包含了详细的步骤和示例代码。 - **SpringAOP_src.rar**:源代码示例,供你参考和实践。 - **...

Global site tag (gtag.js) - Google Analytics