Spring 之IOC容器(初级)

原创 2016年06月01日 21:52:34

Spring IOC容器(初级)

一、概念

1.容器:通俗的讲就是用来装东西的盒子,如果将东西装进容器里将使得我们对容器总的个体具备一定程度的可操作性,举个例子将1000个玻璃球放在一个瓶子里,执行如下的一些操作:

a) 瓶子中只允许存在一个蓝颜色的玻璃球(单例)

b) 为瓶子中黄颜色的玻璃球贴一个标签(切面)

c) 如果存在红颜色的玻璃球则必须存在唯一的一个黑颜色的玻璃球(依赖)

d) 欢迎补充

2.控制反转(Inversion of Control==IOC)&&依赖注入dependency injection (DI):通俗的理解我们要买一个杯子,一般的我们会主动的去超市买一个拿回来用,IOC的思想可以这么理解,我需要一个杯子我只需要告诉超市给我一个杯子,超市或者其它一个组织(超市或者组织扮演了容器的角色,自然“我”也应该处于容器的环境中)负责将杯子给我使用。总结如下:

a) 两个术语描述了同一个意思

b) IOC,主动变被动,需要什么只需要告诉某个组织(容器)即可

c) DI,需要什么就给你什么,社会主义的终极目标

3.Spring IOC:你能否想象得到如果将一个项目中的所有的Java对象都装在一个容器中,而各种类型的Java对象之间维持了一定的引用关系是多么有意义的一件事情吗?这将意味着我在使用一个Java对象的时候再也不需要显示的去New它了,只需要从IOC容器中获取一个即可。总结如下:

a) 用来装载、管理Java对象实例的“虚拟”容器

b) 本身也是一个Java类(面向对象语言的特性)

4.Spring Beans:通俗点,Bean指受IOC容器管理的Java对象

a) 有属性、构造器等一系列的属性

 

二、实现

1.IOC原型:由于面向对象语言特性Java中的容器依然是一个Java对象,这个Java对象使用某种数据结构(Map<String, Object>)管理了若干Spring Bean对象,Spring IOC容器的顶级接口为BeanFactory,ApplicationContext接口拓展了BeanFactory接口提供了AOP的支持,通常情况下使用的都是ApplicationContext间接子类如WebApplicationContextClassPathXmlApplicationContext等。

2.实现,以ClassPathXmlApplicationContext的实例化为例

a) 在xml中定义Spring Beans

<bean id="hello" class="cn.com.zjf.model.Hello">

<!-- 配置Bean对象的属性 -->

<property name="message" value="Hello World!!"></property>

</bean>

b) 显示实例化IOC容器

ClassPathXmlApplicationContext context =

    new ClassPathXmlApplicationContext("ApplicationContext.xml");

c) 设置XML资源位置&&刷新IOC容器

setConfigLocations(configLocations);

if (refresh) {

refresh();

}

d) 初始化IOC容器

try {

// Allows post-processing of the bean factory in context subclasses.

postProcessBeanFactory(beanFactory);

 

// Invoke factory processors registered as beans in the context.

invokeBeanFactoryPostProcessors(beanFactory);

 

// Register bean processors that intercept bean creation.

registerBeanPostProcessors(beanFactory);

 

// Initialize message source for this context.

initMessageSource();

 

// Initialize event multicaster for this context.

initApplicationEventMulticaster();

 

// Initialize other special beans in specific context subclasses.

onRefresh();

 

// Check for listener beans and register them.

registerListeners();

 

// 实例化剩余的非懒加载的单例Bean finishBeanFactoryInitialization(beanFactory);

 

// Last step: publish corresponding event.

finishRefresh();

}

e) finishBeanFactoryInitialization(beanFactory);做了什么

i. 获取所有Bean名称

List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);

ii. 遍历获取实例化Bean对象

