码迷,mamicode.com
首页 > 移动开发 > 详细

BeanFactory和ApplicationContext介绍

时间:2017-10-28 11:13:08      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:pen   groovy   上下文   xmlns   col   instance   div   use   multicast   

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介绍

标签:pen   groovy   上下文   xmlns   col   instance   div   use   multicast   

原文地址:http://www.cnblogs.com/09120912zhang/p/7746019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!