Spring 面试题及答案解析(7)

这一篇说一些Java最流行的框架spring的一些知识点。大家注意到了没有,我不说面试题,改用知识点了。因为后台有小伙伴留言说有很多人不准备面试,可不可以发一些学习的知识点。

其实面试所问的往往是企业期望技术人掌握的东西,这些不一定只是为了去面试看,通过看这些问题反省自己对某一块知识的掌握也是很好的。但小编还是想尽量满足大部分小伙伴的想法,所以以后发的面试题一律改称知识点。以下是知识点正文:

说一下spring中Bean的作用域

singleton:

Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。Singleton作用域是Spring中的缺省作用域。

prototype:

每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而singleton全局只有一个对象。

request:

在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效。

session:

在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。

global Session:

在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。

说一下spring中Bean的生命周期

  • 实例化一个Bean,也就是我们通常说的new。
  • 按照Spring上下文对实例化的Bean进行配置,也就是IOC注入。
  • 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID。
  • 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)。
  • 如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文。
  • 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术。
  • 如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
  • 如果这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法。
  • 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法。
  • 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

对Spring中依赖注入两种方式的认识

两种注入方式为:构造方法注入和设值注入

  1. 设值注入与传统的JavaBean的写法更相似,程序员更容易理解、接受,通过setter方式设定依赖关系显得更加直观、明显;
  2. 对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读。Spring在创建Bean实例时,需要同时实例化其依赖的全部实例,因而会产生浪费。而使用设置注入,则避免这下问题;
  3. 在某些属性可选的情况下,多参数的构造器更加笨拙,官方更鼓励使用设值注入。
  4. 构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。
  5. 对于依赖关系无须变化的Bean,构造注入更有用处,因为没有setter方法,所有的依赖关系全部在构造器内设定,因此,不用担心后续代码对依赖关系的破坏。
  6. 构造注入使依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系。对组件的调用者而言,组件内部的依赖关系完全透明,更符合高内聚的原则。
  7. 设值注入不会重写构造方法的值。如果我们对同一个变量同时使用了构造方法注入又使用了设置方法注入的话,那么构造方法将不能覆盖由设值方法注入的值。
  8. 建议采用以设值注入为主,构造注入为辅的注入策略。对于依赖关系无须变化的注入,尽量采用构造注入;而其他的依赖关系的注入,则考虑采用set注入。

Spring框架中都用到了哪些设计模式?

  • 代理模式:在AOP和remoting中被用的比较多。
  • 单例模式:在spring配置文件中定义的bean默认为单例模式。
  • 模板方法模式:用来解决代码重复的问题。
  • 前端控制器模式:Spring提供了DispatcherServlet来对请求进行分发。
  • 依赖注入模式:贯穿于BeanFactory / ApplicationContext接口的核心理念。
  • 工厂模式:BeanFactory用来创建对象的实例。

BeanFactory 和ApplicationContext的区别

BeanFactory和ApplicationContext都是接口,并且ApplicationContext是BeanFactory的子接口。

BeanFactory是Spring中最底层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能。而ApplicationContext是Spring的一个更高级的容器,提供了更多的有用的功能。

ApplicationContext提供的额外的功能:国际化的功能、消息发送、响应机制、统一加载资源的功能、强大的事件机制、对Web应用的支持等等。

加载方式的区别:BeanFactory采用的是延迟加载的形式来注入Bean;ApplicationContext则相反的,它是在Ioc启动时就一次性创建所有的Bean,好处是可以马上发现Spring配置文件中的错误,坏处是造成浪费。

知识星球

目前在知识星球(https://t.zsxq.com/2VbiaEu)更新了如下 Dubbo 源码解析如下: 01. 调试环境搭建 02. 项目结构一览 03. API 配置(一)之应用 04. API 配置(二)之服务提供者 05. API 配置(三)之服务消费者 06. 属性配置 07. XML 配置 08. 核心流程一览

09. 拓展机制 SPI

10. 线程池

... 一共 60 篇++

原文发布于微信公众号 - 芋道源码(YunaiV)

原文发表时间:2018-06-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ImportSource

像Spring Boot那样创建一个你自己的Starter

如果你所在的公司要开发一个共享的lib,或者如果你想要为开源世界做点贡献,你也许想要开发你自己的自定义的自动配置类以及你自己的starter pom。这些自动配...

3489
来自专栏CSDN技术头条

给你一份超详细 Spring Boot 知识清单

在过去两三年的 Spring 生态圈,最让人兴奋的莫过于 Spring Boot 框架。Spring Boot 应用本质上就是一个基于 Spring 框架的应用...

5472
来自专栏扎心了老铁

zookeeper curator使用caches实现各种监听

1、篇首语 curator是zookeeper的一个高级api开发包。封装了zookeeper众多的recipes,并且实现了一些新的recipes原语,最重要...

5395
来自专栏QQ音乐技术团队的专栏

支持跨进程单例的一种实现方案

零 烫烫烫烫烫烫 单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局...

45710
来自专栏Java架构师历程

Spring工作原理

      内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、...

2092
来自专栏Java成神之路

Spring_总结_02_依赖注入

在上一节中,我们了解了Spring的最根本使命、四大原则、六大模块以及Spring的生态。

824
来自专栏一个会写诗的程序员的博客

《Spring Boot极简教程》第5章 Spring Boot自动配置原理

我们可以看到有783个java文件。spring-boot核心工程有551个java文件。从上面的java文件数量大致可以看出,SpringBoot技术框架的核...

1432
来自专栏Winter漫聊技术

初学Dagger之Hello Dagger(0)

写作背景 这几天在学习Dagger、MVP、Agera,这里所说的Dagger即Google接手的Dagger,也被称作Dagger 2。跟着demo与一些技...

772
来自专栏Spring相关

第1章—Spring之旅—容纳你的Bean

1、Bean自身的方法  :  这个包括了Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法

1181
来自专栏java思维导图

给你一份SpringBoot知识清单

在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架。或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用。因而Spri...

1554

扫码关注云+社区

领取腾讯云代金券