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(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组件,它提供了一种在不修改源代码的情况下,通过代理模式来实现横切关注点(如日志、事务管理等)的...
1、编写切面类,包含权限审核方法和日志记录方法,这两个方法将来会织入到...5、编写案例,运用Spring AOP技术,要求包含前置通知、后置通知、环绕通知、返回通知、异常返回通知。请掌握这五种通知的特点,及应用场景
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...
Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...
总之,Spring AOP通过代理技术实现了面向切面编程,使得开发者能够更专注于业务逻辑,而将通用的横切关注点剥离出来,提高了代码的可读性和可维护性。通过深入理解Spring AOP的实现机制,我们可以更好地利用这一强大...
何谓Spring AOP? Spring AOP 是基于 AOP 编程模式的一个框架,它的...课程从Spring AOP概念开始引入,通过Spring AOP代理和判断模式进行,宝库各种模式,不断的深入学习,相信会给同学们带来不一样的Spring AOP技术
《Java进阶之Spring AOP源码深度剖析》是一份深度探讨Spring AOP技术的资料,共计17页。这份文档旨在帮助Java开发者更深入地理解Spring AOP的原理和实现,从而提升在实际开发中的应用能力。Spring AOP作为Spring框架...
5. **代理(Proxy)**:Spring AOP 使用动态代理技术创建对象,有两种代理方式:JDK 动态代理和 CGLIB 代理。前者适用于接口实现类,后者适用于没有接口的类。 6. **注解使用**:如 @Aspect、@Before、@After、@...
动态代理是实现AOP的一种常用技术,它允许在运行时创建代理对象,拦截对真实对象的调用,并在调用前后添加额外的行为。 在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的...
- Spring AOP的实现涉及到反射、动态代理、代理模式等多个核心Java技术。 - `org.springframework.aop.framework.ProxyFactoryBean` 和 `org.springframework.aop.framework.JdkDynamicAopProxy` 是动态代理的关键...
下面我们将深入探讨Spring AOP的底层实现技术和相关知识点。 1. **代理模式** Spring AOP基于两种代理机制实现:JDK动态代理和CGLIB代理。JDK动态代理适用于实现了接口的目标对象,通过反射机制创建一个代理类来...
描述中,“小马哥讲 Spring AOP 编程思想”表明这是由一位专家小马哥讲解的内容,虽然没有提供更多关于小马哥的信息,但可以合理推断他应该是一位经验丰富的开发者或者技术讲师。 在内容部分列出的诸多术语中,可以...
Spring AOP,全称为Aspect Oriented Programming,是Spring框架中的一个重要模块,主要负责处理系统中的...文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从基础概念到进阶实践的详细讲解。
动态代理则是Spring AOP实现的核心技术之一,它允许我们在运行时创建具有额外行为的对象。下面将详细阐述Spring AOP的配置以及动态代理的实现。 一、Spring AOP基础知识 1. **什么是AOP**:AOP是一种编程范式,...
Spring AOP,即Spring的面向切面编程,是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下对程序进行功能增强的技术。在Java应用程序中,AOP主要用于日志记录、性能统计、安全控制、事务管理等...
为了解决这一问题,可以利用Spring框架中的AOP(Aspect Oriented Programming,面向切面编程)技术来实现。 #### 二、Spring AOP 概述 Spring AOP 是Spring框架提供的一种实现AOP的方法。通过AOP,开发者可以在不...
- **SpringAOP.avi**:可能是一个视频教程,详细讲解了Spring AOP的概念和实践。 - **SpringAOP.doc**:可能是文档教程,包含了详细的步骤和示例代码。 - **SpringAOP_src.rar**:源代码示例,供你参考和实践。 - **...