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相关概念
相关推荐
卿雪2 分钟前
MySQL【索引】:索引的概念与分类
java·数据库·python·mysql·adb·golang
kong@react4 分钟前
springbpoot项目,富文本,xss脚本攻击防护,jsoup
java·前端·spring boot·xss
Zzzzzxl_4 分钟前
互联网大厂Java/Agent面试实战:Spring Boot、JVM、微服务、Kafka与AI Agent场景问答
java·jvm·spring boot·redis·ai·kafka·microservices
菜择贰7 分钟前
为IDEA创建Linux桌面快捷方式
java·linux·intellij-idea
未若君雅裁11 分钟前
JVM实战总结笔记
java·jvm·笔记
廋到被风吹走2 小时前
【Spring】Spring Data JPA Repository 自动实现机制深度解析
java·后端·spring
MX_93592 小时前
Spring中Bean的配置(一)
java·后端·spring
sg_knight6 小时前
Spring 框架中的 SseEmitter 使用详解
java·spring boot·后端·spring·spring cloud·sse·sseemitter
郑州光合科技余经理8 小时前
同城系统海外版:一站式多语种O2O系统源码
java·开发语言·git·mysql·uni-app·go·phpstorm
一只乔哇噻8 小时前
java后端工程师+AI大模型开发进修ing(研一版‖day60)
java·开发语言·人工智能·学习·语言模型