现在的位置: 首页 > 综合 > 正文

基于Annotation的Spring AOP: @After

2013年10月03日 ⁄ 综合 ⁄ 共 2079字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.