Spring核心类和原理分析

spring 的骨架

spring 的骨架,也是spring 的核心包。主要包含三个内容

1.context:spring 的上线文-------导演

2.core:spring的核心包,主要包括spring所以用到的工具-------道具

3.beans:spring的bean实例 -------演员

导演负责安排演出,演员负责按照导演的指示来演出,演出过程中需要使用道具。

我想大家看完这些图片之后就明白大致的包关系了。

spring包结构

大家看到相应包内容。

core包侧重于帮助类,操作工具,beans包更侧重于bean实例的描述。context更侧重全局控制,功能衍生。

下面我们就针对context和factory对类的关系继续一个基本概括:

核心类之间的关系

我们先来看下bean包下的beanfactory类,以及抽象类等。

可以看到在接口的实现泛化的过程中,每一个接口在继承父接口的同时,也继承了父接口的一些方法。这就可以看出面向接口变成微妙之处。

BeanFactory【所有BeanFactory的父类】

可以看到beanfactory中定义了一些基本方法,包括根据名称获取bean实例等。

HierarchicalBeanFactory【层次化的BeanFactory】

可以看到此接口实现了层次化,及获取beanFactory的父容器

LisableBeanFactory列表式Beanfactory

可以看到为beanfactory设置了列表的功能,并且规划了如何从列表中取出相应的方法的能力。

小结:

从上述类命名以及接口规划可以看到,通过接口的不断继承,beanfactory被不断的丰富抽象起来。层层细分之后,没有个类都的职责都变的单一了,同时在扩展该的属性时也变的更加方便。针对源代码,最好的办法还是根据名称来,最方便。

context【上下线文】

可以看到到了context的初始化不同于beanfactory,可以侧重于抽象类型,具体的方法实现。

里面大部分方法使用了模板方法的设计模式,父类调用抽象方法,抽象方法在子类中实现,对象的独立性。

主要分成三种context:XML,Annotation,Groovy针对三种形式。

registry【实例或者bean描述注册器】

将初始化完成的bean注册的容器中,针对单例来部分,缓存单例实例。针对beanDefinition部分,缓存bean描述。

Strategy【初始化策略】

两种初始化策略 一种是简单策略,一种是cgilib的策略,当时这里使用的模式是策略模式。

context的初始化

[java] view
plain
 copy

  1. /**
  2. * 在parent下创建ClassPathXmlApplicaitonContext,
  3. * 从XML中读取所有Bean定义.
  4. * @param configLocations 配置文件路径如c:\simpleContext.xml
  5. * @param refresh 是否需要自动刷新context,refresh-->重新加载
  6. * 加载所有的bean定义,创建所有单例.
  7. * refresh为true的时候, 根据context来手工刷新
  8. * @param parent the parent context
  9. * @throws BeansException if context creation failed
  10. * @see #refresh()
  11. */
  12. public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
  13. throws BeansException {
  14. //初始化XmlApplicationContext
  15. super(parent);
  16. //转换配置文件的路径
  17. setConfigLocations(configLocations);
  18. if (refresh) {
  19. //重新刷新原有的context,这一篇的重点
  20. refresh();
  21. }
  22. }

下面我们来看下AbstractApplicationContext.refresh()方法

[java] view
plain
 copy

  1. //加载或刷新持久的配置,可能是xml文件,properties文件,或者关系型数据库的概要。
  2. //做为一个启动方法,如果初始化失败将会销毁已经创建好的单例,避免重复加载配置文件。
  3. //换句话说,在执行这个方法之后,要不全部加载单例,要不都不加载
  4. public void refresh() throws BeansException, IllegalStateException
  5. {
  6. synchronized (this.startupShutdownMonitor)
  7. {
  8. // 初始化配置准备刷新,验证环境变量中的一些必选参数
  9. prepareRefresh();
  10. // 告诉继承类销毁内部的factory创建新的factory的实例
  11. // 初始化Bean实例
  12. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
  13. // 初始化beanFactroy的基本信息,包括classloader,environment,忽略的注解等
  14. prepareBeanFactory(beanFactory);
  15. try {
  16. // beanfactory内部的postProcess,可以理解为context中PostProcess的补充
  17. beanFactory.postProcessBeanFactory(beanFactory);
  18. // 执行BeanFactoryPostProcessor(在beanFactory初始化过程中,bean初始化之前,修改beanfactory参数)、
  19. // BeanDefinitionRegistryPostProcessor 其实也是继承自BeanFactoryPostProcessor,
  20. // 多了对BeanDefinitionRegistry的支持invokeBeanFactoryPostProcessors(beanFactory);
  21. // 执行postProcess,那BeanPostProcessor是什么呢,是为了在bean加载过程中修改bean的内容,
  22. // 使用分的有两个而方法Before、After分别对应初始化前和初始化后
  23. registerBeanPostProcessors(beanFactory);
  24. // 初始化MessageSource,主要用作I18N本地化的内容
  25. initMessageSource();
  26. // 初始化事件广播ApplicationEventMulticaster,使用观察者模式,对注册的ApplicationEvent时间进行捕捉
  27. initApplicationEventMulticaster();
  28. // 初始化特殊bean的方法
  29. onRefresh();
  30. // 将所有ApplicationEventListener注册到ApplicationEventMulticaster中
  31. registerListeners();
  32. // 初始化所有不为lazy-init的bean,singleton实例
  33. finishBeanFactoryInitialization(beanFactory);
  34. // 初始化lifecycle的bean并启动(例如quartz的定时器等),如果开启JMX则将ApplicationContext注册到上面
  35. finishRefresh();
  36. }
  37. catch (BeansException ex)
  38. {
  39. //销毁已经创建单例
  40. resources.destroyBeans();
  41. // 将context的状态转换为无效,标示初始化失败
  42. flag.cancelRefresh(ex);
  43. // 将异常传播到调用者
  44. throw ex;
  45. }
  46. }
  47. }

