Spring中的IoC容器原理分析

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的初始化。

猜你喜欢

转载自blog.csdn.net/bat_xu/article/details/81942544