Eclipse创建AOP

1. 创建项目

1.1 创建动态页面

在Eclipse中创建Dynamic Web Project

微信图片_20240529235826.png

一直点击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 文件。

1717141114586.png

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() {
// TODO Auto-generated method stub
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 测试截图

1717141778462.png

1717141790972.png

4.3 项目结构截图

1717141850400.png

5. 总结

由其中的测试方法可以得知,其中不报错的的执行顺序是:

环绕前置通知 => 前置通知 => 方法体 => 环绕后置通知 => 最终通知 => 后置通知

1717141877733.png