• 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容器

       

      

  • 相关阅读:
    CocoaPods 中删除不需要的第三方
    真机测试是提示 的 iPhone is busy: Preparing debugger support for
    关于 Expression is not assignable 错误
    关于查询ios的app更新的历史版本记录
    ios开启双重认证之填坑式教学
    swift 有道 翻译文档(2 条件语句 循环语句)
    swift 有道 翻译文档(1 定义变量常量,数组字典)
    渐变UI
    cornerstone 使用
    cocoaPods安装
  • 原文地址:https://www.cnblogs.com/09120912zhang/p/7746019.html
Copyright © 2020-2023  润新知