Spring~基础:ApplicationContext和BeanFactory的区别与联系

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,启动过程慢,但后续执行较快。

猜你喜欢

转载自blog.csdn.net/Merciful_Lion/article/details/124000481