阅读源码可与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());
}
}