Spring 初始入口之ApplicationContext 分析

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

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

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

 

参考:spring

(0) spring framework 4 源码阅读 http://blog.csdn.net/xiamizy/article/details/39178679编程

(1) spring的ioc之beanFactory http://997004049-qq-com.iteye.com/blog/1715436api

(2) ListableBeanFactory http://blog.csdn.net/jp260715007/article/details/5995300测试

(3) spring发布和接收定制的事件(spring事件传播) http://blog.csdn.net/it_man/article/details/8440737gradle

(4) 详解Spring事件驱动模型 http://jinnianshilongnian.iteye.com/blog/1902886this

(5) spring中MessageSource的配置使用方法3--ResourceBundleMessageSource http://blog.csdn.net/qyf_5445/article/details/8124431spa

(6) https://docs.spring.io/spring/docs/1.2.x/javadoc-api/org/springframework/core/io/support/ResourcePatternResolver.html

 

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) 总结

 

 

参考:初始化spring容器的几种方法

测试代码:

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);//@Deprecated

        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());

    }

}

相关文章
相关标签/搜索