• 面试官:要不你来讲讲Spring 的IOC和AOP你是怎么理解的呗?


    面试官:我看到你的简历写着熟悉Spring

    面试官要不你来讲讲Spring 的IOC和AOP你是怎么理解的呗?

    候选者:嗯嗯,IOC和AOP是Spring非常核心的知识点

    候选者:我就先来讲讲Spring IOC?

    0b77912633c64f51813d1d15259c1243.png 

    面试官:嗯

    候选者:我个人理解下:Spring IOC 解决的是对象管理和对象依赖的问题。

    候选者:本来是我们自己手动new出来的对象,现在则把对象交给Spring的IOC容器管理

    候选者:IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系

    候选者:等我们需要用对象的时候,从工厂里边获取就好了

    面试官:嗯,说起IOC,就可以在网上或书籍经常看到的两个概念

    候选者:哦,你说的就是「控制反转」和「注入依赖」吧?

    面试官:你怎么还抢答的咯…那你顺便说说你对这两个概念的理解呗?

    候选者:我认为「控制反转」指的就是:把原有自己掌控的事交给别人去处理

    候选者:它更多的是一种思想或者可以理解为设计模式

    候选者:比如:本来由我们自己new出来的对象,现在交由IOC容器,把对象的控制权交给它方了

    候选者:而「依赖注入」在我的理解下,它其实是「控制反转」的实现方式

    候选者:对象无需自行创建或者管理它的依赖关系,依赖关系将被「自动注入」到需要它们的对象当中去

    6b27f06648af4b268971840b5d3eb700.png 

    面试官:嗯,那我想问问,用Spring IOC有什么好处吗?

    面试官或者换个问法:本来我可以new出来的对象,为什么我要交由Spring IOC容器 管理呢?

    候选者:主要的好处在于「将对象集中统一管理」并且「降低耦合度」

    候选者:如果面试官理解了「工厂模式」,那就知道为什么我们不直接new对象

    面试官:好家伙,不行,这答案我观众不满意!

    候选者:要说理由的话,可以举很多例子,比如说:

    候选者:我用Spring IOC 可以方便 单元测试、对象创建复杂、对象依赖复杂、单例等等的,什么都可以交给Spring IOC

    候选者:理论上自己new出来的都可以解决上面的问题,Spring在各种场景组合下有可能不是最优解

    候选者:但new出来的你要自己管理,可能你得自己写工厂,得实现一大套的东西才能满足需求

    候选者:写着写着有可能还是Spring的那一套

    候选者:但现在Spring现在已经帮你实现了啊!

    候选者:如果项目里的对象都是就new下就完事了,没有多个实现类,那没事,不用Spring也没啥问题

    候选者:并且Spring核心不仅仅IOC啊,除了把对象创建出来,还有一整套的Bean生命周期管理

    候选者:比如说你要实现对象增强,AOP不就有了吗?不然你还得自己创建代理..5354983eb7cf4bd68bd0487ca7b5654c.png  

    面试官:好好好

    面试官:但我看这届观众好像还是不太满意?

    候选者:不,他们已经满意了。

    面试官那你继续来聊下Spring AOP呗?

    候选者:Spring AOP 解决的是 非业务代码抽取的问题

    候选者:AOP 底层的技术是动态代理,在Spring内实现依赖的是BeanPostProcessor

    候选者:比如我们需要在方法上注入些「重复性」的非业务代码,就可以利用Spring AOP

    候选者:所谓的「面向切面编程」在我理解下其实就是在方法前后增加非业务代码

    8f4c1e4cdd62418aa470719ad60e0a9e.png 

    面试官那你在工作中实际用到过AOP去优化你的代码吗?

    候选者:有的。当时我用AOP来对我们公司现有的监控客户端进行封装

    候选者:一个系统离不开监控,监控基本的指标有QPS、RT、ERROR等等

    候选者:对外暴露的监控客户端只能在代码里写对应的上报信息(灵活,但会与业务代码掺杂在一起)

    候选者:于是我利用注解+AOP的方式封装了一把,只要方法/类上带有我自定义的注解

    候选者:方法被调用时,就会上报AQS、RT等信息

    候选者:实现了非业务代码与业务代码分离的效果(:

    fd002e1aa6444d968d2fa420366987bd.png 

    面试官你们项目一般是怎么把对象交给IOC容器管理的?

    面试官:换个问法:一般是怎么定义Bean的?

    候选者:Spring提供了4种方式,分别是:

    候选者:1):注解 2):XML 3):JavaConfig 4):基于Groovy DSL配置

    候选者:一般项目我们用注解或XML比较多,少部分用JavaConfig

    候选者:日常写业务代码一般用注解来定义各种对象,责任链这种一般配置在XML,「注解」解决不了的就用JavaConfig

    候选者:总体而言,还是得看项目的代码风格吧(:

    候选者:反正就是定义元数据,能给到Spring解析就好了

    58cf7a6a9e1c40c28a36b61cae39ffc3.png 

    面试官:嗯,了解。

    面试官:要不来聊聊你使用Spring的感受?

    选者:嗯嗯..

    候选者:当我还是初学Spring的时候,我觉得Spring很麻烦,需要有一大堆的配置信息才能跑起来

    候选者:光是搭建环境就需要耗费我好长的时间

    候选者:毕竟版本冲突,依赖冲突什么的就可能一个下午就过去了

    候选者:但毕竟一个系统环境只搭一次嘛,所以还好

    候选者:(后来用上了SpringBoot这又更方便了)

    0fc7602410994ed283cf77f7758dd337.png 

    面试官:嗯…

    候选者:话说回来,IOC和AOP在工作用的时候还是很爽的

    候选者:毕竟搞个注解什么的,配置下就可以把对象交给Spring管理了

    候选者:配合Spring的生态,@Transactional注解什么的,都好用得飞起

    候选者:不过,Spring给我们封装得太好了

    候选者:经常就会有奇奇怪怪的”bug“出现,也踩过很多的坑了

    候选:Bean经常没办法创建成功,导致项目启动失败

    候选者:对象的循环依赖问题…

    候选者:同一个接口,多个实现,识别不出我要创建哪个对象…

    候选者:为什么catch了异常,Spring事务为什么还会自动回滚

    候选者:等等等…..

    c79f8fa8d62848709bb2ccc1473367d7.png  

    候选者:总的来说,Spring给我们封装了一个很好的环境,实现对我们屏蔽了

    候选者:但是如果理解不深的话,很有可能就会触发各种bug

    面试官:了解

  • 相关阅读:
    逻辑回归与决策边界解析
    理解C++四种强制类型转换static_cast、const_cast、reinterpret_cast和dynamic_cast
    input placeholder 文字提示样式
    flink-cdc同步mysql数据到hive
    申请发明专利的重要性和注意问题
    Au 入门系列之二:录音
    面向5G-Advanced演进的移动性增强技术
    Mybatis-Plus使用@TableField实现自动填充日期
    Alibaba Sentinel - Slot chain解析
    通义灵码,降临博客园
  • 原文地址:https://blog.csdn.net/m0_72088858/article/details/126538220