AOP简介

目录

AOP简介

AOP思想的实现方案

模拟AOP的基础代码

AOP相关概念


AOP简介

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

AOP思想的实现方案

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

模拟AOP的基础代码

debug中获取某个特定值

java 复制代码
public class MockBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware {
    private ApplicationContext applicationContext;
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
        //对UserServiceImpl实现增强,增强方法在MyAdvice中
        //问题对Bean进行筛选service.Impl包下的所有类的所有方法都可以进行增强,
        // MyAdvice的获取     从Spring容器中获取
        if (bean.getClass().getPackage().getName().equals("com.hsf.service.Impl")){
            //为UserService创建代理
            Object BeanProxy=Proxy.newProxyInstance(
                    bean.getClass().getClassLoader(),//类加载器
                    bean.getClass().getInterfaces(),//类实现的接口
                    (Object proxy, Method method, Object[] args) -> {
                        //获取增强对象
                        MyAdvice myAdvice = applicationContext.getBean(MyAdvice.class);
                        //执行增强对象A方法
                        myAdvice.beforeAdvice();
                        //执行目标对象方法
                        Object invoke = method.invoke(bean, args);
                        //执行增强对象b方法
                        myAdvice.afterAdvice();
                        return invoke;
                    }

            );
            return BeanProxy;
        }
        return bean;

    }

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext=applicationContext;
    }
}

原因:getBean方法 第二个参数应该写的是接口,而不是它的实现类 (动态代理的是接口【记住使用框架都要用接口类型来引用实现类对象】)

AOP相关概念
相关推荐
dd聊技术7 小时前
Prompt 从代码常量搬进数据库:改一句话,不用再发一次版
java·后端
ly76897 小时前
Spring Data MongoDB 批量写入实践:BulkOperations 批大小与写关注权衡
java·mongodb·spring·批量写入·bulkoperations·写关注·mongotemplate
TAKETODAY7 小时前
Netty 是怎么把 HTTP 请求交给 MVC 的?一个请求的完整链路
java·netty
蚰蜒螟7 小时前
从内核启动到 Java NIO:一次 socket accept 的源码串联之旅
java·python·nio
会编程的吕洞宾7 小时前
Spring AI 2.0 自校正结构化输出实战:让大模型稳定吐出合格 JSON
java·人工智能·后端·spring
bmxy小明同学8 小时前
2026-10-09-token与成本
java·前端·数据库
微笑的曙光8 小时前
第八期 · 情绪闯关挑战盒:一个「无惩罚」成就系统的数据建模
java·微信小程序
java资料站9 小时前
七、Spring AI Alibaba · Skills
java·后端·spring
code2cat9 小时前
Java进阶篇之AtomicReferenceFieldUpdater:用不可变快照替换整份状态
java·开发语言·cas
geats人山人海9 小时前
现代c++2.4 虚继承
java·开发语言·c++