面试 — 进行时 — Spring AOP

死磕Spring之AOP篇 - Spring AOP常见面试题 代理模式是一种结构性设计模式,通过代理类为其他对象提供一种代理以控制对这个对象的访问。AOP 代理是 AOP 框架中 AOP 的实现,主要分为静态代理和动态代理,如下:静态代理:代理类需要实现被代理类所实现的接口,同时持有被代理类的引用,新增处理逻辑,进行拦截处理,不过方法还是由被代理类的引用所执行。静态代理通常需要由开发人员在编译阶段就定义好,不易于维护。常用 OOP 继承和组合相结合AspectJ,在编辑阶段会织入 Java 字节码,且在运行期间会进行增强。 阅读详情

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受.

说说 spring aop 的那些事。

Spring AOP 的前世今生

  • 起源与发展 :AOP(Aspect-Oriented Programming,面向切面编程)作为一种编程思想,旨在解决传统面向对象编程中存在的代码重复、关注点分散等问题。Spring AOP 是 Spring 框架对 AOP 思想的实现,它借鉴了 AOP Alliance 的相关规范,并不断发展和完善。

  • 与 AspectJ 的关系 :早期 Spring AOP 和 AspectJ 是相互竞争的 AOP 框架,但后来 Spring 决定整合 AspectJ,从 Spring 2.0 开始对 AspectJ 提供支持,并在后续版本中不断加深融合。不过,Spring AOP 和 AspectJ 在实现原理和使用场景上有所不同,Spring AOP 主要基于动态代理实现运行时增强,而 AspectJ 是基于字节码操作的编译时增强。

Spring AOP 的核心设计思想

  • 代码复用 :将通用的功能(如日志记录、事务管理等)抽取出来,形成可复用的切面模块,避免在多个业务模块中重复编写相同的代码,提高代码的可维护性和可扩展性。

  • 关注点分离 :将业务逻辑和通用功能分离,让开发者能够更专注于业务逻辑的实现,而通用功能则由切面来处理,从而使代码更加清晰、简洁,降低模块间的耦合度。

  • 动态织入 :在运行时通过动态代理技术将切面逻辑织入到目标对象的方法中,无需修改目标对象的源代码,实现了对目标对象的无侵入式增强,增强了系统的灵活性和可扩展性。

  • 基于接口与注解的编程模式 :提供了丰富的注解(如 @Aspect、@Before、@After、@Around 等),方便开发者快速定义切面和切点,降低了 AOP 编程的门槛,同时也支持基于接口的编程模式,与 Spring 容器紧密结合,方便对切面进行管理。

  • 与 Spring 容器的集成 :依赖于 Spring 的 IOC 容器,能够方便地获取和管理切面 Bean,同时也能够利用 Spring 容器的其他功能(如依赖注入等)来增强切面的灵活性和可配置性。

Spring AOP 的核心实现源码

  • AOP 代理的创建 :Spring AOP 通过 AopProxyFactory 来创建 AOP 代理对象,它会根据目标对象是否实现了接口以及相关配置来决定使用 JDK 动态代理还是 CGLIB 代理。其核心实现代码如下:扫码添加如下号码,了解更多信息。

public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {

    @Override
    public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
        if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
            Class<?> targetClass = config.getTargetClass();
            if (targetClass == null) {
                throw new AopConfigException("TargetSource cannot determine target class: " +
                        "Either an interface or a target is required for proxy creation.");
            }
            if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
                return new JdkDynamicAopProxy(config);
            }
            return new ObjenesisCglibAopProxy(config);
        }
        else {
            return new JdkDynamicAopProxy(config);
        }
    }

    private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {
        Class<?>[] ifcs = config.getProxiedInterfaces();
        return (ifcs.length == 0 || (ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0])));
    }
}
  • 方法拦截器链的执行 :在 Spring AOP 中,方法拦截器链的执行是通过 ReflectiveMethodInvocation 类来实现的,其核心代码如下:

