1. 什么是容器
这里说的Spring容器一般就是指IOC容器,Spring 框架的最核心基础的功能是IOC(控制反转)容器,IOC也叫依赖注入(DI)。
org.springframework.beans和org.springframework.context两个包是实现spring IoC功能最基础的两个包.BeanFactory接口提供一种能够管理任何类型对象的高级配置机制.ApplicationContext是BeanFactory的子接口.ApplicationContext增加与Spring AOP功能的集成;消息处理,事件发布;以及特定应用层相关的Context比如用于web应用中的WebApplicationContext
简单来说,BeanFactory接口提供了配置框架和基本功能,ApplicationContext增加了更多针对企业应用的功能.bean的定义:在spring中,构成我们的应用程序且被spring IoC容器管理的对象(object)就叫做bean.
1.1 容器实现类
org.springframework.context.ApplicationContext接口代表了Spring IoC 容器,负责实例化,配置,组装前面所说的beans.IoC容器通过解析配置元数据获取有关要实例化,配置和组装的对象的信息.配置元数据包 含在XML文件,java注解,或者java 代码.这些元数据能够表示组成我们应用程序的对象以及这些对象之间丰富的依赖关系.
Spring提供了ApplicationContext接口的几个实现.在独立的应用程序中通常会创建一个
ClassPathXmlApplicationContext实例或FileSystemXmlApplicationContext实例.然而XML文件是传统配置元数据的方式,我们可以通过在XML文件中通过少许的配置,使得容器支持java 注解,java代码方式来配置元数据。
ApplicationContext继承实现关系:
BeanFactory是最顶层接口,提供一种能够管理任何类型对象的高级配置机制。ApplicationContext是BeanFactory的子类,它比BeanFactory提供了更加丰富的功能。
1.2 ApplicationContext
ApplicationContext容器
实例化此Spring容器常用的两种方式:
方法一:在类路径下寻找配置文件来实例化容器。
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"spring.xml"});
方法二:在文件系统路径下寻找配置文件来实例化容器。
ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[]{"d:\\beans.xml"});
BeanFactory和ApplicationContext在Bean加载方面有什么不同:
BeanFactory是延迟加载。BeanFactory初始化完成后,并不加载任何Bean,只有在第一次获取Bean时,BeanFactory才会加载该Bean。而ApplicationContext会在启动后主动加载好单例Bean,这样,从ApplicationContext中获取Bean时效率更高。
2. IOC和DI
在平时的Java应用开发中,我们要实现某一个功能或者说是完成某个业务逻辑时至少需要两个或以上的对象来协作完成,在没有使用Spring的时候,每个对象在需要使用他的合作对象或者依赖对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上,自己需要哪个合作对象,就主动去创建,创建合作对象的主动权和创建时机是由自己把控的,而这样就会使得对象间的耦合度高了,A对象需要使用合作对象B来共同完成一件事,A要使用B,那么A就对B产生了依赖,也就是A和B之间存在一种耦合关系,并且是紧密耦合在一起,而使用了Spring之后就不一样了,创建合作对象B的工作是由Spring来做的,Spring创建好B对象,然后存储到一个容器里面,当A对象需要使用B对象时,Spring就从存放对象的那个容器里面取出A要使用的那个B对象,然后交给A对象使用,至于Spring是如何创建那个对象,以及什么时候创建好对象的,A对象不需要关心这些细节问题(你是什么时候生的,怎么生出来的我可不关心,能帮我干活就行),A得到Spring给我们的对象B之后,两个人一起协作完成要完成的工作即可。
所以控制反转IOC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IOC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IOC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IOC容器了,通过IOC容器来建立它们之间的关系。
3. IOC的实现原理—反射与工厂模式
IOC中最基本的技术就是“反射(Reflection)”编程,通俗来讲就是根据给出的类名(字符串方式)来动态地生成对象,这种编程方式可以让对象在生成时才被决定到底是哪一种对象。只是在Spring中要生产的对象都在配置文件中给出定义,目的就是提高灵活性和可维护性。
我们可以把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言提供的反射机制,根据配置文件中给出的类名生成相应的对象。从实现来看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
网友评论