创建一个被增强类Book2:
package aopdemo;
import org.springframework.stereotype.Component;
@Component("book")
public class Book2 {
public void print(){
System.out.println("原方法");
}
}
创建增强类MyBook2:
package aopdemo;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Service;
@Service("mybook")
@Aspect//增强类
public class MyBook2 {
//在方法上使用注解完成增强配置
@Before(value="execution(* aopdemo.Book2.*(..))")
public void before1(){
System.out.println("前置增强");
}
@AfterReturning(value="execution(* aopdemo.Book2.print(..))")
public void after1(){
System.out.println("后置增强");
}
@Around(value="execution(* aopdemo.Book2.print(..))")
public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{//环绕增强
//方法之前
System.out.println("方法之前");
//执行被增强的方法
proceedingJoinPoint.proceed();
//方法之后
System.out.println("方法之后");
}
@AfterThrowing(value="execution(* aopdemo.Book2.print(..))")
public void exception(){
System.out.println("异常通知");
}
@After(value="execution(* aopdemo.Book2.print(..))")
public void after2(){
System.out.println("最终通知");
}
}
配置文件bean_aop2.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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" >
<!-- 开启aop操作 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!--开启注解 -->
<context:component-scan base-package="aopdemo"></context:component-scan>
</beans>
测试代码:
package aopdemo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test2 {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("bean_aop2.xml");
Book2 book=(Book2) context.getBean("book");
book.print();
}
}
结果
方法之前//Around(环绕增强)
前置增强//Before(前置增强)
原方法
方法之后//Around(环绕增强)
最终通知//After(最终增强)
后置增强//AfterReturning(后置增强)
注意:在配置文件中不仅要开启注解<context:component-scan base-package=“aopdemo”></context:component-scan>,还要开启AOP: <aop:aspectj-autoproxy</aop:aspectj-autoproxy>