spring技术内幕读书笔记之ioc容器的学习

     2022-03-21     112

关键词:

第一篇:概念和设计原理

IoC容器的实现作为Spring的核心内容之一非常有必要拿来研究一下

1、概念

IoC(Inversion of Control,控制反转)必须思考的问题:哪些方面的控制被反转了?

对于这个问题,Martin Flower给出结论是:依赖对象的获得被反转了。基于此,他为控制反转创造了一个更好的名字:依赖注入。

SpringIoC模块是这一思想的一种实现,IoC容器把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,降低了组件之间的耦合度,利于功能复用,方便进行测试。

2、IoC容器的设计思想与实现

SpringIoC容器设计中有两个主要的容器系列:

①  实现了BeanFactory接口的简单容器系列,此类容器实现了容器最基本的功能。

②  ApplicationContext应用上下文,视为容器的最高形态存在,在实现简单容器的基础上增加了许多面向框架的特性,对应用环境做了许多适配。

spring中IoC容器的设计可参考下图:

技术分享

接下来对这两类容器进行详细分析,看他们是如何设计并实现的。

首先是BeanFactory

BeanFactory作为Spring最底层的一个IOC容器,只具备了对Bean管理的最基本的功能。

BeanFactory的定义:

public interface BeanFactory {
    //用 & 区分通过容器来获取BeanFactory产生的对象和获取FactoryBean本身
  StringFACTORY_BEAN_PREFIX = "&";
  //根据name取得IoC容器中管理的bean
  ObjectgetBean(String name) throws BeansException;
  <T>T getBean(String name, Class<T> requiredType) throws BeansException;
  <T>T getBean(Class<T> requiredType) throws BeansException;
  ObjectgetBean(String name, Object... args) throws BeansException;
  //判断是否有指定名字的bean
  booleancontainsBean(String name);
  //判断指定名字的bean是否是单例
  booleanisSingleton(String name) throws NoSuchBeanDefinitionException;
  //判断指定名字的bean是否是prototype类型的
  booleanisPrototype(String name) throws NoSuchBeanDefinitionException;
  //判断指定名字的bean是否是特定的class类型
  booleanisTypeMatch(String name, Class<?> targetType) throwsNoSuchBeanDefinitionException;
  //获取指定名称bean的class类型
  Class<?>getType(String name) throws NoSuchBeanDefinitionException;
  //获取指定名字bean的所有别名
  String[]getAliases(String name);
}

从BeanFactory的定义中可以看到容器的基本管理功能有哪些。

使用XmlBeanFactory进一步分析此类容器是如何实现的,先看XmlBeanFactory是如何定义:

public class XmlBeanFactory extendsDefaultListableBeanFactory {
    privatefinal XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
  publicXmlBeanFactory(Resource resource) throws BeansException {
      this(resource,null);
  }
  publicXmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throwsBeansException {
    super(parentBeanFactory);
    this.reader.loadBeanDefinitions(resource);
  }
}

可以看到XmlBeanFactory继承了DefaultListableBeanFactory。

DefaultListableBeanFactory是AbstractAutowireCapableBeanFactory的子类,而AbstractAutowireCapableBeanFactory实现了AutowireCapableBeanFactory接口,正是AutowireCapableBeanFactory继承了BeanFactory。

DefaultListableBeanFactory包含了基本IoC容器所具有的重要功能,很多地方会用到,像ApplicationContext,在spring中实际上是把DefaultListableBeanFactory作为一个默认功能完整的IoC容器来使用

继续说XmlBeanFactory,根据名称我们可以知道,XmlBeanFactory除了实现基本功能外,还增加了读取以XML文件定义的BeanDefeinition的功能。但XML文件定义的文件信息的处理并不是由XmlBeanFactory直接完成,而是在XmlBeanFactory中初始化了一个XmlBeanDefinitionReader,靠reader对象来处理。另外在构造XmlBeanFactory时需要指定BeanDefinition的来源,此来源需要封装成spring中的Resource类,Resource是spring中用来封装I/O操作的类,比如BeanDefinition信息是以XML的形式定义,那么可以使用像ClassPathResource res = new ClassPathResource("beans.xml");的方法构造Resource,然后传递给XmlBeanFactory的构造器,这样IoC容器就可以定位到需要的BeanDefinition信息来完成容器的初始化和依赖注入过程。

