Spring4--IoC容器

背景

正在学习Spring4,记录一些重要的知识点,方便日后翻阅。

1.Ioc概述

所谓Ioc就是Inverse of Control控制反转,“控制”是接口实现类的选择控制权,“反转”是指这种选择控制权从调用类转移到外部第三方类或容器的手中。即某一接具体实现类选择控制权从调用类中移除,转交给第三方决定,即由Spring容器借由Bean配置进行控制。也有人用依赖注入的概念来代替IoC,即让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。

从注入方法上看,IoC主要可以划分为:构造函数注入,属性注入和接口注入。Spring支持构造函数注入和属性注入。

Spring通过配置文件或注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入工作,用了反射机制来实现这一功能。

2.类装载器ClassLoader

类装载器把一个类装入JVM中,需要经过一下步骤:

(1)装载:查找和导入Class文件。

(2)链接:执行校验、准备和解析步骤,解析步骤是可选的。校验:检查载入Class文件数据的正确性。准备:给类的静态变量分配存储空间。解析:将符号引用转换成直接引用。

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

类装载工作由ClassLoader及子类负责。JVM运行时会产生3个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(应用类装载器)。根装载器不是ClassLoader的子类,它使用C++编写,所以在java中看不到它。根装载器负责装载JRE的核心类库。ExClassLoader和AppClassLoader都是ClassLoader的子类,ExtClassLoader负责装载JRE扩展目录ext中的JAR类包,AppClassLoader负责装载Classpath路径下的类包。

根装载器是ExClassLoader的父装载器,ExClassLoader是AppClassLoader的父装载器。

JVM装载类时使用“全盘负责委托机制”,“全盘负责”是指当一个ClassLoader装载一个类时,除非显示地使用另一个ClassLoader,该类锁依赖及引用的类也由这个ClassLoader载入,“委托机制”是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这样能保证安全,不会有其他人写的基础类java.lang.String装载到JVM中。

每个类在JVM中都拥有一个对应的java.lang.Class对象,它提供了类结构信息的描述。Class没有public的构造方法。Class对象是在装载类时由JVM通过调用类装载器中的defineClass()方法自动构造的。

3.资源访问

Resource接口为应用提供了更强的底层资源访问的能力。

假设有一个文件位于web应用的类路径下,用户可以通过FileSystemResource以文件系统绝对路径的方式进行访问,通过ClassPathResource以类路径的方式进行访问,通过ServletContextResource以相对于web应用根目录的方式进行访问。

资源地址表达式:

 

Ant风格的资源地址支持3中匹配符:

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

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

**:匹配多层路径。

“classpath*:”会扫描所有这些JAR包及类路径下出现的com.smart类路径;而“classpath:”只会在第一个加载的com.smart包的类路径下查找。

Spring定义了一套资源加载接口,并提供了实现类:

ResourceLoader接口只有一个getResource(String location)方法,可以根据资源地址加载文件资源,资源地址只支持带资源前缀的表达式,不支持Ant风格。ResourcePatternResolver两者资源地址表示法都支持。

4.BeanFactory和ApplicationContext

Spring通过一个配置文件描述Bean及Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。

Spring的IoC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。

BeanFactory提供了高级IoC的配置机制。

BeanFactory是类的通用工厂,它可以创建并管理各种类的对象。在Spring上,所有可以被Spring容器实例化并管理的java类都可以成为Bean。

BeanFactory的类继承体系:

可以通过调用getBean(beanName)方法从IoC容器中获取Bean。在初始化BeanFactory时,必须提供一种日志框架,我们使用Log4J,在类路径下提供Log4J配置文件。

ApplicationContext类体系结构:

BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例化目标Bean;而ApplicationContext则在初始化应用上下文时就实例化所有单实例的Bean。

WebApplicationContext是专门为Web应用准备的。从WebApplicationContext中可以获得ServletContext的引用,整个Web应用上下文对象将作为属性放置到ServletContext中,以便Web应用环境可以访问Spring应用上下文。

WebApplicationContext的类继承体系:

通过WebApplicationContextUtils的getWebApplicationContext(ServletContext sc)方法,可以从ServletContext中获取WebApplicationContext实例。     

5.BeanFactory中Bean的生命周期

 BeanFactory中Bean生命周期的图解:

 带星星的步骤是由InstantiationAwareBeanPostProcessor和BeanPostProcessor这两个接口实现的,一般称他们的实现类为“后处理器”。实现类以容器附加装置的形式注册到Spring容器中,并通过接口反射为Spring容器扫描识别。

ApplicationContext在启动时,将首先为配置文件中的每个<bean>生成一个BeanDefinition对象,BeanDefinition是<bean>在Spring容器中的内部表示。 

总结

BeanFactory、ApplicationContext、WebApplicationContext是Spring框架的3个核心接口,框架中其他大部分的类都围绕他们展开,为他们提供支持和服务。ResourceLoeader采用了策略模式,可以通过传入资源地址的信息,自动选择适合的底层资源实现类,为上层对资源的引用提供了极大的便利。           

这里写得有点乱,但是作为初学者,能记录一点是一点,后面再改正。          

猜你喜欢

转载自blog.csdn.net/a614528195/article/details/82997291