@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块的作用------无论如何,它总会在方法执行结束之后被织入,因此特别适用于进行资源回收。