for (String beanName : beanNames) {

getBean(beanName);

iii. 实例化Bean对象

if (mbd.isSingleton()) {

sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {

@Override

iv. Bean对象存储至数据结构

protected void addSingleton(String beanName, Object singletonObject) {

synchronized (this.singletonObjects) {

this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));

this.singletonFactories.remove(beanName);

this.earlySingletonObjects.remove(beanName);

this.registeredSingletons.add(beanName);

}

}

3.IOC容器中获取Bean对象,以获取idhello的对象为例

a) 获取Bean对象

Hello hello=context.getBean("hello", Hello.class);

b) AbstractApplicationContextgetBean方法

public <T> T getBean(String name, Class<T> requiredType) throws BeansException

c) AbstractApplicationContextdoGetBean方法

protected <T> T doGetBean(

final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)

d) 得到Bean对象(代码摘选)

Object singletonObject = this.singletonObjects.get(beanName);

 

Object sharedInstance = getSingleton(beanName);

 

版权声明:代码的魅力

SpringIOC容器的实现(简述)

Spring的IOC和DI实际上说的是同一件事情。 IOC:(Inversion of Control)控制反转,简单的将就是将原始类A使用类B时需要在类A中创建B的操作,交给第三方(容器),将...
  • moudaen
  • moudaen
  • 2014年06月04日 11:00
  • 955

Spring IoC容器构建过程分析(一)

ApplicationContext是spring IoC容器的顶级接口,其类结构图如下:
  • caihaijiang
  • caihaijiang
  • 2014年07月09日 22:26
  • 4844

Spring IOC容器之基础篇

一、首先简单熟悉一下Spring框架:                                         简要说明: IOC:相当于一个大的抽象工厂,通过依赖注入的方式,负责创建对象和...
  • lmdcszh
  • lmdcszh
  • 2013年09月30日 10:50
  • 4845

Spring IOC容器启动过程

IOC容器启动过程 资源定位(classpath,filesystem等) 载入,将bean定义转换为内部数据结构BeanDefintion 向IOC容器注册bean 资源定位定位配置文件,通过Bea...
  • sichenglain
  • sichenglain
  • 2016年12月18日 13:41
  • 657

Spring解析(一) IOC容器

本文介绍了IOC的基本原理和部分源码解析
  • mr253727942
  • mr253727942
  • 2016年02月12日 14:52
  • 1149

Spring 的 IOC 容器和SpringMVC 的IOC容器

不知道你们配置的时候,会不会引入两次Bean的情况需要进行 Spring 整合 SpringMVC 吗?还是否需要再加入 Spring 的 IOC 容器? 是否需要再 web.xml 文件中配置启动...
  • u012881904
  • u012881904
  • 2017年07月31日 20:30
  • 283

Spring IoC容器结构

Spring IoC容器 IoC容器主要作用就是创建并管理Bean对象以及Bean属性注入。如何创建Bean对象?是通过读取Bean配置文件生成相应对象。这些配置文件格式可能多种多样,xml、pro...
  • a327369238
  • a327369238
  • 2016年08月11日 14:44
  • 1176

Spring源码剖析——核心IOC容器原理

IOC介绍  相信大多数人在学习Spring时 IOC 和 Bean 算得上是最常听到的两个名词,IOC在学习Spring当中出现频率如此之高必然有其原因。如果我们做一个比喻的话,把Bean说成Spr...
  • lisongjia123
  • lisongjia123
  • 2016年08月05日 15:06
  • 4797

Spring 的 IOC 容器和 SpringMVC 的 IOC 容器 关系

需要进行 Spring 整合 SpringMVC 吗 ? 还是否需要再加入 Spring 的 IOC 容器 ? 是否需要再 web.xml 文件中配置启动 Spring IOC 容器的 Context...
  • u014695188
  • u014695188
  • 2016年06月02日 23:27
  • 5815

spring ioc 容器概念

spring ioc 容器 一个java应用程序是有很多类组成的,这些类相互协作、相互作用来提供应用程序的表现行为。那些被其它类组合提供某些行为的类,称之为其它类的依赖(dependencies)。...
  • doctor_who2004
  • doctor_who2004
  • 2016年02月08日 12:09
  • 2588
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring 之IOC容器(初级)
举报原因:
原因补充:

(最多只允许输入30个字)