Spring AOP的概述和简单应用

1.AOP概述

  1. AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充.
  2. AOP 的主要编程对象是切面(aspect), 而切面模块化横切关注点.
  3. 在应用 AOP 编程时, 仍然需要定义公共功能, 但可以明确的定义这个功能在哪里, 以什么方式应用, 并且不必修改受影响的类. 这样一来横切关注点就被模块化到特殊的对象(切面)里.
  4. AOP 的好处:

                    ~每个事物逻辑位于一个位置, 代码不分散, 便于维护和升级

                    ~业务模块更简洁, 只包含核心业务代码.

 

2.AOP术语

  1. 切面(Aspect):  横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象
  2. 通知(Advice):  切面必须要完成的工作
  3. 目标(Target): 被通知的对象
  4. 代理(Proxy): 向目标对象应用通知之后创建的对象
  5. 连接点(Joinpoint):程序执行的某个特定位置:如类某个方法调用前、调用后、方法抛出异常后等。连接点由两个信息确定:方法表示的程序执行点;相对点表示的方位。例如 ArithmethicCalculator#add() 方法执行前的连接点,执行点为 ArithmethicCalculator#add(); 方位为该方法执行前的位置
  6. 切点(pointcut):每个类都拥有多个连接点:例如 ArithmethicCalculator 的所有方法实际上都是连接点,即连接点是程序类中客观存在的事务。AOP 通过切点定位到特定的连接点。类比:连接点相当于数据库中的记录,切点相当于查询条件。切点和连接点不是一对一的关系,一个切点匹配多个连接点,切点通过 org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。

3.AspectJ

简介

AspectJ:Java社区里最完整最流行的AOP框架。

在Spring2.0以上版本中,可以使用基于AspectJ注解或基于XML配置的AOP。

在Spring中启用AspectJ注解支持

①导入JAR包

●com.springsource.org.aopalliance-1.0.0.jar

●com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

●spring-aspects-4.0.0.RELEASE.jar

●com.springsource.net.sf.cglib-2.2.0.jar

②引入aop名称空间

Spring AOP的概述和简单应用

 

③配置

<aop:aspectj-autoproxy>

当Spring IOC容器侦测到bean配置文件中的<aop:aspectj-autoproxy>元素时,会自动为与AspectJ切面匹配的bean创建代理

 

用AspectJ注解声明切面

①要在Spring中声明AspectJ切面,只需要在IOC容器中将切面声明为bean实例。②当在Spring IOC容器中初始化AspectJ切面之后,Spring IOC容器就会为那些与 AspectJ切面相匹配的bean创建代理。

③在AspectJ注解中,切面只是一个带有@Aspect注解的Java类,它往往要包含很多通知。

④通知是标注有某种注解的简单的Java方法。

⑤AspectJ支持5种类型的通知注解:

[1]@Before:前置通知,在方法执行之前执行

[2]@After:后置通知,在方法执行之后执行

[3]@AfterRunning:返回通知,在方法返回结果之后执行

[4]@AfterThrowing:异常通知,在方法抛出异常之后执行

[5]@Around:环绕通知,围绕着方法执行

4.例子

实现一个计算器,有加法和减法。通过AOP在执行加法和减法之前打印一句话。

  1. 创建计算器接口和实现

Spring AOP的概述和简单应用

 

Spring AOP的概述和简单应用

@Component:把该类交给ioc容器来管理

2.创建切面类

Spring AOP的概述和简单应用

 

 

@Before:指定在什么方法之前执行。Value是切入点表达式

3.IOC容器

Spring AOP的概述和简单应用

4.测试

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.hanshiyu.Beans.Calculator;
import com.hanshiyu.Beans.CalculatorInterface;

class CalculatorTest {
	ApplicationContext ioc = new ClassPathXmlApplicationContext("ApplicationContext.xml");
	@Test
	void test() {
		int a = 10;
		int b = 3;
		CalculatorInterface cl = (CalculatorInterface) ioc.getBean("calculator");
		System.out.println(cl.add(a, b));
		System.out.println(cl.subtract(a, b));
	}

}

Spring AOP的概述和简单应用

 

需要导入的包:

Spring AOP的概述和简单应用