MyBook.java:
package cn.itcast.aop; import org.aspectj.lang.ProceedingJoinPoint; public class MyBook { public void before1(){ System.out.println("前置增强......"); } public void after1(){ System.out.println("后置增强..."); } //环绕通知 public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { //方法之前 System.out.println("方法之前......"); //执行被增强的方法 proceedingJoinPoint.proceed(); //方法之后 System.out.println("方法之后......"); } }2 在 resources 下创建 spring 核心配置文件 applicationContext.xml , 导入 aop 约束,并进行 aop 操作
<?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" xsi:schemaLocation=" http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here --> <!-- 1 配置对象 --> <bean></bean> <bean></bean> <!-- 配置 aop 操作 --> <aop:config> <!-- 2.1 配置切入点 --> <aop:pointcut expression="execution(* cn.itcast.aop.Book.*(..))"/> <!-- 2.2 配置切面,把增强用到方法上面 --> <aop:aspect ref="myBook"> <!-- 配置增强类型。method: 增强类里面使用哪个方法作为前置 --> <aop:before method="before1" pointcut-ref="pointcut1"/> <aop:after-returning method="after1" pointcut-ref="pointcut1"/> <aop:around method="around" pointcut-ref="pointcut1"/> </aop:aspect> </aop:config> </beans>这里说一下表达式配置切入点的常用表达式:
execution(<访问修饰符>?<返回类型><方法名><(参数>)<异常>)
具体到某个方法:execution(* cn.itcast.aop.Book.add(..))
匹配类下面的所有方法:execution(* cn.itcast.Book.*(..))
匹配全部:execution(* *.*(..))
匹配所有 save 开头的方法:execution(* cn.itcast.Book.save*(..))
创建测试文件 TestAop.java, 查看 Book.java 中的 add() 方法是否被增强了:
package cn.itcast.aop; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestAop { @Test public void testBook(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicatioinContext.xml"); Book book = (Book) context.getBean("book"); book.add(); } }运行测试文件,控制台输出信息: