Spring通过一个配置文件描述Bean和Bean之间的依赖关系,利用Java反射功能实例化Bean,并建立Bean之间的依赖关系。
Spring的IOC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。
BeanFactory是Spring框架最核心的接口,它提供了高级IOC的配置机制。
ApplicationContext建立在BeanFactory的基础上,提供了更多面向应用的功能, 它提供了国际化支持和框架事件体系。
我们一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文,但有时候为了行文方便,我们也将ApplicationContext称为Spring容器。
对于BeanFactory 和 ApplicationContext的用途:
BeanFactory是一个类的通用工厂,可以创建并管理各种类的对象。
这些被创建和管理的对象,并无特别之处,仅仅是一个POJO,Spring称这些被创建和管理的Java对象为bean.
所有可以被Spring容器实例化并管理的Java类都可以成为Bean。
BeanFactory的主要方法是 getBean(String beanName). 该方法从容器中返回特定名称的Bean.
BeanFactory的功能通过其他接口得到不断的扩展,主要有以下几个接口
Plane.java
package com.xgj.master.ioc.beanfactory;
public class Plane {
private String brand;
private String color;
private int maxSpeed;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
public void introduce(){
System.out.println("Plane brand:" + brand + " ,Color:" + color + ",maxSpeed:" + maxSpeed);
}
}
bean-plane.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<bean id="plane" class="com.xgj.master.ioc.beanfactory.Plane"
p:brand="A380" p:color="Blue" p:maxSpeed="700" />
beans>
BeanFactoryTest.java
package com.xgj.master.ioc.beanfactory;
import java.io.IOException;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
public class BeanFactoryTest {
public static void main(String[] args) throws IOException {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource resource = resolver.getResource("classpath:com/xgj/master/ioc/beanfactory/bean-plane.xml");
System.out.println(resource.getURL());
//BeanFactory factory = new XmlBeanFactory(resource); 被废弃,不建议使用
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions(resource);
System.out.println("inti BeanFactory successfully");
Plane plane = beanFactory.getBean("plane",Plane.class);
System.out.println("Plane Bean is ready to use");
plane.introduce();
}
}
解读:
XmlBeanDefinitionReader 通过Resource装载Spring配置信息并启动IOC容器,然后就可以通过BeanFactory#getBean(beanName)方法从IOC容器中获取bean。
通过BeanFactory启动IOC,初始化动作发生在第一调用时。
对于单实例singleton的bean来将,BeanFactory会缓存bean实例, 所以第二次使用getBean()时,将直接从IOC容器的缓存中获取Bean实例。
Spring在DefaultSingletonBeanRegistry类中提供了一个用户缓存单实例bean的缓存器, 是一个HashMap实现的缓存器。 beanName作为键保存在map中。