草庐IT

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

派 大 星. 2023-04-20 原文

推荐:前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。。 点击跳转到网站

🏡  博客首页:派 大 星

⛳️  欢迎关注  ❤️ 点赞  🎒 收藏  ✏️ 留言

🎢  本文由派大星原创编撰

🚧  系列专栏:《迎战面试》

🎈  本系列分享自己准备面试的过程和一些经典的面试题

目录

🍓 Spring IOC

🍉 IOC是什么?

Ioc即控制反转,把原来的代码里需要实现的对象创建,依赖反转给容器来帮忙实现,需要创建一个容器并且需要一种描述让容器知道要创建的对象间的关系,在Spring中管理对象及其依赖关系是通过Spring IOC容器实现的。Ioc的实现方式有依赖注入和依赖查找,由于依赖查找使用的很少,因此Ioc也叫做依赖注入。依赖注入指对象被动地接收依赖类而不用自己主动去找,对象不是从容器中查找它依赖的类,而是在容器实例化对象时主动将它依赖的类注入给它。假设一个Car类需要一个Engine的对象,那么一般需要手动new 一个Engine,利用Ioc就只需要定义一个私有的Engine类型的成员变量,容器会在运行时自动创建一个Engine的实例对象并将引入自动注入给成员变量。

🥝 Ioc容器的初始化过程?

当创建一个ClassPathXmlApplicationContext时,构造方法做了两件事情:①调用父容器的构造方法为容器设置好Bean资源加载器。②调用父类的setConfigLocations方法设置Bean配置信息的定位路径。 ClassPathXmlApplicationContext通过调用父类AbstractApplicationContext的refresh方法启动整个Ioc容器对Bean定义的载入过程,refresh是一个模板方法,规定了Ioc容器的启动流程。在创建Ioc容器前如果已有容器存在,需要把已有的容器销毁,保证在refresh方法后使用新创建的Ioc容器。容器创建后通过loadBeanDefinitions方法加载Bean 配置资源,该方法做两件事:①调用资源加载器的方法获取要加载的资源。②真正执行加载的功能,由子类XmlBeanDefinitionReader实现,加载资源时首先解析配置文件路径,读取配置文件的内容,然后通过XML解析器将Bean配置信息转换成文档对象,之后按照Spring Bean的定义规则对文档进行解析。Spring Ioc容器中注册解析的Bean信息存放在一个HashMap集合中,key是字符集,只是BeanDefinition,注册过程中需要使用synchronized 保证线程安全。当配置信息中配置的Bean被解析且被注册到Ioc容器中后,初始化就算真正完成了,Bean定义信息已经可以使用且可被检索。Spring Ioc容器的作用就是对这些注册的Bean定义信息进行处理和维护,注册的Bean定义信息是控制反转和依赖注入的基础。

🍒 基于注解的容器初始化

  • 直接将注解Bean注册到容器中,可以在初始化容器时注册,也可以在容器创建之后手动注册,然后刷新容器使其对注册的注解Bean进行处理。
  • 通过扫描指定的包及其子包的所有类处理,在初始化注解容器时指定要自动扫描的路径。

🍅 依赖注入的相关注解?

  • @Autowired :自动按类型注入,如果有多个匹配则按照指定的Bean的id查找,查找不到会报错。
  • @Qualifier :在自动按照类型注入的基础上再按照Bean的id注入,给变量注入时必须搭配@Autowired,给方法注入时可单独使用。
  • @Resource:直接按照Bean的id注入,只能注入Bean类型。
  • @Value:用于注入基本数据类型和String类型

🌰 如何通过注解创建Bean?

@Component 把当前类对象存入Spring容器中,相当于xml中配置了一个bean标签。value属性指定bean的id,默认使用当前类的首字母小写的类名。@Controller 、@Service、@Repository 三个注解都是@Component的衍生注解,作用及属性都是一模一样的,只是提供了更加明确的语义。@Controller用于表现层,@Service用于业务层,@Repository用于持久层。如果注解的中只有一个value属性要赋值时可以省略value。如果想将第三方的类变成组件有没有源代码,也就没办法使用@Component进行自动配置,这种时候就要使用@Bean注解,被@Bean注解的方法返回值是一个对象,将会实例化,配置和初始化一个新对象并返回,这个对象由Spring的Ioc容器管理。name属性用于给当前@Bean注解方法创建的对象指定一个名称,即Bean的id,当使用注解配置方法时,如果方法有参数,Spring会去容器查找是否有可用的bean对象,查找方式和@Autowired一样。

🍰 SpringAOP

🍕 AOP是什么?

AOP即面向切面编程,通过预编译和运行期动态代理实现程序功能的统一维护。常用场景:权限认证、自动缓存、错误处理、日志、调试和事务等。

🍨 实现AOP的方式?

  • 采用动态代理方式实现:利用拦截方法的方式,对该方法进行装饰,以增强原有对象的方法。具体实现技术有JDK动态代理基于接口代理和CGLib基于类代理的字节码提升。
  • 采用静态织入的方式:引入特定的语法创建“切面”,从而使得编译器可以在编译期间织入相关“切面”的代码。

🍫 AOP原理

AOP代理其实是由AOP框架动态生成的一个对象,该对象可作为目标对象使用。AOP代理包含了目标对象的全部方法,但AOP代理中的方法与目标对象的方法存在差异:AOP方法在特定切入点添加了增强处理,并回调了目标对象的方法。Spring的AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IoC容器负责管理,因此,AOP代理可以直接使用容器中的其他Bean实例作为目标,这种关系可由IoC容器的依赖注入提供。

🍭 AOP的相关注解有哪些?

  • @Aspect:声明被注解的类是一个切面的Bean;
  • @Before:前置通知,指在某个连接点之前执行的通知;
  • @After:后置通知,指某个连接点退出时执行的通知(不论程序是正常返回还是异常退出)
  • @AfterReturning:返回后通知,指某连接点正常完成之后执行的通知,返回值使用returning属性接收。
  • @AfterThrowing:异常通知,指方法抛出异常导致退出时执行的通知,和@AfterReturning只会有一个执行,异常使用throwing属性接收。

有关关于Spring 的IoC和AOP的面试题,快看看你都能答上来哪些的更多相关文章

  1. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  2. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  3. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

    转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

  4. ruby-on-rails - 您希望看到哪些 Rails 插件? - 2

    您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

  5. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  6. ruby - 实现k最近邻需要哪些数据? - 2

    我目前有一个reddit克隆类型的网站。我正在尝试根据我的用户之前喜欢的帖子推荐帖子。看起来K最近邻或k均值是执行此操作的最佳方法。我似乎无法理解如何实际实现它。我看过一些数学公式(例如k表示维基百科页面),但它们对我来说并没有真正意义。有人可以推荐一些伪代码,或者可以查看的地方,以便我更好地了解如何执行此操作吗? 最佳答案 K最近邻(又名KNN)是一种分类算法。基本上,您采用包含N个项目的训练组并对它们进行分类。如何对它们进行分类完全取决于您的数据,以及您认为该数据的重要分类特征是什么。在您的示例中,这可能是帖子类别、谁发布了该项

  7. ruby-on-rails - Spring 不起作用。 [未初始化常量 Spring::SID::DL] - 2

    我无法运行Spring。这是错误日志。myid-no-MacBook-Pro:myid$spring/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/lib/spring/sid.rb:17:in`fiddle_func':uninitializedconstantSpring::SID::DL(NameError)from/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/li

  8. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  9. ruby - 关于 Ruby 中 Dir[] 和 File.join() 的混淆 - 2

    我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案

  10. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

随机推荐