public class ReflectiveMethodInvocation extends AbstractMethodInvocation {
    // 方法拦截器链
    private final List<Object> interceptorsAndDynamicMethodMatchers;
    private final Class<?> targetClass;
    private final Object[] arguments;
    private final Method method;
    private final Object target;
    // 其他代码...

    public Object proceed() throws Throwable {
        Object returnType = null;
        for (int i = 0; i < interceptorsAndDynamicMethodMatchers.size() - 1; i++) {
            Object interceptorOrInterceptionAdvice = interceptorsAndDynamicMethodMatchers.get(i);
            if (interceptorOrInterceptionAdvice instanceof MethodInterceptor) {
                returnType = ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);
                if (returnType != null) {
                    return returnType;
                }
            }
        }
        return invokeJoinpoint();
    }

    private Object invokeJoinpoint() throws Throwable {
        return AopUtils.invokeJoinpointUsingReflection(target, method, arguments);
    }
}
  • 环绕通知的实现 :环绕通知是 Spring AOP 中一种强大的通知类型,它允许在目标方法执行前后都执行自定义逻辑,并且可以控制目标方法是否执行以及返回值等。环绕通知的核心实现代码如下:

public class AroundAdviceInterceptor implements MethodInterceptor {
    private final MethodInterceptor interceptor;

    public AroundAdviceInterceptor(MethodInterceptor interceptor) {
        this.interceptor = interceptor;
    }

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        return this.interceptor.invoke(invocation);
    }
}

Spring AOP 的使用场景

  • 日志记录 :在方法执行前后记录日志信息,方便对系统的运行情况进行监控和分析。

  • 权限验证 :在业务方法执行前进行权限验证,确保只有具有相应权限的用户才能访问特定的方法或功能。

  • 性能监控 :通过环绕通知测量方法的执行时间,对系统的性能进行监控和优化。

  • 事务管理 :对数据访问层的方法进行事务管理,确保数据的一致性和完整性。

  • 缓存管理 :在方法执行前检查缓存中是否存在结果,如果存在则直接返回缓存结果,否则执行方法并将结果存入缓存。

  • 异常处理 :在方法执行出现异常时进行统一的异常处理,如记录异常信息、发送警报邮件等。

Spring AOP 的替代方案

  • AspectJ :AspectJ 是一个功能强大的 AOP 框架,它基于字节码操作实现编译时增强,能够对类的字段、构造方法等进行增强,且性能较好。Spring AOP 已经集成了 AspectJ,但在使用时需要注意二者的区别和适用场景。

  • 字节码增强工具 :如 ASM、Javassist 等,它们可以直接操作字节码来实现对类的增强,具有较高的灵活性和性能,但使用相对复杂,需要对字节码有一定的了解。

  • 其他 AOP 框架 :如 Guice AOP 等,它们也提供了类似的功能,可根据具体需求选择合适的框架。

Spring AOP 面试题大全 每道问题都包含详细解答和代码示例,以便于理解与记忆。 阅读详情

相关推荐

IOC和AOP整合以及面试宝典spring

在软件业,AOP为Aspect Oriented Programming的缩写,意味:面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统 一维护的一种技术,AOP是OOP的延续.将一些共性的内容进行抽取,在需要用到的地方,以动态代理的方式进行插入.在不修 改源 码的基础上,还能对源码进行前后增强。属性的依赖注入,spring在通过IOC创建对象的时候,如果对象还有属性,就一并给赋值进去DI是在IOC的基础上进行对象的属性 注入。b、after: 在方法执行之后调用的通知,无论方法执行是否成功。

weixin_73683568的博客 1510

关于Spring 的IoC和AOP的面试题,快看看你都能答上来哪些

