前几天找了几家小公司的工作,所有的公司都给了我上班通知,选了一家,觉得及其没有希望,于是,继续进行我喜欢的Spring源码研究,前几天看了一些关于Resource,ResourceLoader,Reader,之类的蓝领类,那么今天终于想看看SpringIoc的核心类,所谓程序上下文,ApplicationContext,那么我要开始组装了。
public abstract class AbstractApplicationContext extends DefaultResourceLoader
implements ConfigurableApplicationContext, DisposableBean
这个是AbstarctApplicationContext,这个类实现了两个接口--ConfigurableApplicationContext,DisposableBean ,用来实现上下文的可配置以及Bean的可配置,继承了一个资源加载器,DefaultResourceLoader,主要用来加载资源并对后续的各种配置操作提供基础。
以下属性都是在factory中的名称。
/**
* Name of the MessageSource bean in the factory.
* If none is supplied, message resolution is delegated to the parent.
* @see MessageSource
*/
public static final String MESSAGE_SOURCE_BEAN_NAME = "messageSource";
定义了一个统一的信息资源名称,messageSource。
/**
* Name of the LifecycleProcessor bean in the factory.
* If none is supplied, a DefaultLifecycleProcessor is used.
* @see org.springframework.context.LifecycleProcessor
* @see org.springframework.context.support.DefaultLifecycleProcessor
*/
public static final String LIFECYCLE_PROCESSOR_BEAN_NAME = "lifecycleProcessor";
定义了一个统一的生命周期处理工具Bean的名称,lifecycleProcessor。
/**
* Name of the ApplicationEventMulticaster bean in the factory.
* If none is supplied, a default SimpleApplicationEventMulticaster is used.
* @see org.springframework.context.event.ApplicationEventMulticaster
* @see org.springframework.context.event.SimpleApplicationEventMulticaster
*/
public static final String APPLICATION_EVENT_MULTICASTER_BEAN_NAME = "applicationEventMulticaster";
定义其一个上下文事件的多路广播名称,applicationEventMulticaster。
static {
// Eagerly load the ContextClosedEvent class to avoid weird classloader issues
// on application shutdown in WebLogic 8.1. (Reported by Dustin Woods.)
ContextClosedEvent.class.getName();
}
急迫的加载了ContextClosedEvent的类名称,在WebLogic 8.1中程序关闭的时候会出现怪异的类加载问题,这个bug是Dustin Woods报告的(他是谁呢?)
/** Logger used by this class. Available to subclasses. */
protected final Log logger = LogFactory.getLog(getClass());
子类和其公用的日志服务。
/** Unique id for this context, if any */
private String id = ObjectUtils.identityToString(this);
每一次实例化这个类都会生成一个唯一的id,用来识别上下文,在容器中。
/** Display name */
private String displayName = ObjectUtils.identityToString(this);
又一个唯一的id,用来作为显示的名称。
/** Parent context */
private ApplicationContext parent;
一个弗雷的引用,要用到父类的一些可用功能,比如说转型之类
/** BeanFactoryPostProcessors to apply on refresh */
private final List<BeanFactoryPostProcessor> beanFactoryPostProcessors =
new ArrayList<BeanFactoryPostProcessor>();
bean工厂的后处理器,用来申请refresh服务。还是一个集合,看类同一时间会存在很多的后处理器服务类,按需索取吧。
/** System time in milliseconds when this context started */
private long startupDate;
上下文开始运行的系统毫秒级时间。
/** Flag that indicates whether this context is currently active */
private boolean active = false;
上下文是否活动的一个标志字段。
/** Flag that indicates whether this context has been closed already */
private boolean closed = false;
上下文是否关闭了的标志字段。
/** Synchronization monitor for the "active" flag */
private final Object activeMonitor = new Object();
上下文是否是活动的一个线程安全型监视器。
/** Synchronization monitor for the "refresh" and "destroy" */
private final Object startupShutdownMonitor = new Object();
refresh和destroy动作的线程安全型监视器。
/** Reference to the JVM shutdown hook, if registered */
private Thread shutdownHook;
一个来自JVM虚拟机关闭时候的钩子,如果已经注册此钩子,hook,连带动作的载体。
/** ResourcePatternResolver used by this context */
private ResourcePatternResolver resourcePatternResolver;
上下文所用的Resource按模式分解解决方案类。
/** LifecycleProcessor for managing the lifecycle of beans within this context */
private LifecycleProcessor lifecycleProcessor;
管理生命周期的具体负责类,LifecycleProcessor。
/** MessageSource we delegate our implementation of this interface to */
private MessageSource messageSource;
代表针对MessageSource接口的我们的具体实现,有很多写好的。
/** Helper class used in event publishing */
private ApplicationEventMulticaster applicationEventMulticaster;
时间发布时候的帮助类,多路广播。
/** Statically specified listeners */
private Set<ApplicationListener<?>> applicationListeners = new LinkedHashSet<ApplicationListener<?>>();
静态的监听容器,为什么是静态的?
/** Environment used by this context; initialized by {@link #createEnvironment()} */
private ConfigurableEnvironment environment;
上下文环境,自然环境,createEnvironment()是造物主。
/**
* Create a new AbstractApplicationContext with no parent.
*/
public AbstractApplicationContext() {
this(null);
}
/**
* Create a new AbstractApplicationContext with the given parent context.
* @param parent the parent context
*/
public AbstractApplicationContext(ApplicationContext parent) {
this.parent = parent;
this.resourcePatternResolver = getResourcePatternResolver();
this.environment = this.createEnvironment();
}
填满属性或者不作任何操作,实例化的时候类可能是孤立的,并不一定存在实际的父类实例,我们也可以给出一个引用,具体使用再行研究。