ApplicationContext的孩子们

ConfigurableApplicationContext

继承了 ApplicationContext 获得了其所有能力:环境、可列举获取bean的容器、层级关系的容器、消息、事件发送、资源解析器

继承了 Lifecycle  获得了生命周期管理的 开启组件、停止组件、获取当前组件是否运行的能力

继承了 Closeable  获得了关闭IO流的能力

增加了 设置唯一ID、设置父容器、设置环境、增加后置处理器、增加应用监听器、增加资源解析器、刷新配置等配置能力。

 

AbstractApplicationContext

继承了 DefaultResourceLoader  获得了 资源加载的能力

实现了ConfigurableApplicationContext 接口。对接口中方法提供了通用的默认实现。 模板方法模式

核心在 refresh 方法

 

AbstractRefreshableApplicationContext

继承了AbstractApplicationContext 实现了部分抽象方法,

提出了新的抽象方法 loadBeanDefinitions 子类根据自身特性进行具体实现

 

AbstractRefreshableConfigApplicationContext

继承了AbstractRefreshableApplicationContext

并提供了config locations 的公共处理器。

 

AbstractXmlApplicationContext

继承了 AbstractRefreshableConfigApplicationContext

提供了通过 XmlBeanDefinitionReader 加载配置文件注册bean为 BeanDefinition 的能力

子类只需要实现 getConfigResources 方法

 

其中获取ConfigResources 提供给子类一个hook函数,使其可以自定义指定的configresources 代码如下所示:

    protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws         BeansException, IOException {
		Resource[] configResources = getConfigResources();
		if (configResources != null) { // 如返回不为null  钩子函数起作用了
			reader.loadBeanDefinitions(configResources);
		}
		String[] configLocations = getConfigLocations();
		if (configLocations != null) {
			reader.loadBeanDefinitions(configLocations);
		}
	}

	// 钩子函数,子类不重写直接使用默认实现
  	@Nullable
	protected Resource[] getConfigResources() {
		return null;
	}

 

ClassPathXmlApplicationContext

继承了 AbstractXmlApplicationContext

提供了设置 configLocations , 设置父容器,refresh 的功能。

### Spring ApplicationContext 使用与配置示例 #### 配置类创建 通过`@Configuration`和`@Bean`注解可以实现编码方式注册bean,这种方式更加简洁。此特性从Spring 3开始被引入并被称为Java Config。通常建议将此类配置放置于项目中的`config`包下,并以`XXXConfig.java`命名[^1]。 对于一个简单的例子来说,在名为`win.elegentjs.spring.ioc.config`的包内建立了一个叫做`PersonConfig`的类用于向IoC容器中注册`Person`类型的bean对象: ```java package win.elegentjs.spring.ioc.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import win.elegentjs.spring.ioc.beans.Person; @Configuration public class PersonConfig { @Bean public Person myPerson() { return new Person("张三", 30); } } ``` 上述代码展示了如何利用Java编程的方式代替XML来完成同样的功能,即定义了名称为`myPerson`的一个bean实例。 #### 获取ApplicationContext实例 为了获取到已经装配好的应用上下文环境(Application Context),可以通过如下几种常见的方式来取得: - `AnnotationConfigApplicationContext`: 当采用基于注解形式的应用程序配置时适用; - `ClassPathXmlApplicationContext`: 如果仍然倾向于使用传统的xml文件作为配置源,则可以选择该种方式; 下面给出一段具体的代码片段展示怎样加载前面提到的那个`PersonConfig`: ```java // 加载带有@Configuration标记的类 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PersonConfig.class); // 或者如果存在多个配置类也可以这样写: // AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(new Class[]{ConfigA.class, ConfigB.class}); // 取得已注册的对象 Person person = context.getBean(Person.class); System.out.println(person.getName()); // 输出 "张三" context.close(); ``` 这段代码说明了如何构建起一个包含指定配置类所描述之beans集合的应用场景,并从中提取出所需的组件进行操作。 关于代理机制以及其应用场景如事务管理、缓存支持等方面的内容也值得注意。这些高级特性的底层原理依赖于动态代理技术,它允许框架在不改变业务逻辑的前提下增强目标方法的行为[^2]。 最后提及的是有关Web应用程序开发过程中涉及到的具体流程细节,比如当启动一个典型的Spring MVC工程时会经历哪些阶段?这其中包括但不限于读取web.xml文件从而触发一系列内部事件最终达到初始化整个Spring容器的目的[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值