我们从时序图来看启动上述初始化(门面模式facade)

Spring初始化逻辑

可以看出主要针对beans context 还有core包。

时间: 2024-10-10 07:35:44

Spring核心类和原理分析的相关文章

Spring Security4实战与原理分析视频课程( 扩展+自定义)

Spring Security概述与课程概要介绍 Spring Security快速入门(基于XML) Spring Security快速入门(基于XML) URL匹配详解 自定义登陆 配置退出 Ajax登陆退出 JDBC认证 层级角色关系 认证体系介绍 自定义认证 匿名认证 认证流程分析 配置权限 授权体系介绍 自定义授权 自定义JDBC授权 表达式权限原理分析 表达式权限扩展 自定义异常处理 过滤器分析 过滤器应用 FilterChainProxy初始化流程分析 授权流程分析 Spring

关于boost中enable_shared_from_this类的原理分析

首先要说明的一个问题是:如何安全地将this指针返回给调用者.一般来说,我们不能直接将this指针返回.想象这样的情况,该函数将this指针返回到外部某个变量保存,然后这个对象自身已经析构了,但外部变量并不知道,此时如果外部变量使用这个指针,就会使得程序崩溃. 使用智能指针shared_ptr看起来是个不错的解决方法.但问题是如何去使用它呢?我们来看如下代码: #include <iostream> #include <boost/shared_ptr.hpp> class Tes

spring boot应用启动原理分析

spring boot quick start 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个Web Server. 如果之前没有使用过spring boot可以通过下面的demo来感受下. 下面以这个工程为例,演示如何启动Spring boot项目: git clone [email protected]:hengyunabc/spring-boot-demo.git mvn spring-b

Spring Boot实战与原理分析

1:Spring Boot概述与课程概要介绍 2:Spring4 快速入门 3:Spring4 扩展分析(一) 4:Spring4 扩展分析(二) 5:Spring Boot 快速入门 6:Spring Boot 配置分析(一) 7:Spring Boot 配置分析(二) 8:Spring Boot 自动配置 9:Spring Boot @Enable*注解的工作原理 10:Spring Boot @EnableAutoConfiguration深入分析 11:Spring Boot 事件监听

Spring Boot实战与原理分析视频课程

1.Spring Boot概述与课程概要介绍 2.Spring4 快速入门 3.Spring4 扩展分析(一) 4.Spring4 扩展分析(二) 5.Spring Boot 快速入门 6.Spring Boot 配置分析(一) 7.Spring Boot 配置分析(二) 8.Spring Boot 自动配置 9.Spring Boot @Enable*注解的工作原理 10.Spring Boot @EnableAutoConfiguration深入分析 11.Spring Boot 事件监听

简单解析Spring核心IOC容器原理

将大体流程解析了一边,具体可以看源代码一个方法一个方法的跟下 XmlBeanFactory的功能是建立在DefaultListableBeanFactory这个基本容器的基础上的,并在这个基本容器的基础上实行了其他诸如XML读取的附加功能. DefaultListableBeanFactory是BeanFactory的一个默认实现类. public class XmlBeanFactory extends DefaultListableBeanFactory { private final Xm

Spring Boot自动配置原理分析

 [email protected]注解 @Configuratin注解是Spring框架提供的,表示当前类是一个配置类. @SpringBootConfiguration注解和 @Configuratin注解都是标识一个可以被组件扫描器扫描的配置类, 只不过@SpringBootConfiguration是被Spring Boot进行了重新的命名和封装. [email protected]注解 @EnableAutoConfiguration注解是一个组合注解,由@AutoConfigurat

Java入门到精通——框架篇之Spring源码分析Spring两大核心类

一.Spring核心类概述. Spring里面有两个最核心的类这是Spring实现最重要的部分. 1.DefaultListableBeanFactory 这个类位于Beans项目下的org.springframework.beans.factory.support包下. XmlBeanFactory(位于org.springframework.beans.factory.xml包)继承自DefaultListableBeanFactory,而DefaultListableBeanFactory

Tomcat 学习进阶历程之Tomcat架构与核心类分析

前面的http及socket两部分内容,主要是为了后面看Tomcat源码而学习的一些网络基础.从这章开始,就开始实际深入到Tomcat的'内在'去看一看. 在分析Tomcat的源码之前,准备先看一下Tomcat的架构与一些核心类的简单分析,并简单介绍一下Tomcat是如何处理一次Http请求的.这部分内容有相当一部分来源于网络,在此,感谢原作者的贡献. Tomcat的总体架构 Tomcat的架构关系可以从Tomcat的配置文件server.xml中看到端倪. 从上图中可以看出Tomcat 的心脏