1. 创建项目
1.1 创建动态页面
在Eclipse中创建Dynamic Web Project

一直点击Next创建好项目就可以
1.2 导入相关的jar包
在WEB-INF下的lib中导入Spring相关的jar包
将 spring-framework 中 libs 目录下的 JAR 类库复制到 Web 工程 WEB-INF/lib 目录下。复制时只需要复制XXX.RELEASE.jar 的文件。
由于 SpringAOP 依赖于 Apache Commons Logging 组件,所以还需要复制 commons-logging-1.2.jar 文件。

2. 项目配置
2.1 Bean.xml
在src目录下创建config文件夹,在其中创建Bean.xml文件,在其中配置Bean扫描和切面扫描:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?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" xsi:schemaLocation="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-4.3.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <context:component-scan base-package="tools.impl,aspect"/> <aop:aspectj-autoproxy proxy-target-class="true"/> </beans>
|
3. 项目编写
3.1 基类
在src目录下创建tools工具基类pen.java,基类使用抽象类
1 2 3 4 5 6
| package tools;
public interface pen { void write(); }
|
3.2 基类的实现类
在3.1 中创建的tools工具类中创建他的实现包impl,在impl中创建实现pencil.java,为其中添加Bean扫描描述Configuration
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package tools.impl;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;
import tools.pen; @Configuration public class pencil implements pen{
@Override public void write() { System.out.println("铅笔写字"); } }
|
3.3 切面
在不更改源代码的情况下,增加一个切面方法,在执行pencil中的方法时自动添加增强类中的执行方法;在src中创建一个aspect切面文件夹,在其中创建ToolUpkepp.java 方法增强,其中注解的详细内容可以查看之前aop中详细的注解注释。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| package aspect;
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.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component;
@Component @Aspect public class ToolUpkeep { @Pointcut("execution(* tools.impl.pencil.*(..))") public void pointCut(){ } @Before("pointCut()") public void advice() { System.out.println("拿出笔(前置)"); } @AfterReturning("pointCut()") public void after() { System.out.println("写字结束,写的非常好(后置)"); } @Around("pointCut()") public Object aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{ System.out.println("拿出铅笔盒(环绕前)"); Object object = proceedingJoinPoint.proceed(); System.out.println("放回笔(环绕后)"); return object; } @AfterThrowing(value = "pointCut()",throwing = "e") public void exceptionAdvice(Exception e){ System.out.println("异常通知,异常信息是:" + e.toString()); } @After("pointCut()") public void afterAdvice(){ System.out.println("放回文具盒(最终)"); } }
|
4. 项目测试
4.1 测试方法
在src目录下创建test测试文件夹,创建penTest.java测试类方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package test;
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
import tools.pen; import tools.impl.pencil;
public class penTest { @Test public void pencilTest() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("config/beans.xml"); pencil pen = applicationContext.getBean(pencil.class); pen.write(); } }
|
4.2 测试截图


4.3 项目结构截图

5. 总结
由其中的测试方法可以得知,其中不报错的的执行顺序是:
环绕前置通知 => 前置通知 => 方法体 => 环绕后置通知 => 最终通知 => 后置通知
