Spring IOC容器
BeanFactory 容器
BeanFactory采用懒加载(lazy-load)所以容器启动比较快,对象在第一次调用时才会被加载,BeanFactory提供容器最基本的功能,BeanFactory也可以说是一个管理Bean的工厂,主要负责初始化各种Bean,并调用其生命周期的方法。
最常见的实现类: org.springframework.beans.factory.xml.XmlBeanFactory,使用XmlBeanFactory类的构造函数来传递Resource对象。如:
Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
//获取文件
File file = new File("fileSystemconfig.xml");
Resource resource = new FileSystemResource(file);
BeanFactory beanFactory = new XmlBeanFactory(resource);
BeanFactory源码
package org.springframework.beans.factory;
public interface BeanFactory {
/**
* 用来引用一个实例,或把它和工厂产生的Bean区分开,就是说,如果一个FactoryBean的名字为a,那么,&a会得到那个Factory
*/
String FACTORY_BEAN_PREFIX = "&";
/*
* 四个不同形式的getBean方法,获取实例
*/
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
boolean containsBean(String name); // 是否存在
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;// 是否为单实例
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;// 是否为原型(多实例)
boolean isTypeMatch(String name, Class<?> targetType)
throws NoSuchBeanDefinitionException;// 名称、类型是否匹配
Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 获取类型
String[] getAliases(String name);// 根据实例的名字获取实例的别名
}
ApplicationContext 容器
ApplicationContext继承了BeanFactory接口,对象在启动容器时加载,在BeanFactory中许多功能要用编程方式来实现,但是ApplicationContext则可以使用注解来实现,ApplicationContext在BeanFactory的基础上增加支持了一些企业级功能
-
MessageSource,提供国际化的消息访问
-
ResourceLoader,资源访问,如:URL和文件
-
事件传播性,即支持AOP特性
-
载入多个有继承关系的上下文,使得每一个上下文都专注于一个特定的层次,比如应用的web层
常用获取ApplicationContext方法
FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或文件名数组,有相对路径与绝对路径
ApplicationContext factory=new FileSystemXmlApplicationContext("src/applicationContext.xml");
ApplicationContext factory=new FileSystemXmlApplicationContext("E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");
ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件。ClassPathXmlApplicationContext 编译路径总有三种方式:
ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext factory = new ClassPathXmlApplicationContext("file:E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");
二者的共同点
都是通过XML配置文件来加载Bean的。
二者的不同点
-
BeanFactory采用的是延迟加载(懒加载)形式来注入Bean的,即只有在使用到某个Bean时(即调用Bean时),才会对该Bean进行加载,这样的加载形式不能忘发现一些存在Spring中的配置错误。而ApplicationContext则是在容器启动时,一次性创建所有的Bean,这样的加载形式可以在容器启动时就发现Spring存在的配置错误。而不足点在于比较占用内存空间,当配置Bean较多时,程序启动较慢。
-
BeanFactory和ApplicationContext都支持BeanPostProcessor(后置处理器)、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。(Applicationcontext比 BeanFactory 加入了一些更好使用的功能。而且 BeanFactory 的许多功能需要通过编程实现而 Applicationcontext 可以通过配置实现。比如后处理 Bean , Applicationcontext 直接配置在配置文件即可而 BeanFactory 这要在代码中显示的写出来才可以被容器识别。 )
BeanPostProcessor和BeanFactoryPostProcessor的区别参考网址:Spring的BeanFactoryPostProcessor和BeanPostProcessor_江南好风景的博客-CSDN博客_beanpostprocess
-
BeanFactory主要是面对与 spring 框架的基础设施,面对 spring 自己。而 Applicationcontex 主要面对与 spring 使用的开发者。所以基本都会使用 Applicationcontex 。