Spring的AOP(Aspect Oriented Programming)是一种面向切面编程的技术,通过预编译方式和运行期动态代理实现程序功能的统一维护。它是OOP(面向对象编程)的延续,主要利用代理模式实现程序功能的增强。AOP可以帮助开发者把业务流程中的通用功能抽取出来,单独编写功能代码。在程序运行时,Spring框架会根据业务流程要求,自动把独立编写的功能代码切入到流程的合适位置。AOP可以降低业务逻辑各部分之间的耦合度,提高程序的可重用性和开发效率。Spring AOP底层是通过动态代理技术实现的,可以根据不同的通知类型,在代理对象的对应位置织入相应的功能代码。
实现AOP主要有两种方式:
- 使用Spring的@AspectJ注解支持。在这种方式下,需要定义一个切面类,并使用@AspectJ注解进行修饰。在这个切面类中,需要定义切点以及通知(前置通知、后置通知、返回后通知、异常通知)。
- 使用Spring的代理工厂Bean实现。在这种方式下,需要定义一个接口,并实现该接口的目标类。然后,需要定义一个切面类,并实现MethodInterceptor接口。在这个切面类中,需要重写invoke方法,并在这个方法中定义切点以及通知。
以下是一个简单的使用Spring的@AspectJ注解支持实现AOP的例子:
- 定义一个接口
- 实现该接口的目标类
- 定义一个切面类,并使用@AspectJ注解进行修饰
这段代码定义了两个AOP的通知,一个前置通知(@Before)和一个后置通知(@AfterReturning)。
前置通知会在目标方法执行之前执行。@Before注解表示这是一个前置通知,value属性中的值是一个切点表达式,表示这个通知会被应用到哪些方法上。这里的切点表达式execution(public void *(..))表示匹配所有public的void方法,无论方法名是什么,无论在哪个类中,无论参数列表是什么。
后置通知会在目标方法正常返回之后执行。@AfterReturning注解表示这是一个后置通知。这里的切点表达式execution(* com.lexed.service..*(..))表示匹配com.lexed.service包及其子包下的所有方法,无论方法名是什么,无论返回类型是什么,无论参数列表是什么。
- 配置Spring的配置文件,指定切面类和切点
5.创建测试类,测试一下
以下是一些常见的切点表达式
使用切点表达式时,需要注意以下几点:
- 切点表达式的语法必须正确,否则会导致切点匹配失败或者出现意外的结果。
- 在定义切点表达式时,需要考虑到方法的返回类型、类名、方法名和方法参数等,以确保精确地匹配需要应用切面逻辑的方法。
- 如果使用通配符,需要根据具体情况合理使用,以确保匹配的范围符合预期,避免出现意外的匹配结果。
- 在使用切点表达式时,需要注意性能问题,尽量避免使用过于复杂的表达式,以免对系统性能造成过大的影响。