Spring操作的对象是以bean为单位的,通常bean是从资源文件中引入的,如bean.xml。所以第一步讨论资源
一、资源的表示和加载
在Spring中设计了一个Resource接口,提供了很强的资源访问能力,常用的实现类为FileSystemResource(资源以文件系统绝对路径的方法表示),ClassPathResource(资源以相对类路径的方式表示),ServletContextResource(以相对webapp根目录的路径表示)
Resource res = new ClassPathResource("conf/bean,xml");
还可以指定资源编码方式
EncodedResource enRes = new EncodedResource(res, "UTF-8");
Spring提供了ResourceLoader接口给Resource的加载提供了很大的便利,对于不同的形式的资源路径不用使用像上面提到的三种不同的Resource实现类去加载,而且可以一次加载多个配置文件。
ResourceLoader的标准实现类为PathMatchingResourcePatternResolver,它提供了getResource( )方法支持带资源前缀的路径和Ant风格加载资源
Spring提供的一些资源地址前缀:
classpath:类路径
file:文件系统路径,绝对路径或相对路径
ResourcePattenResolver resolver = new PathMatchingResourcePatternResolver();
// getResources()一次加载多个资源
Resource[] resources = resolver.getResources("classpath*:com/demo/**/*.xml");
二、bean的实例化及管理,容器的初始化
Spring中有两个重要的容器,BeanFactory为IoC容器实现了bean的实例化,管理和一些高级服务,ApplicationContext是在BeanFactory的基础上提供了更多面向应用的服务,所以BeanFactory面向底层,ApplicationContext更面向开发人员。
BeanFactory类结构体系:
几个重要的接口:
ListableBeanFactory:提供访问容器中的Bean列表的一些方法,如bean的个数等
ConfigurableBeanFactory:提供了类装载器,属性编辑器,容器初始化后处理器等方法
AutowireCapableBeanFactory:提供了容器中bean按名字类型等自动装配的方法
BeanDefinitionRegistry:提供了向容器注册BeanDefinition的方法,BeanDefinition是Spring中<bean>节点元素的表示形式
最重要的实现类DefaultListableBeanFactory则实现了以上各种操作。XmlBeanFactory已经被废弃,现在使用XmlBeanDefinitionReader加载xml形式的Resource。
ResourcePattenResolver resolver = new PathMatchingResourcePatternResolver();
Resource resource = resolver.getResources("classpath*:com/demo/**/bean.xml");
DefaultListableBeanFactory factory = new DefaultLiatableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
Car car = factory.getBean("car",Car.class);
ApplicationContext类结构体系:
重要接口:
ApplicationEventPublisher:让容器拥有发布应用上下文事件的功能,如容器的启动事件,关闭事件。
ResourcePattenResolver:实现了类似PathMatchingResourcePatternResolver的功能,可以通过ant风格的资源文件路径装载Spring的配置文件。
ConfigurableApplicationContext:新增了refresh(),close()方法可以启动应用上下文和关闭应用上下文。
ApplicationContext的初始化更简单:
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/demo/context/bean.cml");
Car car = ctx.getBean("car",Car.class);
现在除了配置文件配置bean,还可以通过Java类使用@Configuration注解和Groovy配置和注解配置。
WebApplicationContext是为Web应用设计的,拓展了ApplicationContext。
WebApplicationContext作为属性放进了ServletContext中,而WebApplicationContext可以获取ServletContext的引用,二者实现了融合。
WebApplicationContext在ApplicationContext的基础上拓展了ConfigurableWebApplicationContext接口,它允许通过配置实例化WebApplicationContext。
WebApplicationContext的初始化是有一定条件的,因为需要ServletContext实例,所以在有Web容器的前提下才能初始化。在web.xml中配置自启动Servlet或ServletContextListener就能借助它们完成启动ServletConext的工作。
web.xml:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这样就在web容器初始化时同时用过配置文件完成WebApplicationContext的初始化。