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