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相关概念
相关推荐
江湖中的阿龙8 分钟前
【无标题】
java·开发语言
JavaEdge在掘金9 分钟前
06-LangChain Tool 加载与使用指南:预制工具、SerpAPI、edge-tts、GraphQL
java
NettyBoy12 分钟前
生产 YoungGC 导致的系统化卡顿
java·jvm
聚美智数13 分钟前
食物热量搜索与详情双接口接入实战,轻量化生活服务 API 落地
java·开发语言·生活
Ting-yu14 分钟前
Spring AI Alibaba零基础速成(2) ---- Ollama安装与使用
java·后端·spring·ai
砍材农夫20 分钟前
物联网 基于netty构建mqtt服务协议支持
java·物联网·struts·netty
凤凰院凶涛QAQ24 分钟前
《C++转Java快速入手系列》String篇:在C++里拼字符串像搬砖,在Java里拼字符串像玩乐高 —— 还是带垃圾回收的那种。
java·开发语言·c++
会编程的吕洞宾25 分钟前
Spring_Boot_3_3_的___Transactional__
java·后端·spring
轻刀快马30 分钟前
讲明白Lambda 表达式的进化史
java·开发语言
那个失眠的夜31 分钟前
SpringBoot
java·开发语言·spring boot·spring·mvc·mybatis