当前位置:主页 > java教程 > Spring IOC容器启动

Spring IOC容器启动示例分析

发布:2023-04-04 18:15:02 59


本站精选了一篇相关的编程文章,网友越睿才根据主题投稿了本篇教程内容,涉及到Spring、IOC容器启动流程、Spring、IOC容器、Spring IOC容器启动相关内容,已被459网友关注,涉猎到的知识点内容可以在下方电子书获得。

Spring IOC容器启动

一、简介

Spring核心有两个:

  • IOC:控制反转
  • AOP:面向切面编程

相信大家在项目中都使用过Spring进行开发,都知道Spring非常强大,那么在熟练掌握Spring进行开发后,我们有必要去了解一下其中的原理,Spring工作原理也是面试中必问的一个环节,先来看看几道常见的面试题,想想看,如果被面试官问到,你会怎么答?

  • Spring IOC的工作原理?
  • Spring Bean的生命周期是怎样的?
  • Spring 中使用到了哪些设计模式?
  • Spring是如何解决循环依赖的?
  • BeanFactory和FactoryBean的区别是什么?
  • ....

显然,我们需要从源码中获取我们想要的答案,本篇文章我们先来分析一下Spring中IOC容器整个初始化过程,本篇文章暂且先不详细分析源码实现,先把整个流程理清,后面再针对其中一些重要的环节逐个分析源码是如何实现的,这样可能没那么懵,不然一进来就直接一个一个细节去抠,可能跟着跟着不知道从哪个方法进来的了。

二、IOC整体流程

Spring IOC的核心工厂类其实就是BeanFactory,从名字上也很好理解,生产 bean 的工厂,它负责生产和管理各个 bean 实例。在项目中我们更多的是使用它的子类或者实现类,像常见的AbstractApplicationContext、ApplicationContext、DefaultListableBeanFactory、ClassPathXmlApplicationContext、AnnotationConfigApplicationContext等等。

我们先来回顾一下最基本的启动 Spring 容器的例子:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-config.xml");
System.out.println(applicationContext.getBean("student"));

如上代码就可以利用XML配置文件来启动一个 Spring 容器。

public ClassPathXmlApplicationContext(
			String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
			throws BeansException {
		super(parent);
		// 1、设置配置文件的路径
		setConfigLocations(configLocations);
		if (refresh) {
			//2、容器刷新方法:IOC核心方法就是refresh()
			refresh();
		}
	}

在ClassPathXmlApplicationContext的构造方法中,我们可以看到有一个refresh()方法,它是整个IOC容器的核心。

refresh()主要做了下述12件事情,先说个大概:

1、prepareRefresh()

容器刷新前的一些预处理工作。

2、obtainFreshBeanFactory()

创建DefaultListableBeanFactory工厂,给bean工厂设置一些属性,加载配置文件信息,封装成bean定义信息。

3、prepareBeanFactory(beanFactory)

同样,设置bean工厂的一些属性,如添加一些BeanPostProcessor增强器等。

4、postProcessBeanFactory(beanFactory)

模板方法,留给子类扩展实现。

5、invokeBeanFactoryPostProcessors(beanFactory)

执行BeanFactoryPostProcessor的postProcessBeanFactory ()增强方法。

6、registerBeanPostProcessors(beanFactory)

注册BeanPostProcessor增强器,注意这里只是注册,真正是在初始化阶段的前后执行。

7、initMessageSource()

初始化MessageSource,国际化处理。

8、initApplicationEventMulticaster()

初始化事件多播器。

9、onRefresh()

模板方法,留给子类扩展实现。

10、registerListeners()

注册一些监听器。

11、finishBeanFactoryInitialization(beanFactory)

IOC容器创建最重要的一个步骤:完成非懒加载的单例bean对象的实例化,包括反射创建bean对象、属性填充、循环依赖的处理、bean的初始化等等。

12、finishRefresh()

容器刷新完成之后的一些处理工作。

前面我们通过文字描述了refresh()方法主要的处理流程,下面通过两张图来说明,会更加形象,好理解一点:

这里可能稍微就涉及到一些细节了,有些许复杂,大家可以先过几遍,有个印象后自己再去看源码,相信会更加清晰里面的处理逻辑。

到此这篇关于Spring IOC容器启动示例分析的文章就介绍到这了,更多相关Spring IOC容器启动内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!


参考资料

相关文章

  • 最小化spring XML配置

    发布:2020-03-11

    这篇文章主要介绍了如何完成spring的最小化XML配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下


  • Spring Session(分布式Session共享)实现示例

    发布:2023-03-14

    这篇文章主要介绍了Spring Session(分布式Session共享)实现示例,文章内容详细,需要的朋友可以参考下


  • SpringMVC JSON数据传输参数超详细讲解

    发布:2023-04-10

    有时候参数的传递还需要更多的参数,比如一个获取用户信息的请求中既有用户ID等基本参数,还要求对查询结果进行分页,针对这种场景,一般都会将分页参数封装成一个对象,然后将它和基本参数一起传给控制器


  • Springboot项目全局异常统一处理案例代码

    发布:2023-04-22

    最近在做项目时需要对异常进行全局统一处理,主要是一些分类入库以及记录日志等,因为项目是基于Springboot的,所以去网络上找了一些博客文档,然后再结合项目本身的一些特殊需求做了些许改造,现在记录下来便于以后查看


  • springboot使用mybatis开启事务回滚

    发布:2023-04-14

    本文主要介绍了springboot使用mybatis开启事务回滚,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • SpringCloud Webflux过滤器增加header传递方式

    发布:2023-04-03

    这篇文章主要介绍了SpringCloud Webflux过滤器增加header传递方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • SpringBoot整合第三方技术的实现

    发布:2023-04-14

    本文主要介绍了SpringBoot整合第三方技术的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • SpringDataRedis简单使用示例代码

    发布:2023-04-15

    这篇文章主要介绍了SpringDataRedis简单使用,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下


网友讨论