怎样进行Spring中IOC容器的概述与设计

技术怎样进行Spring中IOC容器的概述与设计这篇文章将为大家详细讲解有关怎样进行Spring中IOC容器的概述与设计,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.

本文将详细介绍IOC容器在春季的概况和设计。文章内容质量很高,我就分享给大家作为参考。希望你看完这篇文章后有所了解。

1. Spring IoC容器概述

1.1 IoC容器和依赖反转模式

为什么要依赖反转?

,当依赖性被逆转时,依赖对象的获得实际上被逆转了。

如果协作对象的引用或依赖管理是由具体对象来完成的,就会导致代码的高耦合性和低可测试性。在面向对象系统中,对象封装了数据和数据处理,对象的依赖性往往依赖于数据和方法。因此,将对象的依赖注入框架和IoC容器中完成,可以在解耦的同时提高代码的可测试性。

00-1010在Spring中,IoC容器是实现依赖反转的载体,它允许对象在生成或初始化时直接将数据注入对象。还可以通过将对象的引用注入对象数据字段来注入对方法调用的依赖。这种依赖注入可以逐层递归地注入对象。

通过使用IoC容器,对象依赖的管理被反转并转移到对象之间的相互依赖关系由IoC容器进行管理,并由IoC容器完成对象的注入.的IoC容器

00-1010-

Spring中依赖反转的实现

在Spring IoC容器的设计中,我们可以看到两个主要的容器系列,一个是实现了BeanFactory接口的简单容器系列,只实现了容器的基本功能;

另一个是ApplicationContext,它作为容器的高级形式存在。它在简单容器的基础上增加了许多面向框架的特性,并对应用环境进行了许多调整。

00-1010 IOC容器的主界面设计如下图所示:

怎样进行Spring中IOC容器的概述与设计

从上图可以看出,IoC容器接口有两条设计路线:

这是从接口BeanFactory到HierarchicalBeanFactory,然后到ConfigableBeanFactory的主要设计路线。

二是以ApplicationContext接口为核心的接口设计路线。从BeanFactory到ListableBeanFactory和HierarchicalBeanFactory,再到ApplicationContext,然后到常用的WebApplicationContext或ConfigableApplicationContext。

图中绿色部分是抽象类和接口实现类的一部分,暂不研究。

对于第一个接口设计路线,BeanFactory定义了基本的容器设计规范。HierarchicalBeanFactory在继承了BeanFactory的基本接口后,增加了getParentBeanFactory()的接口功能,使得BeanFactory具备了父IoC容器的管理功能。下面的ConfigableBeanFactory主要定义了一些BeanFactory的配置功能(比如通过setParentBeanFacory()设置父IoC容器等)。).通过这些功能的叠加,定义了BeanFactory简单IoC容器的基本功能。

对于第二个接口设计路线,ListableBeanFactory和HierarchicalBeanFactory是连接BeanFactory和ApplicationContext的接口。BeanFactory接口的很多功能在ListableBeanFactory接口中进行了细化,在HierarchicalBeanFactory接口中增加了getParentBeanFactory()接口的功能,使BeanFactory具备了父IoC容器的管理功能。对于ApplicationContext接口,通过继承ResourcepatternResolver、ApplicationEventPublisher、Message Source等接口。它在BeanFactory简单容器的基础上增加了很多对高级容器特性的支持。

2. IoC容器系列的设计与实现

公共接口电子工厂{

StringFACTORY _ BEAN _ PREFIX=//如果从开始,则获取FactoryBean本身;否则,获取由FactoryBean创建的实例。

//获取Bean。

ObjectgetBean(strigname)throwsbean exception;//可以是别名。

TTgetBe

an(String name, Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
//判断是否包含bean。不管是抽象类,懒加载,是否在容器范围内,只要符合都返回true。所以返回true时,不一定能从getBean获取实例
boolean containsBean(String name);
//单例,原型,bean类型的判断
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
//获取bean 的类型,别名
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}

2.4 BeanFactory容器的设计原理

以XmlBeanFactory为例,来说明简单IoC容器BeanFactory的设计原理。

2.4.1 XmlBeanFactory类继承关系

怎样进行Spring中IOC容器的概述与设计

可以看出XmlBeanFactory继承自DefaultListableBeanFactory,在Spring中实际上是把DefaultListableBeanFactory作为一个功能完整的IoC容器来使用的。

2.4.2 XmlBeanFactory的实现

public class XmlBeanFactory extends DefaultListableBeanFactory {
    private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
    public XmlBeanFactory(Resource resource) throws BeansException {
        this(resource, null);
    }
    public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
        super(parentBeanFactory);
        this.reader.loadBeanDefinitions(resource);
    }
}
  • 从XmlBeanFactory的名字上可以看出,它是一个可以读取以XML文件方式定义的BeanDefinition的IoC容器。

  • 在XmlBeanFactory中初始化了一个XmlBeanDefinitionReader对象,用来处理以XML文件方式定义的BeanDefinition。

  • 构造XmlBeanFactory这个IoC容器时需要指定XML信息来源,这个信息来源需要封装成Spring的Resource类。

