Spring笔记之Spring的AOP支持_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Spring笔记之Spring的AOP支持

Spring笔记之Spring的AOP支持

 2015/3/16 6:40:26  zhaojian0910  程序员俱乐部  我要评论(0)
  • 摘要:纵观AOP编程,其中需要程序员参与的只有3个部分:定义普通业务组件定义切入点:一个切入点可能横切多个业务组件定义增强处理:增强处理就是在AOP框架为普通业务组件织入的处理动作代理对象的方法=被代理对象的方法+增强处理下面记录一下,Spring中的AOP配置<?xmlversion="1.0"encoding="UTF-8"?><beans......xmlns:aop="http://www.springframework.org/schema/aop"xsi
  • 标签:笔记 Spring

纵观AOP编程,其中需要程序员参与的只有3个部分:

  • 定义普通业务组件
  • 定义切入点:一个切入点可能横切多个业务组件
  • 定义增强处理:增强处理就是在AOP框架为普通业务组件织入的处理动作

代理对象的方法 = 被代理对象的方法 + 增强处理

?

下面记录一下,Spring中的AOP配置

class="xml"><?xml version="1.0" encoding="UTF-8"?>
<beans ......
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="......
			http://www.springframework.org/schema/aop
			http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
	
	<!-- 启动@AspectJ支持 -->
	<aop:aspectj-autoproxy/>
	
	<!-- 如果不打算用Spring的XML Schema配置方式,则应该在Spring配置文件中增加如下片段来启用@AspectJ支持 -->
	<!--<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>-->
	
</beans>

?为了在Spring应用中启动@AspectJ支持,还需要在应用的类路径中增加两个AspectJ库:aspectjweaver.jar和aspectjrt.jar,字节使用AspectJ安装路径的lib目录下的两个JAR文件即可。

?

1、定义切面Bean

使用@AspectJ标注一个Java类,该Java类将会作为切面Bean

2、定义Before增强处理

package com.zhao.aopdemo;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;


@Aspect
public class BeforeAdviceTest {

	@Before("execution(* com.zhao.aopdemo.*.say*(..))")
	public void beforeSay()
	{
		System.out.println("Before say...");
	}
}

?

// Before注解

@Before("execution(* com.zhao.aopdemo.*.say*(..))")

解释:com.zhao.aopdemo包下面所有类中的以say开头的方法

3、定义AfterReturning增强处理

package com.zhao.aopdemo;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class AfterReturningAdviceTest {

	@AfterReturning(returning = "word", pointcut = "execution(* com.zhao.aopdemo.*.say*(..))")
	public void afterReturningSay(Object word) {
		System.out.println("After Returning say..." + word);
	}
}

?使用@AfterReturning 的时候,指定了一个returning的属性,该属性值为word,这表明允许在增强处理方法afterReturningSay中使用名为word的形参,该形参代表目标发那个发的返回值。

4、AfterThrowing增强处理

package com.zhao.aopdemo;

import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class AfterThrowingTest {
	@AfterThrowing(throwing = "ex", pointcut = "execution(* com.zhao.aopdemo.*.say*(..))")
	public void afterThrowingSay(Throwable ex) {
		System.out.println("目标类抛出的异常:" + ex);
	}
}

?输出:

Before say...

目标类抛出的异常:java.lang.ArithmeticException: / by zero

Exception in thread "main" java.lang.ArithmeticException: / by zero

at com.zhao.aopdemo.Chinese.sayThrowable(Chinese.java:21)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

......

主程序依然结束了

这里monospace; font-size: 1em; line-height: 1.5; background-color: #fafafa;">afterThrowingSay方法的形参类型如果换成NullPointerException异常,该切入点就只匹配NullPointerException异常

?

5、After增强处理

Spring还提供了一个After增强处理,它与AfterReturning增强处理有点相似,但是也有区别

  • AfterReturning增强处理只有在目标方法成功完成后才会被织入
  • After增强处理不管目标方法如何结束(包括成功完成和遇到异常终止两种情况),它都会被织入

6、Around增强处理

未完待续...

上一篇: ASP.NET使用FileUpload上传文件 下一篇: 没有下一篇了!
发表评论
用户名: 匿名