🏡  博客首页:派 大 星 ⛳️  欢迎关注  ❤️ 点赞  🎒 收藏  ✏️ 留言 🎢  本文由派大星原创编撰 🚧  系列专栏:《迎战面试》 🎈  本系列分享自己准备面试的过程和一些经典的面试题 目录🍓 Spring IOC🍉 IOC是什么?🥝 Ioc容器的初始化过程?🍒 基于注解的容器初始化🍅 依赖注入的相关注解?🌰 如何通过注解.

派大星的博客 1万+

Spring AOP常见面试题

Spring AOP常见面试题

m0_69468924的博客 2643

Spring AOP 详解

Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架提供的一种编程范式,它允许开发者将横切关注点(如日志、事务管理、权限检查等)与业务逻辑分离,从而提高代码的模块化和可维护性。Spring AOP 基于代理机制实现,它为Spring应用提供了声明式事务管理等功能。

2301_80035594的博客 6824

来咯来咯,最新整理41道Spring和Spring AOP面试题(带答案)

最新整理41道spring和spring aop面试题 前言: 最近有很多小伙伴们私信我要spring的面试题,所以又给大家整理了一下,这里有41道spring和spring aop的面试题,由于篇幅限制,只有前二十个在这文章里带答案,需要其他面试题答案的可以关注我的公众号 Java 周某人 就获取免费领取方式! 1.什么是spring? Spring 是个ja...

Javazhoumou的博客 970

面试官:Spring AOP是怎么实现的?

