首先,所谓Ioc容器,是指一个能够容纳和管理Bean的容器,而BeanFactory是Spring Ioc容器实现类必须遵守的一个最基础的接口。
《Spring源码深度解析》里有一个最简单的例子:
首先写一个最简单的Bean:
package com.ls.spring.bean;
public class MyBean {
private String name = "Lon Bean";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后写一个xml配置文件beanFactory.xml,用来声明这个bean:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myBean" class="com.ls.spring.bean.MyBean"/>
</beans>
最后再Test类里测试BeanFactory:
package com.ls.spring.bean.factory;
import com.ls.spring.bean.MyBean;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import static org.junit.Assert.*;
@SuppressWarnings("deprecation")
public class BeanFactoryTest {
@Test
public void testSimpleLoad() {
Resource resource = new ClassPathResource("beanFactory.xml");
BeanFactory bf = new XmlBeanFactory(resource);
MyBean bean = (MyBean) bf.getBean("myBean");
assertEquals("Lon Bean", bean.getName());
}
}
执行之前可以看出XmlBeanFactory就是BeanFactory的具体实现类之一(它继承自DefaultListableBeanFactory,一个非常核心的类),而且从类名不难看出,它是一个与xml有关的BeanFactory,也就是说它是一个可以读取以xml文件方式定义的BeanDefinition(这个以后再看,现在我可以理解为一个包含bean集合的一种数据结构)的容器。
执行Test,我们会发现assertEquals断言成功了,证明MyBean已成功实例化,并且BeanFactory对象成功管理了MyBean实例,通过getBean方法来获取MyBean实例。
其实上面Test执行的步骤可简单地概括为:
1.读取配置文件BeanFactory.xml。
2.在BeanFactory.xml中找到对应的Bean类,并实例化,然后把实例交给BeanFactory对象管理。
3.通过getBean方法从BeanFactory对象中获取实例化后的实例。