ApplicationContext是BeanFactory的子接口。
传统的用法如下
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("Beans.xml"));
DemoBean demoBean = (DemoBean) factory.getBean("helloWorld");
demoBean.getMessage();
这种用法在3.1版本后已经被标记为过时。所以,我们先只介绍ApplicationContext。
没有人规定一个java进程只能有一个ApplicationContext。只要你喜欢,多娶一个也没有问题,二者互不干扰。
ApplicationContext ctx = new ClassPathXmlApplicationContext(
new String[]{"Beans.xml"});
- LifeCircle这个接口赋予的生命周期的功能。
public interface Lifecycle {
void start();
void stop();
boolean isRunning();
}
MessageSource
Spring内部的国际化信息接口EnvironmentCapable
用于获取系统参数,如JVM启动参数等等。HierarchicalBeanFactory
java的开发者很喜欢继承但是很不喜欢别人使用继承。
没错,ApplicationContext(BeanFactory)之间是有继承关系的。
public interface HierarchicalBeanFactory extends BeanFactory {
BeanFactory getParentBeanFactory();
boolean containsLocalBean(String var1);
}
- ApplicationEventPublisher
ApplicationContext支持事件机制。
public interface ApplicationEventPublisher {
void publishEvent(ApplicationEvent var1);
void publishEvent(Object var1);
}
首先是一些内部定义事件。
- ContextRefreshedEvent:ApplicationContext被初始化或刷新时,该事件被发布。这也可以在ConfigurableApplicationContext接口中使用refresh()方法来发生。
- ContextStartedEvent:ConfigurableApplicationContext接口中的start()方法启动ApplicationContext时
- ContextStoppedEvent:当使用ConfigurableApplicationContext接口中的close()方法关闭ApplicationContext时
- ContextClosedEvent:当使用ConfigurableApplicationContext接口中的close()方法关闭ApplicationContext时,该事件被触发。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启。
当然,如果你要把spring作为自己代码的事件机制,spring也为了准备了封装PayloadApplicationEvent
public class PayloadApplicationEvent<T> extends ApplicationEvent implements ResolvableTypeProvider {
private final T payload;
public PayloadApplicationEvent(Object source, T payload) {
super(source);
Assert.notNull(payload, "Payload must not be null");
this.payload = payload;
}
public ResolvableType getResolvableType() {
return ResolvableType.forClassWithGenerics(this.getClass(), new ResolvableType[]{ResolvableType.forInstance(this.getPayload())});
}
public T getPayload() {
return this.payload;
}
}