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

    }

}

相關文章
相關標籤/搜索