深入理解Spring的IOC容器

IOC概述

IOC是Spring容器的内核,AOP、声明式事务等功能都依赖于此功能,它涉及代码解耦、设计模式、代码优化等问题的考量,我们将通过以下三个方面来深入理解IOC:

IoC的初步理解

IoC的注入类型

构造器注入:通过调用类的构造函数,将接口实现的类通过构造函数变量传入。

属性注入:通过setter方法完成调用类所需依赖的注入,更加灵活方便。

接口注入:将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入方法。

IoC的注入方式

Spring最为一个容器,通过配置文件或者注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入的工作。

java反射机制

java语言允许通过程序化的方式间接对Class的对象实例操作,class文件有类加载器加载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知class的结构信息,如构造函数、属性和方法等。

ClassLoader:

类加载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件,主要工作由classLoader及其子类负责,ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入class字节码文件。

ClassLoader工作机制:

装载:查找和导入class文件

链接:执行校验,准备和解析步骤

初始化:对类的静态变量、静态代码块执行初始化工作

Java反射机制:

Class反射对象描述类语义结构,可以从Class对象中获取构造函数,成员变量,方法等类元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射类对象在java.reflect包中定义,下面是最主要的三个反射类:

Constructor

Method

Field

Java反射机制与IOC的关系:

在Spring中,通过IoC可以将实现类、参数信息等配置在其对应的配置文件中,当需要更改实现类或参数信息时,只需要修改配置文件即可,还可以对某对象所需要的其他对象进行注入,这种注入方式都是在配置文件中做的。

Spring的IoC的实现原理利用的就是Java的反射机制,Spring的工厂类会帮助我们完成配置文件的读取、利用反射机制注入对象等工作,我们还可以通过Bean的名称获取对象的对象。

资源访问工具类

JDK所提供的访问资源的类并不能很好的满足各种底层资源的访问需求,因此,Spring设计了一个Resource接口,它为应用提供了更强大的访问底层资源的能力:

主要方法:

boolean exists()

boolean isOpen()

URL getURL()

File getFile()

InputStream getInputStream()

主要实现类:

ByteArrayResoure

ClassPathResource

FileSystemResource

InputStreamResource

ServletContextResource

UrlResource

为了访问不同的资源,必须使用相应的Resource实现类,这是比较麻烦的,Spring提供了一个强大的加载资源的机制,能够自动识别不同的资源类型

资源类型地址前缀:

classpath  classpath:

File    file:

http    http://

ftp     ftp://

无前缀

Ant风格的匹配符:

? 匹配文件名中的一个字符

* 匹配文件名中的任意字符

** 匹配多层路径

Ant风格的资源路径示例:

Classpath:com/t*st.xml

File:/home/hcn/*.xml

Classpath:com/**/test.xml

classpath:org/springframork/**/*.xml

BeanFactory和ApplicationContext

BeanFactory是Spring框架的最核心的接口,它提供了高级IoC的配置机制。

ApplicationContext建立在BeanFactory基础之上,提供了更多面向应用的功能,它提供了国际化支持和框架事件体系,更易于创建实际应用,一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文。

BeanFactory是一个类工程,可以创建并管理各种类的对象,Spring称这些创建和管理的java对象为Bean。在Spring中,Java对象的范围更加宽泛。

BeanFactory体系结构:

xmlBeanFactroy

ListableBeanFactory

HierarhicalBeanFactroy

ConfigurableBeanFactory

AutowireCapableBeanFactory

SingletonBeanFactory

BeanDefinitionRegistry

初始化顺序

创建配置文件

装载配置文件

启动IoC容器

获取Bean实例

ApplicaitonContext介绍:

ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置文件的方式实现。

ApplicationContext实现类:

ClassPathXmlApplicationContext

FileSystemXmlApplicationcontext

ConfigurableApplicationContext

Bean的生命周期

Spring容器中的Bean拥有明确的生命周期,由多个特定的生命阶段组成,每个生命阶段都允许外接对Bean施加控制。

时间: 2024-10-22 17:46:32