通过xml文件位置构造出Resource,然后将Resource传入XmlBeanFactory的构造函数。这样IoC容器就可以定位到需要的BeanDefinition信息来完成容器的初始化和依赖注入过程。

2.4.3 总结IoC容器的使用步骤

参考XmlBeanFactory的实现,我们以编程的方式使用DefaultListableBeanFactory来进行总结。

	public void mytest(){
		ClassPathResource resource = new ClassPathResource("applicationContext.xml");
		DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
		XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(factory);
		System.out.println(beanDefinitionReader.loadBeanDefinitions(resource));
		Person p = (Person) factory.getBean("personChild");
		System.out.println(p);
	}

发现再使用 IoC容器时需要以下几个步骤:

  1. 创建IoC容器的抽象资源,这个抽象资源定义了BeanDefinition的定义信息。

  2. 创建一个BeanFactory。这里是DefaultListableBeanFactory。

  3. 创建一个BeanDefinition的读取器,通过一个回调配置给BeanFactory。这里是XmlBeanDefinitionReader。

  4. 从定义好的资源位置读入配置信息,具体的解析过程由XmlBeanDefinitionReader来完成。完成整个载入和注册Bean定义后,就可以使用IoC容器了。

2.5 ApplicationContext接口

ApplicationContext的接口关系:如下图所示。

怎样进行Spring中IOC容器的概述与设计

可以看出ApplicationContext在BeanFactory的基础上增加了许多附加功能,为ApplicationContext提供了许多新特新,所以说,ApplicationContext在BeanFactory是一个高级形态意义的IoC容器。

2.6 ApplicationContext容器的设计原理

在ApplicationContext在BeanFactory容器中,以FileSystemXMLApplicationContext实现为例来说明ApplicationContext在BeanFactory容器的设计原理。
FileSystemXMLApplicationContext的源代码如下:

public class FileSystemXmlApplicationContext extends AbstractXmlApplicationContext {
	public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
			throws BeansException {
		super(parent);
		setConfigLocations(configLocations);
		//这个refresh操作会牵涉IoC容器启动的一系列操作。对不同的容器操作都是类似的,因此在基类中将他们封装好。
		if (refresh) {
			refresh();
		}
	}
	@Override
	protected Resource getResourceByPath(String path) {
		if (path != null && path.startsWith("/")) {
			path = path.substring(1);
		}
		return new FileSystemResource(path);
	}
}

由代码可以看出主要功能已经在基类AbstractXmlApplicationContext中实现了,在FileSystemXmlApplicationContext中只需要二个与自身设计有关的功能。

功能一

应用直接使用FileSystemXmlApplicationContext容器时,对于实例化这个应用上下文的支持,及启动IoC容器的refresh功能。

功能二

不同的容器实现对应着不同BeanDefinition读取实现,在FileSystemXmlApplicationContext的读取BeanDefinition实现如上面的代码所示。

关于怎样进行Spring中IOC容器的概述与设计就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/51142.html

(0)

相关推荐

  • 特此汇报,煤矿事故向上级汇报应该是谁汇

    技术特此汇报,煤矿事故向上级汇报应该是谁汇根据《矿山安全法》(2009年修订)第二十条第二款关于“矿长对本企业的安全生产工作负责”之规定,发生事故的煤矿企业的矿长应负责及时报告该煤矿的主管部门及其所在地的安监部门特此汇报

    生活 2021年10月21日
  • sketchformac矢量绘图设计软件(sketchformac矢量绘图软件)

    技术Sketch for mac矢量绘图设计软件怎么用这篇文章将为大家详细讲解有关Sketch for mac矢量绘图设计软件怎么用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定

    攻略 2021年12月24日
  • 抖音点赞3元100个,抖音怎么刷点赞上热门

    技术抖音点赞3元100个,抖音怎么刷点赞上热门大家务必要可以客观的应对抖音短视频粉丝领域的收费标准价钱规范,并并不是贵的才算是好的自然也并不一定划算的价钱全是不靠谱的,只是要可以融合自身的要求选择专业靠谱的服务平台,而且

    测评 2021年10月26日
  • 瓷砖打眼,在瓷砖上面打孔有什么好的办法

    技术瓷砖打眼,在瓷砖上面打孔有什么好的办法在玻化砖上开孔或者打孔的过程中,出现瓷砖开裂是一个比较常见的问题,下面就为大家介绍一下,如何去避免在后期的安装工作中打孔将瓷砖打裂的问题,个人觉得可以从以下几个方面着手: 1、检

    生活 2021年10月22日
  • 纯技术每日一题

    技术纯技术每日一题 纯技术每日一题纯技术每日一题
    一、11/4 (token、过期、分布式、多个节点多次调用)
    业务背景小猛同学正在压测,发现个小问题,因为在终端设备上跟鹅厂有紧密合作,调用他们的接口时

    礼包 2021年11月5日
  • 初探卡特兰数及有关问题

    技术初探卡特兰数及有关问题 初探卡特兰数及有关问题星期日,哥参加了上大学以来的第一次计算导论与程序设计的上机考试,可是最后一道题没AC。
    这道题给了卡特兰数的一种通项公式,让你求卡特兰数的第n项。
    从考

    礼包 2021年11月26日