介绍 Spring AOP的实现和IOC的实现比起来还是比较简单的。在正式介绍流程之前,先介绍一个接口 public interface BeanPostProcessor { // 在bean初始化之前执行 @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } // 在Bean初始化之后执行

小识的博客 8962

Spring AOP 最热门面试题及答案

译者的话 前几天去京东面试,被问到 AOP 相关的问题,之前一直没有系统地学习相关的知识,答得不是很好。趁着假期,找了一下相关的资料,优快云上有很多不错的文章,看了之后对 AOP 有比较好的理解了。然后 Google 了一下 AOP 相关面试题(AOP interview),搜出来的第一条结果是一个叫 HowToDoInJava 的网站上的一篇文章 Top Spring AOP Intervie...

dadiyang的博客 9万+

Carsim与AVL CRUISE联合仿真:从零搭建整车模型的实战指南

本文详细介绍了如何从零开始搭建Carsim与AVL CRUISE联合仿真整车模型,涵盖软件环境配置、接口设置、模型连接及调试技巧。通过联合仿真,可充分发挥Carsim在车辆动力学和AVL CRUISE在动力系统仿真方面的优势,为电动车和混合动力汽车的研发提供精准的整车模型分析。

weixin_29067143的博客 938

Spring源码剖析-拜托面试官别再问我AOP原理了

前言 IOC/DI , AOP 是Spring最重要的两个特性 ,也是面试高频被问到的部分,前面我们已经分析了Spring的IOC相关源码以及DI依赖注入相关源码,从本篇文章开始我们着手分析Spring的AOP源码 。 AOP的理解 AOP基本概念 AOP是为面向切面编程,为什么要面向切面,何为切面?我们知道对于OOP面向对象而言在某些开发场景中是有一定不足,由于面向对象的思想是纵向的,它面对的是一个一个的对象,当我们需要在多个类中引入同一个公共的业务时(比如:事务,操作日志等),那么在每个类中都要引入公共

墨家巨子@俏如来 3900

Qt快速读取Excel文件

网上很多读取方式都是如下形式,太慢了,打开文件+读取文件要6s以上,实在是受不了! QAxObject excel("Excel.Application"); excel.setProperty("Visible", false); QAxObject *work_books = excel.querySubObject("WorkBooks"); work_boo...

c+c++的博客 2万+

ZYNQ-Video out IP与Video Timing Controller IP协同工作模式解析

本文深入解析了ZYNQ平台上Video out IP与Video Timing Controller IP的协同工作模式,详细介绍了它们的架构、工作原理及配置要点。通过AXI4-Stream接口实现高效视频数据传输,并结合HDMI输出系统设计实践,为开发者提供了实用的调试技巧和性能优化建议。

redis7keeper的博客 636

Spring面试必备:Spring IOC和AOP的理解、如何解决Spring循环依赖

IOC(Inversion of Control)是 Spring 框架的核心概念,指的是将对象的创建和管理交给 Spring 容器,而不是在应用程序中显式地进行控制。通过 IOC,依赖对象可以通过依赖注入(Dependency Injection, DI)进行传递,简化了对象的创建过程,降低了耦合度。

程序员-杨胡广的博客 2173

沁恒CH32V30X学习笔记02--GPIO的使用教程及2次封装驱动

刚复位后,GPIO 口运行在初始状态,这时大多数 IO 口都是运行在状态所有的 GPIO 口都可以被配置外部中断输入通道,但一个外部中断输入通道最多只能映射到一个GPIO 引脚上,且外部中断通道的序号必须和 GPIO 端口的位号一致,,两方都是一对一的关系。复用功能。

Car12 703

Spring IOC AOP常见的面试题及概念

本篇部分内容来源于网络,加上个人总结归纳,另外加上一些自己的见解,于是本篇文章诞生。感谢部分内容的提供者。 1、 Spring的 IOC和AOP机制 ? (1)我们是在使用 Spring框架的过程中,其实就是为了使用 IOC(控制反转)、依赖注入(DI与IOC一样)和AOP(面向切面编程),这两个也是 Spring 的灵魂。 (2)主要用到的设计模式有工厂模式和代理模式 IOC就是典型的工厂模式,AOP就是典型的代理模式的体现。 代理模式是常用的Java设计模式,他的特征是代理类与委托类有同样的接口,代理

qq_43012792的博客 9337

基于Simulink的BCH码编解码仿真建模示例

BCH码是一类循环码,能够纠正一定数量的随机错误。灵活性:可以根据需要选择不同的码长和纠错能力。高效性:适用于短码长和中等码长的场景,广泛用于卫星通信、存储系统等。实现简单:编码和解码过程可以通过硬件或软件高效实现。在本示例中,我们将使用MATLAB/Simulink中的和模块来完成BCH码的编解码操作,并通过仿真验证其误码率(BER)性能。通过本指南,我们介绍了如何基于Simulink搭建一个BCH码的编解码模型,并进行了仿真以验证其性能。背景介绍:理解BCH码的基本原理及其在通信系统中的应用。

xiaoheshang_123的博客 188

BES2300x笔记(36) -- OTA升级

哈喽大家好,这是该系列博文的第三十六篇~ 篇~ <<【系列博文索引】快速通道 >> 一、前言 BES 蓝牙方案自带 OTA(Over The Air)功能,该功能可以对蓝牙固件进行在线升级,目前该功能支持通过安卓手机(苹果手机也有对应APP,未实际测试)对蓝牙固件进行升级,以后还会支持通过 PC 端进行在线升级。在使用 OTA 功能之前,用户需安装 BES 提供的手机 apk 软件,将需要升级的固件拷贝到手机,然后通过该 apk 软件进行在线升级。

文化人的博客 5355

Spring AOP常见面试题整理

一直觉得对AOP了解得比较清楚了,不就是面向切面编程嘛,应用最多的地方,就是日志打印,没什么难点。可是有一天一个朋友微信发了一张图,问了两个问题: 1、Spring AOP的设计原理是什么? 2、在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? 我发现完全蒙圈,根本答不上来啊,真是汗颜,趁有空,赶紧抽时间整理下。 如果不用AO...

weixin_39309402的博客 2万+

库存优化技术提升电商效率

第一部分:库存优化技术基础 第1章:库存优化的基本概念 库存优化是现代电商运营中至关重要的一个环节。简单来说,库存优化指的是通过一系列的策略和技术手段,使得库存管理更加高效、准确,从而降低运营成本,提高销售额。 1.1 库存优化的定义与重要性

AI天才研究院 1247

面试题,说说你对spring IOC和AOP的理解

在面试中,经常会问,说说你对spring IOC和AOP的理解,问题很宽泛,似乎不知道从何说起。 回答思路:1.先用通俗易懂的话解释下何为IOC和AOP---------》2.各自的实现原理-----------》3.自己的项目中如何使用         以下文章本人觉得可以很好地回答前两个问题,特此转载供读者参考: http://blog.youkuaiyun.com/it_man/artic

s20081294的专栏 6万+

【学习系列】SAP RAP 4:通过注解来完成一些常规需求

本文介绍了RAP应用中常用注解的实现方式,包括搜索帮助、文本描述绑定、联动搜索、字段控制等功能。通过@Consumption、@UI等注解可以实现搜索帮助定义、多字段联动、必输校验、默认排序和默认值设置。管理字段可通过@Semantics注解自动记录创建/修改信息,长文本使用@UI.multiLineText实现多行显示。这些注解可优化界面交互和数据管理,为后续行为定义功能开发奠定基础。文章结构清晰,针对不同需求提供了具体的实现方案和代码示例。

DeveloperMrMeng的博客 694

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring 面试之IoC 和 AOP

Spring IoC 什么是IoC Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下: 控制是什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器

上山打卤面的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Spring面试,IoC和AOP的理解

spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等

kiss_vicente的专栏 10万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

AOP、IOC、Spring面试题(个人总结)

一、什么是IOC? IOC就是一个Spring特有的,用来装类对象的,就是我们用Spring框架时,不需要new对象了,不过我们需要让我们的Spring知道我们写了哪些配置和需要用什么,所以这时我们就要引用Spring的注解或者在配置xml文件上配置我们的类配置,就是在我们自己写的类上加上@Component、@Controller、@Service、@Repository等等这些让我们的Spring知道我们等下要调用有哪些类,让它先准备准备,等下我们需要用了,就getBean或者通过@Autowrite

weixin_50520054的博客 3620

spring面试题之AOP

面试的时候关于spirng的知识点中,AOP绝对是一大热点,那么该怎么回答关于AOP的面试问题呢,接下来,将我自己总结的关于AOP的面试问题分享给各位。 (1).Spring AOP用的是哪种设计模式? 代理模式。 通过代理,可以详细控制访问某个或者某类对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。 (2).谈谈你对代理模式的理解? 通过代理,控制对对象的访问,它的设...

越是憧憬,越要风雨兼程 5639

Spring AOP 面试难点总结

Spring AOP 面试难点总结 Spring AOP 经常是各大面试官必提的知识点。我这里总结了 AOP 的各种关键知识点,希望能帮助到大家。 AOP 它能做什么:事务、安全、日志、缓存. 以前都是OOP的思想下编程模型,一切都是面向对象,显得井然有序,但某一天发现许多对象逻辑里有相同的代码逻辑或片段,比如记录日志、用户权限验证,他们都是做同样的事,这样,第一是觉得这样的代码对于有洁癖的人看起来是很反感的,再者若这些代码涉及改动时所有用到的点都要改。但又发现这些需要植入的地方只是一些关键地方。 那么,是

qq_36789243的博客 429

Spring 框架之AOP的原理剖析(面试必备)

本博客部分知识内容是由追梦工程师启发而来,同时也希望正在面试得你得到一份好工作。 AOP(Aspect Oriented Programming)面向切面编程是 Spring 框架最核心的组件之一,它通过对程序结构的另一种考虑,补充了 OOP(Object-Oriented Programming)面向对象编程。在 OOP 中模块化的关键单元是类,而在 AOP 中,模块化单元是切面。也就是说 A...

weixin_41446894的博客 7300
上一篇: 面试 — 进行时 — CGLIB代理实现
下一篇: 面试 — 进行时 — 代理那些事
supingemail
博客等级 码龄18年 1235粉丝 320原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值