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
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施加控制。