面试真题--------spring源码解析IOC

technologykai 2018-05-16 原文

面试真题——–spring源码解析IOC

spring是我经常使用的框架,可是你真的对spring理解吗? 还是只知道它得使用。如果你想知道它真实的面目请仔细向下看。

1.spring是如何知道哪些Bean需要实例化的?

    容器启动过程中,首先调用DispatcherSerlvet的init方法,init方法内部根据web.xml的配置,读取配置的上下文readspring-servlet.xml,然后逐句解析该上下文,当它读取到context:component-scan标签时,就启动对应的解析器,也可以叫做扫描器,对应的Class为:ComponentScanBeanDefinitionParser。这个类ComponentScanBeanDefinitionParser中调用了doScan方法,可以看到传了一个参数:basePackages,就是我们配置的路径。

这样,就读取到了需要被实例化的所有类,之后这些类的信息会被封装成一个一个的BeanDefinition,然后保存到DefaultListableBeanFactory的beanDefinitionMap中供后续使用。

    /** Map of bean definition objects, keyed by bean name */
    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>();

2.Spring中Bean是什么时候被实例化的?

  所有的这些Bean,在容器启动的时候,已经全部被实例化了。

下面看代码一探究竟,还得看模板方法,AbstractApplicationContext.refresh(),其中有这么一个方法

  // Instantiate all remaining (non-lazy-init) singletons.
  finishBeanFactoryInitialization(beanFactory);

 

看注释知道:实例化剩下的所有单例。

Spring中的Bean默认都是单例的,除非显示的声明为prototype。

剩下的(remaining)的意思是有一些Spring自身的处理器、解析器等Bean不是在这里实例化的,我们自己编写的常规类Controller、Service等全部都是在此处实例化。

3.实例化的过程

   首先循环所有的BeanDefinition列表,然后调用getBean()方法,检查是否被实例化,如果没有被实例化则调用createBean()方法,具体的实例化是利用cglib类库,通过Java反射原理,构造函数实例化方式去实例化。然后组装Bean,把Bean属性设置进去,这里就是依赖注入了,把实例化好的serviceInstance注入到Service中。实例化成功后将实力保存到singletonObjects Map中。

所有的Bean被实例化后,会被存入这个Map中供后续使用。

DefaultSingletonBeanRegistry.java

    /** Cache of singleton objects: bean name --> bean instance */
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>();

4.Bean的Scope

  (1)Singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例。

 

  (2)Prototype:每次调用新建一个Bean实例。

 

  (3)Request:Web项目中,给每一个 http request 新建一个Bean实例。

 

  (4)Session:Web项目中,给每一个 http session 新建一个Bean实例。

 

  (5)GlobalSession:这个只在portal应用中有用,给每一个 global http session 新建一个Bean实例。

 

其中request,session和global session只适用于Web应用程序中,通常是与XmlWebApplicationContext一起使用,在实现上,singleton和prototype两种类型的容器的标准类型,而Scope request,session和global session是继承于自定义的Scope接口,如果用户有特殊的需要,可以继承这个接口并注册到容器中,即可使用用户自定义的Scope类型。用户自定义的Scope必须自己维护所管辖对象的初始化及销毁,即容器将这些对象的生存周期委托给Scope管理,而容器只管理Scope对象本身就可以。

5. 注解怎么做到声明接口就可以将实现类注入?

Spring主要利用了Class.isAssignableFrom()方法来实现接口与实现类的匹配。

  Class1.isAssignableFrom(Class2):如果Class1是Class2本身或者是其接口或者父类,则返回true,否则返回false;

以testService的实例化为例,当Spring容器启动的时候,首先会读取配置文件,经过定位、加载、解析、注册,最终把标注了注解的类(例如:标注了@Service的TestServiceImpl)注册到BeanDefination的Map中并且缓存。

然后,在实例化testService的时候,Spring此刻并不知道testService的实现类是哪个,而是循环遍历BeanDefinitionMap中的Bean,逐一与ITestService接口进行类型匹配,一旦匹配上就认定为其实现类,并对其进行实例化。

 

参考—-http://www.cnblogs.com/notDog/p/5420727.html

            https://www.cnblogs.com/dyppp/p/7397290.html

            https://www.imooc.com/article/19601

发表于 2018-05-16 15:16 问题大白 阅读() 评论() 编辑 收藏

 

版权声明:本文为technologykai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/technologykai/p/9046168.html

面试真题--------spring源码解析IOC的更多相关文章

  1. Spring Boot 2.0 教程 – 配置详解

    Spring Boot 可以通过properties文件,YAML文件,环境变量和命令行参数进行配置。属性值可 […]...

  2. Spring Cloud 服务的注册与发现(Eureka)

    Eureka服务注册中心 一、Eureka Server Eureka Server是服务的注册中心,这是分布 […]...

  3. spring cloud微服务快速教程之(七) Spring Cloud Alibaba–nacos(一)、服务注册发现

    0、前言   什么是Spring Cloud Alibaba?   Spring Cloud Alibaba […]...

  4. spring cloud系列教程第六篇-Eureka集群版

    spring cloud系列教程第六篇-Eureka集群版 本文主要内容: 本文来源:本文由凯哥Java(ka […]...

  5. Spring Security实现RBAC权限管理

    Spring Security实现RBAC权限管理 一、简介 在企业应用中,认证和授权是非常重要的一部分内容, […]...

  6. Spring框架各模块功能介绍

    一. Spring是什么? Spring由Rod johnson开发; 是一个非常活跃的开源框架; 它帮助分离 […]...

  7. spring boot中表单验证的使用

    一、前言 为啥子要搞这个表单验证呢?答案简单而现实,举个栗子,你辛辛苦苦的写了一个录入个人信息的功能,比如年龄 […]...

  8. Spring笔记(10) – 日志体系

    Spring笔记 一、概况   在项目开发当中,日志对于我们开发或运维人员来说,是一个必不可少的工具。在线下我 […]...

随机推荐

  1. 程序员,你自豪什么

    老婆是一名建筑设计师,每天要盯着电脑画很长很长时间的图纸,有时候为了赶进度,还要熬夜加很长时间的班。特别累的时 […]...

  2. Laravel Excel安装及最简单使用

    官网:https://docs.laravel-excel.com 1、安装 1.1、安装要求: PHP: ^ […]...

  3. HackPorts

    HackPorts是一个OS X 下的一个渗透框架。 HackPorts是一个“超级工程”,充分利用现有的代码 […]...

  4. Java数据结构和算法 – 递归

    三角数字 Q: 什么是三角数字? A: 据说一群在毕达哥拉斯领导下工作的古希腊的数学家,发现了在数学序列1,3 […]...

  5. tomcat域名绑定设置

    域名绑定分为单域名绑定、多域名绑定,配置主要涉及到tomcat目录下conf/server.xml文件   一 […]...

  6. Pandas-高级部分及其实验

    Pandas-高级部分及其实验 有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的pytho […]...

  7. 安利一个基于Spring Cloud 的面试刷题系统。面试、毕设、项目经验一网打尽

    推荐...

  8. Linux中搭建常用服务器(搭建telnet服务器\\搭建web服务器\\搭建DNS服务器\\建DHCP服务器\\建FTP服务器)

    1、搭建telnet服务器 2、搭建DHCP服务器 3、搭建DNS服务器 4、搭建sendmail服务器 5、 […]...

展开目录

目录导航