AOP 简介
# 1、AOP的概念
AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象都可以组成一个切面,而用这种思维去设计编程的方式叫做面向切面编程

# 2、AOP思想的实现方案
动态代理技术,在运行期间,对目标对象的方法进行增强,代理对象同名方法内可以执行原有逻辑的同时嵌入执行其他增强逻辑或其他对象的方法

# 3、模拟AOP的基础代码
其实在之前学习BeanPostProcessor时,在BeanPostProcessor的after方法中使用动态代理对Bean进行了增强,实际存储到单例池singleObjects中的不是当前目标对象本身,而是当前目标对象的代理对象Proxy,这样在调用目标对象方法时,实际调用的是代理对象Proxy的同名方法,起到了目标方法前后都进行增强的功能,对该方式进行一下优化,将增强的方法提取出去到一个增强类中,且只对com.itheima.service.impl包下的任何类的任何方法进行增强
//自定义增强类
public class MyAdvice {
public void beforeAdvice(){
System.out.println("beforeAdvice ...");
}
public void afterAdvice(){
System.out.println("afterAdvice ...");
}
}
public class MockAopBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware {
private ApplicationContext applicationContext; // 注入Spring容器对象
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
MyAdvice myAdvice = applicationContext.getBean(MyAdvice.class); // 获得Advice对象
String packageName = bean.getClass().getPackage().getName();
if ("com.itheima.service.impl".equals(packageName)) {
// 对Bean进行动态代理,返回的是Proxy代理对象
Object proxyBean = Proxy.newProxyInstance(
bean.getClass().getClassLoader(),
bean.getClass().getInterfaces(),
(Object proxy, Method method, Object[] args) -> {
myAdvice.beforeAdvice(); // 执行Advice的before方法
Object result = method.invoke(bean, args); // 执行目标方法
myAdvice.afterAdvice(); // 执行Advice的after方法
return result;
}
);
// 返回代理对象
return proxyBean;
}
return bean;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
# 4、AOP相关概念

| 概念 | 单词 | 解释 |
|---|---|---|
| 目标对象 | Target | 被增强的方法所在的对象 |
| 代理对象 | Proxy | 对目标对象进行增强后的对象,客户端实际调用的对象 |
| 连接点 | Joinpoint | 目标对象中可以被增强的方法 |
| 切入点 | Pointcut | 目标对象中实际被增强的方法 |
| 通知/增强 | Advice | 增强部分的代码逻辑 |
| 切面 | Aspect | 增强和切入点的组合 |
| 织入 | Weaving | 将通知和切入点组合动态组合的过程 |
上次更新: 2025/07/25, 07:39:11