ClassPathResource res = newClassPathResource("SpringBeans.xml");
XmlBeanFactory factory = newXmlBeanFactory(res);
User user =(User)factory.getBean("userBean");

这就是此类容器的设计与实现了,但实际应用中我们通常不会采用这类容器(XmlBeanFactory甚至已经Deprecated),一般会采用较高级的ApplicationContext容器。

在ApplicationContext的设计中,一方面它继承了BeanFactory体系中的ListableBeanFactory,AutowrieCapableBeanFactory,HirearchicableBeanFactory等接口,具备了BeanFactory的基本功能,另一方面它通过继承MessageSource,resourceLoader,ApplicationEventPublisher接口,让它拥有更高级的IoC容器特性。

使用FileSystemXmlApplicationContext这一常用类分析此类容器。

先看FileSystemXmlApplicationContext的定义:

public classFileSystemXmlApplicationContext extends AbstractXmlApplicationContext {
    publicFileSystemXmlApplicationContext() {
  }
  ...
  publicFileSystemXmlApplicationContext(String[] configLocations, boolean refresh,ApplicationContext parent)throws BeansException {
      super(parent);
    setConfigLocations(configLocations);
    if(refresh) {
        refresh();
      }
  }
  @Override
  protectedResource getResourceByPath(String path) {
      if(path != null && path.startsWith("/")) {
        path= path.substring(1);
      }
    returnnew FileSystemResource(path);
  }
}

代码中省略了一些构造器。

ApplicationContext应用上下文的主要内容已经在基类AbstractXmlApplicationContext中实现,在FileSystemXmlApplicationContext中,作为一个具体的应用上下文,需要实现与它自身相关的两个功能:

一个功能是,如果应用直接使用FileSystemXmlApplicationContext,对实例化这个应用上下文的支持,同时启动IoC容器的refresh()过程,这个refresh会牵涉一些列复杂操作,而且不同的容器实现这些操作是相似的,所以封装在基类中,这里直接调用。也是由此方法启动IoC容器的初始化过程。

另一个功能是FileSystemXmlApplicationContext怎样从系统文件中加载XML的bean定义资源有关。不同的应用上下文实现对应着不同放入读取BeanDefinition的方式。重写的getResourceByPath可以说明这一点。

具体的refresh和getResourceByPath方法是如何调用的,以及像上面例子中xml文件如何处理的将在下一节IoC容器初始化中会有详细的过程讲解。

那么此类容器使用起来很容易:

ApplicationContext context = new FileSystemXmlApplicationContext("SpringBeans.xml");
User user = (User) context.getBean("userBean");

第二篇:IoC容器的初始化>>


《spring技术内幕》笔记-第二章ioc容器的实现

简单介绍1,在Spring中,SpringIoC提供了一个主要的JavaBean容器。通过IoC模式管理依赖关系。并通过依赖注入和AOP切面增强了为JavaBean这样子的POJO提供事务管理,生命周期管理等功能。2,SpringIoC的设计中,主要包括两个基本的容器... 查看详情

spring学习笔记

Spring学习笔记(一)因为最近在看《Spring技术内幕-深入解析Spring架构与设计原理》,相当于做了个笔记,以及把自己理解的东西记录下来。Spring整体架构图1.Spring子项目1.1SpringFramework(Core)  Spring项目的核心,其中包含IOC容器,... 查看详情

spring源码解析之ioc容器(代码片段)

...在技术的道路上注定走不长远。最近,学习了一段时间的spring源码,现在整理出来,以便日后温故知新。  IOC容器是spring最核心的模块之一,是整个spring体系的基石,spring其他模块中,都需要用到IOC容器的功能。spring框架为我... 查看详情

spring揭秘读书笔记二beanfactory的对象注冊与依赖绑定

本文是王福强所著<<spring揭秘>>一书的读书笔记我们前面就说过,Spring的IoC容器时一个IoCServiceProvider,并且IoCServiceProvider提供两个功能对象的创建,依赖关系的管理。只是,IoC容器这个词中,我们还得关注容器二字。它还包括了... 查看详情

spring.net入门学习笔记

一、基本概念  Spring.Net是一个轻量级的控制反转(Ioc)和面向切面的(Aop)的容器框架;Ioc:控制反转:简单的说就是将创建对象的控制权转交给外部容器(IApplicationContext);DI:依赖注入:其实就是将通过容器创建对象的... 查看详情

