博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 初始入口之ApplicationContext 分析
阅读量:6456 次
发布时间:2019-06-23

本文共 4345 字,大约阅读时间需要 14 分钟。

hot3.png

阅读源码可与UML图结合起来,我们这里可先充分利用IDEA及其插件查看UML图

(1) 给IDEA添加插件“UML Support” 。

(2) 打开Spring源码工程,默认为gradle工程,右键可点选单个类或者目录,弹出菜单可选择Diagrams,继续选择Show Diagrams,即生成UML图。

 

参考:

(0)  

(1)  

(2)  

(3)  

(4)  

(5)  

(6) 

 

1. 基本接口属性

由上图可知,ApplicationContext要实现或继承的接口类有:

 

接口名称

作用

1

ListableBeanFactory

该接口中定义了可以获取配置中所有bean的信息。继承自 BeanFactory ,提供对容器内的 bean 的枚举与遍历功能,主要功能有:查找是否有指定名称 bean 的定义 , 获取容器内 bean 的数量及所有 bean 的名称 , 根据指定类型获取 bean 的集合

2

HierarchicalBeanFactory

继承自 BeanFactory ,支持父子 BeanFactory 的继承,主要功能有判断当前 BeanFactory 中是否含有指定名称的 bean 、获取父 BeanFactory 。

3

ApplicationEventPublisher

ApplicationContext容器提供了容器内部事件发布功能,是继承自JavaSE标准自定义事件类而实现的。事件发布者在AbstractApplicationContext实现了具体代码,实际执行是委托给ApplicationEventMulticaster(可以认为是多播)参看(3)(4)

4

MessageSource

扩展了MessageSource接口,因而提供了消息处理的功能(i18n或者国际化)。与HierarchicalMessageSource一起使用,它还能够处理嵌套的消息,这些是Spring提供的处理消息的基本接口。Spring目前提供了两个MessageSource的实现:ResourceBundleMessageSource和StaticMessageSource。它们都继承NestingMessageSource以便能够处理嵌套的消息。StaticMessageSource很少被使用,但能以编程的方式向消息源添加消息。参看(5)

5

ResourcePatternResolver

Spring不仅可以通过ResourceLoader接口来取得单一的资源对象,还可以通过ResourcePatternResolver遍历并取得多个符合指定pattern的资源对象。这个设计向应用程序屏蔽了查找和遍历资源的复杂性。使支持通配符的使用来提高资源文件的查找方便性,如<property name="locations" value="WEB-INF/webx-*.xml" />可以直接得到所有符合pattern “WEB-INF/webx-*.xml”的配置文件。显然这是通过ResourcePatternResolver取得的。

6

EnvironmentCapable

 

 

2. ApplicationContext的实现

Spring主要提供了三种形式来初始化context:XML, annotation, groovy。目前我们只熟悉前两种,对groovy方式暂不研究。

 

(1) 选择"org.springframework.context.support" 展示Diagram,UML图如下:

 

网上文章给出的更大范围UML图:

 

方式 实现类

xml

ClassPathXmlApplicationContext

xml

FileSystemXmlApplicationContext

 

(2) 选择"org.springframework.context.annotation.AnnotationConfigApplicationContext",展示Diagram

 

 

方式 实现类
annotation

AnnotationConfigApplicationContext

 

(3) groovy的实现形式需要与"org.springframework.beans.factory.groovy.GroovyBeanDefinitionReader" 配合使用,该类用于读取groovy配置文件

 

(4) 总结

 

 

参考:

测试代码:

import java.io.IOException;

import com.etak.service.Person;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.support.DefaultListableBeanFactory;

import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;

import org.springframework.beans.factory.xml.XmlBeanFactory;

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.springframework.core.io.ClassPathResource;

import org.springframework.core.io.FileSystemResource;

import org.springframework.core.io.Resource;

 

public class Test {

 

    @org.junit.Test

    public void test1(){

        ApplicationContext ac = new ClassPathXmlApplicationContext("spring/spring-ioc-config.xml");

        Person p1=(Person)ac.getBean("person");

        System.out.println("test1 "+p1);

    }

    @org.junit.Test

    public void test2(){

//        ApplicationContext ac=new ClassPathXmlApplicationContext("spring-ioc-config.xml",this.getClass());

//        Person p1=(Person)ac.getBean("person");

//        System.out.println("test2 "+p1);

    }

 

    @org.junit.Test

    public void test3(){

        Resource resource=new ClassPathResource("spring/spring-ioc-config.xml");

        BeanFactory beanFactory = new XmlBeanFactory(resource);//

        Person p1 = (Person)beanFactory.getBean("person");

        System.out.println("test3 "+p1);

 

        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();

        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);

        reader.loadBeanDefinitions(resource);

        Person p2 = (Person)factory.getBean("person");

        System.out.println("test3 p2 "+p2);

 

    }

 

    @org.junit.Test

    public void test4() throws IOException{

//        Resource resource=new ClassPathResource("spring-ioc-config.xml",this.getClass());

//        BeanFactory beanFactory=new XmlBeanFactory(resource);

//        Person p1=(Person)beanFactory.getBean("person");

//        System.out.println("test4 "+p1);

    }

 

    @org.junit.Test

    public void test5(){

        Resource resource=new FileSystemResource("D:\\IProjects2\\web-spring-init\\src\\main\\resources\\spring\\spring-ioc-config.xml");

        BeanFactory beanFactory=new XmlBeanFactory(resource);

        Person p1=(Person)beanFactory.getBean("person");

        System.out.println("test5 "+p1);

    }

 

    @org.junit.Test

    public void test6(){

        ApplicationContext ctx = new AnnotationConfigApplicationContext(BeansConfig.class);

        Person p6 = (Person)ctx.getBean("firstPerson");

        System.out.println("test6 "+p6.getName());

    }

}

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/pagecorrect/blog/750659

你可能感兴趣的文章
HDOJ-1010 Tempter of the Bone
查看>>
MySQL my.cnf参数配置优化详解
查看>>
HDU/HDOJ 2102 A计划 广度优先搜索BFS
查看>>
JavaNIO基础02-缓存区基础
查看>>
阿里 Blink 正式开源,重要优化点解读
查看>>
日本开设无人机专业,打造无人机“人才市场”
查看>>
190行代码实现mvvm模式
查看>>
Unix下zfs文件系统重组RAID-5数据恢复案例
查看>>
让程序员最挠头的9大任务,你认同几项?
查看>>
《SOA达人迷》—第2章2.1节第1个问题:企业的商业生态系统是否广泛而复杂?...
查看>>
Storm-源码分析-LocalState (backtype.storm.utils)
查看>>
《Nmap渗透测试指南》—第2章2.15节路由跟踪
查看>>
《C++游戏编程入门(第4版)》——2.3 使用else子句
查看>>
有了800件T恤测量数据,能选出最合身的尺寸吗?
查看>>
《Unity 3.x游戏开发实例》一第1章 这是一个神奇的工具
查看>>
Java设计模式--中介者模式
查看>>
妈妈帮上云之路:云上平台架构与运维实践
查看>>
探讨innodb_locks_unsafe_for_binlog参数在RR隔离级别下取消了 gap lock产生的幻读
查看>>
iOS开发中WiFi相关功能总结
查看>>
心理大师于际敬:技术人群心理特征及压力管理
查看>>