@After与@AfterReturning有点相似,但是也有区别:
① AfterReturning 增强处理只在目标方法成功完成后才会被织入。
② After 增强处理不管目标方法如何结束,包括成功完成和遇到异常终止两种情况,它都会被织入。
因为不论一个方法是如何结束的,After增强处理都会被织入,因此After增强处理必须准备处理正常返回和异常返回两种情况,这种增强处理通常用于释放资源。
Person.java :
public interface Person {
public String sayHello(String name);
public void divide();
}
Chinese.java :
@Component
public class Chinese implements Person {
@Override
public void divide() {
int a=5/0;
System.out.println("divide执行完成!");
}
@Override
public String sayHello(String name) {
try {
System.out.println("sayHello方法开始被执行...");
new FileInputStream("a.txt");
} catch (FileNotFoundException e) {
System.out.println("目标类的异常处理"+e.getMessage());
}
return name+" Hello,Spring AOP";
}
}
AfterAdviceTest.java :
/**
* 定义一个切面
* @author Administrator
*
*/
@Aspect
public class AfterAdviceTest {
@After("execution(* com.bean.*.*(..))")
public void realease(){
System.out.println("模拟方法结束后的释放资源...");
}
}
bean.xml :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<context:component-scan base-package="com.bean">
<context:include-filter type="annotation"
expression="org.aspectj.lang.annotation.Aspect"/>
</context:component-scan>
<aop:aspectj-autoproxy/>
</beans>
Test.java :
public class Test {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("bean.xml");
Person p=(Person) ctx.getBean("chinese");
System.out.println(p.sayHello("张三"));
p.divide();
}
}
运行控制台输出:
由此可见,After增强处理的作用类似于异常处理中的finally块的作用------无论如何,它总会在方法执行结束之后被织入,因此特别适用于进行资源回收。