springinaction读书笔记——容器和依赖注入(代码片段)

容器java程序员都知道IOC和AOP是Spring的两大核心概念。IOC是控制反转,也就是通过注入的方式把原本由类自己完成的内部依赖对象实例化这个行为转交给Spring的容器去完成。IOC之后的一个很大的好处就是:代码里消除了无... 查看详情

spring学习笔记--环境搭建和初步理解ioc

  Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hibernate等其他众多的框架.  下面介绍环境的搭建,首先下载好spring的完... 查看详情

学习spring容器ioc之依赖和依赖注入

学习开涛跟我学spring3http://jinnianshilongnian.iteye.com/为什么要应用依赖注入,应用依赖注入能给我们带来哪些好处呢?1.动态替换Bean依赖对象,程序更灵活:替换Bean依赖对象,无需修改源文件:应用依赖注入后,由于可以采用配置... 查看详情

spring学习第0节--核心技术ioc容器ioc理解

耦合与内聚耦合是指模块间的依赖关系,内聚是指模块内组件的交互程度如果模块间依赖程度很高,那么在多人合作编程中,一个人的工作会很容易的受到另一个人工作的波及。 反射Java反射机制是指在运行状态下,完成对... 查看详情

学习笔记--spring框架

//概述轻量级,一站式,开发框架IoC,InversionofControl,控制反转DI,DependencyInjection,依赖注入AOP,Aspect-OrientedProgramming,面向切面编程:业务逻辑与非业务逻辑分离,如日志、安全...IoC容器:对象创建、装配对象生命周期管理上... 查看详情

《深入分析javaweb技术内幕》读书笔记——中文编码

为什么要编码在计算机中存储信息的最小单元是1个字节(8bit),所以能表示的字符范围是0-255个。人类要表达的字符太多,无法用1个字节完全表示。要解决这个问题需要使用新的数据结构char,从char到byte必须编码。 编码格... 查看详情

spring:笔记整理——ioc容器

IOC容器什么是IOC  IOC,全称Inversionofcontrol,即,控制反转,是一种设计思想。控制:在Java中,IOC意味着:你将设计好的对象交给容器控制,而不是传统的在你的对象内容直接控制。在传统程序设计中,我们直接在对象内容通过n... 查看详情

深入分析javaweb技术内幕读书笔记-第一章

第一章、深入web请求过程B/S架构带来了2个方面的好处。1、客户端使用统一的浏览器。2、服务端基于统一地http。 1.1B/S网络架构概述B/S网络架构从前端到后端都得到了简化,都基于统一地应用层协议HTTP来交互数据,与大多数... 查看详情

spring学习笔记

1.Spring框架的描述   1.Spring是一个开源框架   2.Spring为简化企业级应用开发而生   3.Spring是一个IoC/DI和AOP容器框架2.具体描述Spring   1.轻量级:Spring是非侵入式的-基于Spring开发的应用中的对象可以不依赖于Spring的API   2.... 查看详情

学习笔记——spring底层ioc实现;spring依赖注入数值问题;spring依赖注入方式

2023-01-14一、Spring底层IOC实现1、IOC:将对象的控制器反转给Spring2、BeanFactory与ApplicationContext(1)BeanFactory:IOC容器的基本实现,是Spring内部的使用接口,是面向Spring本身的,不是提供给开发人员使用的。(2)ApplicaitonContext:BeanFact... 查看详情

spring——ioc容器基本概念(代码片段)

       前一段时间在学习Spring,感觉Spring确实挺有魅力的,学习之后,对学过的知识简单的做一下总结,如果要总结IOC容器自然是少不了的,我前边有过一篇文章来介绍IOC的思想,但是没有涉及到Spring... 查看详情

spring核心思想之ioc总结

说到Spring的核心思想Ioc和aop不是Spring提出来的,在Spring之前就已经存在,只不过更偏向理论化,Spring在技术层次把两个思想做了非常好的实现(java)第一部分:什么是IOCIOCInversionofControl(控制反转/反转控制),注意它是?个技术思想... 查看详情

spring2——ioc之bean的装配

  spring容器对于bean的装配提供了两个接口容器分别是"ApplicationContext接口容器"和"BeanFactory接口容器",其中"BeanFactory接口容器"是spring的顶级接口容器,"ApplicationContext接口容器"继承了"BeanFactory接口容器",并且两个接口容器对于B... 查看详情