深入理解Spring的IOC容器的相关文章

好莱坞原则—Spring的IOC容器

IOC容器的概念,之前在学习SSH的时候,就有接触过.但那时候也仅仅是知道这么个概念,认为它非常难理解.事实上并非它难理解,而是我并没有停下来好好对它总结梳理过. IOC(Inversion of Control)简单介绍: 控制反转",并非一种技术.而是一种思想.一种主动提供服务的思想.所谓IOC,就是由Spring负责控制对象的生命周期和对象间的关系,与我们传统的在对象内部直接控制背道而驰. 在传统的程序开发中,完毕一个业务逻辑至少须要两个或两个以上的对象协助完毕.通常一个对象要使用另外一个

Spring框架IOC容器和AOP解析

主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置  一.Spring开源框架的简介  Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开

Spring IOC容器和Spring MVC IOC容器的区别

web.xml <context-param> <param-name>contextConfigLocation</param-name> <!-- 指定加载application配置文件 --> <param-value>classpath:spring/application.xml</param-value> </context-param> <listener> <listener-class&

Spring之IOC容器加载初始化的方式

引言 我们知道IOC容器时Spring的核心,可是如果我们要依赖IOC容器对我们的Bean进行管理,那么我们就需要告诉IOC容易他需要管理哪些Bean而且这些Bean有什么要求,这些工作就是通过通过配置文件告诉Spring 的IOC容器.在我们的完成这些配置文件以后,如果IOC容易要实现对这些Bean的管理,除了资源的定位还有一个很重要的一步就是完成IOC加载初始化,也就是配置文件的载入过程.完成IOC容器加载初始化的方式只要有三种,第一种就是通过File文件加载,第二种是通过Classpath

Spring核心技术IoC容器(八)

本文针对自动装载的一些注解进行描述. 基于注解的容器配置 @Required注解 @Required注解需要应用到Bean的属性的setter方法上面,如下面的例子: public class SimpleMovieLister { private MovieFinder movieFinder; @Required public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } //

Spring的IOC容器—依赖注入

前面一篇博客大致讲了一下Spring的IOC容器的原理,IOC即控制反转主要是依靠依赖注入的方式来实现的.依赖注入是指所依赖的对象不是由自己new出来的,而是用别的方式像打针似的注入进来. 其实说白了不管是控制反转还是依赖注入都说明了Spring采用动态.灵活的方式来管理各种对象. Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理.有以下几种注入方式: 1. Setter 注入 因为对于javaBean来说,我们可以通过setter和getter方法

Spring的IOC容器—scope作用域

Scope 简介: Scope用来声明容器中的对象的存货时间.即容器在对象在进入其相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象. Sprign容器最初提供了两种bean的scope类型:singletoon和prototype.自Spring2.0之后,引入了另外三种scope类型,即request.session和global session类型.这三种类型只能再web中使用. 1.Singleton 代表在Spring的IOC容器

Spring 核心技术 IoC容器(一)

IoC 容器 IoC容器和Bean简介 这章包括了Spring框架对于IoC规则的实现.Ioc也同DI(依赖注入).而对象是通过构造函数,工厂方法,或者一些Set方法来定义对象之间的依赖的.容器在创建这些Bean对象的时候同时就会注入这些依赖.这个过程是根本上的反转了,不再由Bean本身来控制实例化和定位依赖,而是通过服务定位来控制这个过程,也是IoC(控制反转)的由来. org.springframework.beans和org.springframework.context包是Spring框

Spring核心技术IoC容器(六)

前文已经描述了Bean的作用域,本文将描述Bean的一些生命周期作用,配置还有Bean的继承. 定制Bean 生命周期回调 开发者通过实现Spring的InitializeingBean和DisposableBean接口,就可以让容器来管理Bean的生命周期.容器会调用afterPropertiesSet()前和destroy()后才会允许Bean在初始化和销毁Bean的时候执行一些操作. JSR-250的@PostConstruct和@PreDestroy注解就是现代Spring应用生命周期回