BeanFactory
BeanFactory
是String中比较基础的一个容器,这个容器接口定义在spring.beans
包下,其主要功能是给依赖注入(DI)提供支持。
在Spring中,有大量对BeanFactory
接口的实现,其中,最常使用的是XmlBeanFactory,这个容器可以从一个XML文件中读取元数据,由这些元数据来生成一个被配置化的系统和应用。
一般BeanFactory都是应用在资源非常宝贵的移动设备或者基于applet的应用当中,其他情况下都不常用BeanFactory,而是优先选择ApplicationContext
.
在代码中如何使用:
我们先创建一个普通的类,作为Bean对象。
package model;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message=message;
}
public void getMessage(){
System.out.println("Your Message : "+message);
}
}
然后在spring配置文件中存入这个Bean对象:
<beans>
<!-- <bean id="user" class="model.UserBean"></bean>-->
<bean id="helloWorld" class="model.HelloWorld">
<property name="message" value="Hello BeanFactory!"></property>
</bean>
</beans>
在测试类App主程序中使用这个Bean对象:
import model.HelloWorld;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class App {
public static void main(String[] args) {
BeanFactory factory= new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
HelloWorld obj=(HelloWorld)factory.getBean("helloWorld");
obj.getMessage();
}
}
第一步,我们利用BeanFactory()
去生成一个工厂Bean,然后用ClassPathResource()去加载在路径ClassPath路径下可用Bean的配置文件,然后BeanFactory会创建并初始化所有的Bean对象,也就是我们在配置文件中存入的Bean.
第二步,我们通过工厂Bean的getBean方法来获取业务对象,然后通过id查询配置文件中对应的Bean,将这个Bean对象强转为HelloWorld类,当我们获得这个对象后,就可以调用它的任何方法。
上面程序执行后,结果如下:
Your Message : Hello BeanFactory!
ApplicationContext
ApplicationContext
是BeanFactory的子接口,也被称为Spring的上下文,通过这个上下文对象,我们就可以获得配置文件中我们存入的Bean,这个上下文对象等同于上面的工厂Bean.- ApplicationContext是Spring中比较高级的容器,和BeanFactory类似,可以读取和加载配置文件中的Bean,然后将这些Bean对象集中在一起,都有请求时分配Bean.
- ApplicationContext不仅有BeanFactory的功能,还在其基础上进行了扩展,比如从属性文件中解析文本信息和将事件传递给监听器等。
- ApplicationContext容器定义在org.springframework.context.ApplicationContext interface接口中,也就是定义在
spring.context
包下。 - ApplicationContext继承了BeanFactory的所有功能,所以一般情况下,相较于BeanFactory,我们优先选择使用ApplicationContext,但BeanFactory仍可在轻量级应用中使用,像移动设备和基于applet的应用中等等…
ApplicationContext有三个经常使用的实现:
- ClassPathXmlApplicationContext:从XML文件中加载和读取被定义的bean,使用该容器时,我们不需要提供具体的xml文件路径,只需要正确配置CLASSPATH环境变量,容器会自动从CLASSPATH中搜索bean的配置文件。
- FileSystemXmlApplicationContext:这个容器会从XML文件中加载和读取已经被定义的bean,使用这个容器的时候,我们需要提供完整的xml文件路径。
- WebXmlApplicationContext:从web应用程序范围内加载已经被定义的bean.
在代码中使用:
创建一个基本类,作为Bean对象:
package model;
public class HelloApplicationContext {
private String message;
public void setMessage(String message){
this.message=message;
}
public void getMessage(){
System.out.println("Your Message : "+message);
}
}
在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">
<beans>
<!-- <bean id="user" class="model.UserBean"></bean>-->
<bean id="helloAppCon" class="model.HelloApplicationContext">
<property name="message" value="Hello ApplicationContext!"></property>
</bean>
</beans>
</beans>
在测试类中读取出Bean对象,然后调用它的getMessage方法:
import model.HelloApplicationContext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext factory=new ClassPathXmlApplicationContext("spring-config.xml");
HelloApplicationContext obj=(HelloApplicationContext) factory.getBean("helloAppCon");
obj.getMessage();
}
}
第一步,通过ApplicationContext获取的spring的上下文对象,然后通过ClassPathXmlApplicationContext加载xml配置文件,创建并初始化所有的bean对象。
第二步,通过调用上下文对象的getBean方法,根据id查询得到具体的bean对象,然后调用它的getMessage方法。
上面程序执行后,结果如下:
Your Message : Hello ApplicationContext!
两者区别与联系
- 两者定义在不同的包下:ApplicationContext定义在spring.context中,而BeanFactory定义在spring.beans中。
- BeanFactory和ApplicationContext都是Spring下的顶级接口,ApplicationContext是BeanFactory的子类,除了继承了BeanFactory的基础功能外,ApplicationContext还支持其他的特性:如国际化(MessageSource)、访问资源(URL/文件)、载入多个上下文、AOP(拦截器)、消息发送响应等。
- 从性能角度考虑,BeanFactory的实现是使用懒加载的方式,只有我们调用的时候才进行实例化,需要哪个类就加载哪个类,比较轻量。而ApplicationContext是预加载,一次性加载并初始化所有的Bean,启动过程慢,但后续执行较快。