配套视频:【编程不良人】快速入门Spring,SpringBoot、SpringCloud学不好完全是因为Spring没有掌握!_哔哩哔哩_bilibili
5.1 基本概念
AOP(Aspect Oriented Programming)编程:即 面向切面编程
其中:Aspect(切面)、Oriented(面向)、Programming(编程)
底层原理:java代理设计模式(动态代理)
好处:在保证原始业务逻辑不变的情况下,通过代理对象完成业务中的附加操作(如事务等),将业务中核心操作放在目标对象中执行,实现了附加操作和核心操作解耦。
基本概念:
-
通知(Advice):除了目标方法之外的操作都可以称之为通知,可理解为附加操作、额外功能,比如:事务通知、日志通知、性能通知......
-
切入点(Pointcut):将开发好的通知应用于项目中的哪些组件中的哪些方法,给方法加入通知,一般通知多用于业务层,例如:UserService
-
切面(Aspect)=通知(Advice)+切入点(Pointcut)

AOP面向切面编程实现可分为如下几步:
-
开发通知类(附加功能)---新建通知
-
配置切面点---指定通知位置
-
利用通知和切入点组装切面,对通知和切入点进行绑定
5.2 编程步骤
配套视频:【编程不良人】快速入门Spring,SpringBoot、SpringCloud学不好完全是因为Spring没有掌握!_哔哩哔哩_bilibili
# 1.引入AOP编程相关依赖
spring-aop
spring-expression
spring-aspects
# 2.开发通知类
MethodBeforeAdvice 前置通知
MethodInterceptor 环绕通知
AfterReturningAdvice 后置通知 / 返回后通知
ThrowsAdvice 异常通知
MyAdvice implements 通知接口{.....}
//自定义通知类:用来完成额外功能
//自定义记录业务方法名称前置通知,前置通知即目标方法执行之前先执行的额外操作
public class MyAdvice implements MethodBeforeAdvice {
@Override
//参数1:当前调用的方法对象
//参数2:当前调用方法对象的参数
//参数3:目标对象
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("目标方法名: "+method.getName());
System.out.println("目标方法的参数: "+args[0]);
System.out.println("目标对象: "+target.getClass());
}
}
# 3.配置切面
a.引入aop命名空间
<?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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
b.注册通知类
<!--注册通知类-->
<bean id="myAdvice" class="before.MyAdvice"/>
c.配置/组装切面 aspect = advice + pointcut
<!--组装切面-->
<aop:config>
<!--配置切入点pointcut
id:切入点在工厂中的唯一标识
expression:用来指定切入项目中哪些组件中哪些方法 execution(返回值 包名.类名.方法名(参数))
*表示任意、所有
-->
<aop:pointcut id="pc" expression="execution(* aop.UserServiceImpl.*(..))"/>
<!--配置切面 advice-ref:工厂中通知id pointcut-ref:工厂切入点唯一标识-->
<aop:advisor advice-ref="myAdvice" pointcut-ref="pc"/>
</aop:config>
# 4.启动工厂测试
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("aop/spring.xml");
UserService userSerivce = (UserService) context.getBean("userService");
System.out.println(userSerivce.getClass());
//代理对象
userSerivce.save("小黑");
5.3 前置通知使用
EmpService.java
package aop;
/**
* @ClassName EmpService
* @Description 接口
* @Author Jiangnan Cui
* @Date 2022/4/4 18:36
* @Version 1.0
*/
public interface EmpService {
void save(String name);
String find(String name);
}
EmpServiceImpl.java
package aop;
/**
* @ClassName EmpServiceImpl
* @Description EmpService实现类 原始业务对象 / 目标对象
* @Author Jiangnan Cui
* @Date 2022/4/4 18:37
* @Version 1.0
*/
public class EmpServiceImpl implements EmpService{
@Override
public void save(String name) {
System.out.println("处理业务逻辑saveDao!" + name);
}
@Override
public String find(String name) {
System.out.println("处理业务逻辑findDAO!" + name);
return name;
}
}
MyBeforeAdvice.java自定义前置通知
package aop;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
/**
* @ClassName MyBeforeAdvice
* @Description 自定义记录业务方法名称的前置通知
* @Author Jiangnan Cui
* @Date 2022/4/4 18:46
* @Version 1.0
*/
public class MyBeforeAdvice implements MethodBeforeAdvice {
@Override
//参数1:method表示当前执

本文详细介绍了Spring的AOP(面向切面编程)概念,包括通知类型、切入点、切面的创建和配置。通过实例展示了前置通知、环绕通知、后置通知和异常通知的使用,并探讨了切入点表达式的灵活性。最后总结了IOC和AOP在Spring框架中的重要性。
最低0.47元/天 解锁文章
1086

被折叠的 条评论
为什么被折叠?



