BeanFactory和ApplicationContext介绍

Posted 夜空中最亮的星

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BeanFactory和ApplicationContext介绍相关的知识,希望对你有一定的参考价值。

BeanFactory的类结构

ListableBeanFactory:该接口定义了访问容器中Bean基本信息的若干方法,如查看Bean的个数,获取某一类型Bean的个数、获取某一类型Bean的配置名、查看容器中是否包含某一类型的Bean等

HierarchicalBeanFactory:父子级联Ioc容器接口,子容器通过接口方法访问父容器

ConfigurableBeanFactory:这是一个重要的接口,增强了Ioc容器的可定制性。它定义了设置类转载器、属性编辑器、容器初始化后置处理器方法等

AutowireCapableBeanFactory:定义了将容器中的Bean按某种规则(如名字匹配或类型匹配) 进行自动装配

SingletonBeanRegistry:定义了在运行期向容器注册单实例Bean的方法

BeanDefinitionRegistry Spring配置文件中每一个<bean> 节点元素在Spring容器里都通过一个BeanDefinition对象表示,它描述了Bean的配置信息,而 BeanDefinitionRegistry接口提供了向容器手工注册BeanDefinition对象的方法

  案例 初始化BeanFactory   通过Spring配置文件为Car提供配置,然后通过BeanFactory装载配置文件,启动SpringIoc 容器

          beans.xml文件   Car配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<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.0.xsd">
   <bean id="car1" class="com.smart.Car" init-method="myInit" destroy-method="myDestory"
         p:brand="红旗CA72"
         p:maxSpeed="200"/>
</beans>

 

   测试代码

   public static void getBeanText() throws IOException {
//        获得资源加载器的默认实现
        ResourcePatternResolver res = new PathMatchingResourcePatternResolver();
        Resource resource = res.getResource("classpath:com/example/beanfactory/beans.xml");
        System.out.println(resource.getURL());
//        构建BeanFactory的默认实现类
        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
        reader.loadBeanDefinitions(resource);
        System.out.println("init BeanFactory");
        //在第一次调用的时候才会初始化bean对象
        Car car = factory.getBean("car", Car.class);
        System.out.println("car bean is ready for use!");
        car.introduce();
    }
View Code

XmlBeanDefinitionReader通过Resource装载Spring配置信息并启动Ioc容器,然后就可以通过BeanFactory#getBean(beanName)方法从Ioc容器中获取Bean,BeanFactory启动Ioc配置时,并不会初始化配置文件中得Bean,初始化动作发生在第一次调用。对于单实例Bean(singleton) ,BeanFactory会缓存Bean,在第二次getBean()获取Bean时,将直接从Ioc容器的缓存中获取Bean对象

Spring在DefaultSingletonBeanRegistry类中提供了一个用于缓存单实例Bean的缓存器,它是一个HashMap实现的缓存器,单实例的Bean以beanName为键保存在这个HashMap中

ApplicationContext介绍

ApplicationContext的主要实现类ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路劲加载配置文件,后者默认从文件系统中装载配置文件

拥有的接口方法:

  ApplicationEventPublisher:让容器拥有发布应用上下文的功能,包括容器启动事件和关闭事件。实现ApplicationListener事件监听器接口的Bean可以接受到容器事件,并对事件进行响应处理。在ApplicationContext抽象实现类AbstractApplicationContext中存在一个ApplicationEventMulticaster,它负责保存所有监听器,以便容器产生上下文事件时通知这些事件监听者。

  MessageSource 为应用提供i18国际化访问功能

ResourcePatternResolver 所有ApplicationContext实现类都实现了类似PathMatchingResourcePatternResolver的功能,可以通过带前缀的Ant风格的资源文件路径装载Spring的配置文件

LifeCycle:该接口提供start()和stop()方法

ConfigurableApplicationContext扩展ApplicationContext,它新增两个方法:refresh()和close(),让ApplicationContext具有启动、刷新和关闭应用上下文的功能 。在应用上下文关闭的情况下调用refresh()即可启动应用上下文,在已经启动的状态下调用refresh()可清除缓存并重新装载配置信息。

  //初始化上下文的时候就实例化Bean对象     ClassPathXmlApplicationContext默认在类路径下加载文件   也可以自己设定加载文件的Ant前缀
        ApplicationContext context = new ClassPathXmlApplicationContext("com/example/beanfactory/beans.xml");
//初始化上下文的时候就实例化Bean对象 FileSystemXmlApplicationContext默认在文件系统路径下载配置,也可以自己设定加载文件的Ant前缀
Application context=new FileSystemXmlApplicationContext("com/example/beanfactory/beans.xml");

   BeanFactory和ApplicationContext在初始化对象的时候不同,BeanFactory在初始化上下文的时候并没有实例化配置文件中的Bean,而是在第一次调用的时候才实例化。 ApplicationContext在初始化上下文的时候就实例化Bean对象

 

 以带注解的java类提供的配置信息

//表示是一个配置信息提供类
@Configuration
public class Beans {
    //    定义一个Bean类
    @Bean(name = "car")
    public Car buildCar() {
        Car car = new Car();
        car.setColor("蓝色");
        car.setBrand("红旗");
        car.setMaxSpeed(200);
        return car;
    }
}

 

Spring为基于注解类的配置提供了专门的ApplicationContext实现  AnnotationConfigApplicationContext,使用此类启动Spring容器

 //初始化基于注解的Bean类
    public static void textAnnotation() {
        ApplicationContext context = new AnnotationConfigApplicationContext(Beans.class);
        Car car = context.getBean("car", Car.class);
        car.introduce();
    }

 Spring同样为Groovy配置类,提供专门的ApplicationContext实现 GenericGroovyApplicationContext,使用此类启动Spring容器

 

 

 

 

   

  

 

以上是关于BeanFactory和ApplicationContext介绍的主要内容,如果未能解决你的问题,请参考以下文章

BeanFactory和ApplicationContext的区别

Spring之BeanFactory和FactoryBean接口的区别

从getBean()分析BeanFactory和ApplicationContext

beanFactory、ApplicationContext和FactoryBean的区别

spring的BeanFactory和ApplicationContext

BeanFactory和ApplicationContext