閱讀源碼可與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
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);//@DeprecatedPerson 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());
}
}