Aop 能做什么?

日志记录,性能统计,安全控制,事务处理等方面,实现公共功能 性的重复使用。

Aop 带来的好处


  1. 降低模块与模块之间的耦合度,提高业务代码的聚合度。(高内聚低耦合)
  2. 提高了代码的复用性。
  3. 提高系统的扩展性。

1.Joinpoint(连接点)

被拦截到的每个点,spring 中指被拦截到的每一个方法,spring aop 一个连接点即代表一个方法的执行。

2.Pointcut(切入点)

对连接点进行拦截的定义(匹配规则定义 规定拦截哪些方法,对哪些方 法进行处理),spring 这块有专门的表达式语言定义。

3. Advice(通知)

拦截到每一个连接点即(每一个方法)后所要做的操作

i. 前置通知 (前置增强) --before() 执行方法前通知

ii.返回通知(返回增强)–afterReturn 方法正常结束返回后的通知

iii.异常抛出通知(异常抛出增强)–afetrThrow()

iv.最终通知—after 无论方法是否发生异常,均会执行该通知。

v.环绕通知—around 包围一个连接点(join point)的通知,如方法调用。这是最 强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择 是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。

4. Aspect(切面)

切入点与通知的结合,决定了切面的定义,切入点定义了要拦截哪些类的 哪些方法,通知则定义了拦截过方法后要做什么,切面则是横切关注点的抽象, 与类相似,类是对物体特征的抽象,切面则是横切关注点抽象。

5. Target(目标对象)

被代理的目标对象

6. Weave(织入)

将切面应用到目标对象并生成代理对象的这个过程即为织入。

7. Introduction(引入)

在不修改原有应用程序代码的情况下,在程序运行期为类动态添加方法或 者字段的过程称为引入

借助模拟用户登录实现拦截

加入依赖的坐标

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.sxt</groupId>
<artifactId>Spring</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>Spring01</module>
<module>Spring02</module>
<module>Spring03</module>
<module>Spring04</module>
<module>Spring05</module>
<module>Spring06</module>
<module>Spring07</module>
</modules>

<name>Spring</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>


<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3</version>
</dependency>


<!--
加入aop 坐标
-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>


</dependencies>

<build>
</build>
</project>

添加命名空间

xmlns:aop="http://www.springframework.org/schema/aop" 
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd

配置aop代理

<aop:aspectj-autoproxy/>