IOC容器类对象

来源:互联网 发布:软件外包服务 编辑:程序博客网 时间:2024/05/22 12:07


一、BeanFactory类

BeanFacotry是spring中比较原始的Factory,是类的通用工厂,它可以创建并管理BEAN对象。

Spring为BeanFactory提供了多种实现,最常用的是DefaultListableBeanFactory替代,它最主要的方法就是getBean(String beanName),该方法从容器中返回特定名称的BEAN。

二、ApplicationContext类

ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能。ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,ApplicationContext包还提供了以下的功能:

MessageSource, 提供国际化的消息访问 
资源访问,如URL和文件
事件传播

BeanFactory类和ApplicationContext类都是IOC容器类,那么它们之间有什么区别呢?

BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean 时才实例化目标Bean;

而ApplicationContext 则在初始化应用上下文时就实例化所有单实例的Bean 。

下面我们通过代码来看一下它们的差别


1.新建几个简单的类,因为只是为了验证获取IOC容器时是否会实例化里面的类,所以在这几个类中我们不做复杂的业务逻辑,只有简单的输出信息

public class A {public A(){System.out.println("A");}}


public class B {public B(){System.out.println("B");}}


public class C {public C(){System.out.println("C");}}


2.在配置文件中对上诉几个类进行注册

<bean id="a" class="com.gec.bean.A"></bean><bean id="b" class="com.gec.bean.B"></bean><bean id="c" class="com.gec.bean.C"></bean>


3.利用BeanFactory类获取IOC容器

public class Test {public static void main(String[] args) {//拿到容器并不实例化里面的bean,直到访问bean时才创建bean的实例//获取资源文件ClassPathResource res=new ClassPathResource("beans.xml");//获取BeanFactory对象DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();//拿到BeanFactory的读取器XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader(beanFactory);//读取资源文件的内容reader.loadBeanDefinitions(res);}}

输出结果如下图所示,没有输出任何信息,说明获取容器后并没有创建bean类的对象

接下来我们访问bean类并查看输出结果,这时我们看到bean类已经实例化

public class Test {public static void main(String[] args) {//拿到容器并不实例化里面的bean,直到访问bean时才创建bean的实例//获取资源文件ClassPathResource res=new ClassPathResource("beans.xml");//获取BeanFactory对象DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();//拿到BeanFactory的读取器XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader(beanFactory);//读取资源文件的内容reader.loadBeanDefinitions(res);A a=(A) beanFactory.getBean("a");A a2=(A) beanFactory.getBean("a");B b=(B) beanFactory.getBean("b");}}




4.最后我们尝试用ApplicationContext类来获取IOC容器,可以看到在初始化应用上下文时就实例化容器内所有的bean类了

public class Test2 {public static void main(String[] args) {//一拿到容器就将容器内的所有bean实例化ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");}}



1 0
原创粉丝点击