您的位置:首页 > 编程语言 > Java开发

Spring 容器初始化(refresh过程)

2010-11-04 09:47 405 查看
Spring 运行机制一刷新Spring上下文
publicvoid refresh()throws BeansException, IllegalStateException
{
synchronized(startupShutdownMonitor)
{
prepareRefresh(); //设置标识标识正在执行中线程同步
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();//关闭旧的beanfactory ,获取一个新的beanfactory,读取配置文件等操作
prepareBeanFactory(beanFactory); //给beanfactory注入一些初始化组件比如 bean的类加载器
try
{
postProcessBeanFactory(beanFactory); //修改applicationContext内部beanfactory
invokeBeanFactoryPostProcessors(beanFactory); //调用BeanFactoryPostProcessors
registerBeanPostProcessors(beanFactory);//设置ApplicationContext中的beanFactoryPostProcessors变量表示:该ApplicationContext中共有多少个beanFactoryPostProcessor
initMessageSource();//为自己和父上下文赋或者初始化了一个单例的MessageSourcebean
initApplicationEventMulticaster();
//初始化ApplicationEventMulticaster,如果没定义则是用SimpleApplicationEventMulticaster
它会进行广播所以在listenner中一定要进行event的判断
onRefresh(); //为了扩展而预留的
registerListeners();//重新注册监听器
finishBeanFactoryInitialization(beanFactory);
finishRefresh(); //发送一个Event给Listenner
}
catch(BeansException ex)
{
beanFactory.destroySingletons();
cancelRefresh(ex);
throw ex;
}
}
}


准备更新prepareRefresh()
protected void prepareRefresh()
{
startupDate = System.currentTimeMillis(); //设置启动时间
synchronized(activeMonitor) //同步监视器
{
active = true; //设置为准备启动啦
}
if(logger.isInfoEnabled())
logger.info("Refreshing " + this);
}

通过obtainFreshBeanFactory()方法获取ConfigurableListableBeanFactory
protected ConfigurableListableBeanFactory obtainFreshBeanFactory()
{
refreshBeanFactory();
protected final void refreshBeanFactory()
throws BeansException
{
if(hasBeanFactory()) //若果存在
{
destroyBeans();//销毁已经存在的bean
closeBeanFactory(); //关闭bean工厂
}
try
{
DefaultListableBeanFactory beanFactory = createBeanFactory();
protected DefaultListableBeanFactory createBeanFactory()
{
return new DefaultListableBeanFactory(getInternalParentBeanFactory());
}
customizeBeanFactory(beanFactory);
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory)
{
if(allowBeanDefinitionOverriding != null)
beanFactory.setAllowBeanDefinitionOverriding(allowBeanDefinitionOverriding.booleanValue());
if(allowCircularReferences != null)
beanFactory.setAllowCircularReferences(allowCircularReferences.booleanValue());
}
loadBeanDefinitions(beanFactory); //这里以后单独看 太多啦
synchronized(beanFactoryMonitor)
{
this.beanFactory = beanFactory;
}
}
catch(IOException ex)
{
throw new ApplicationContextException("I/O error parsing XML document for application context [" + getDisplayName() + "]", ex);
}
}
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
public final ConfigurableListableBeanFactory getBeanFactory()
{
Object obj = beanFactoryMonitor;
JVM INSTR monitorenter ;
if(beanFactory == null)
throw new IllegalStateException("BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext");
return beanFactory; //就是刚刚 refreshBeanFactory出来的beanfactory
Exception exception;
exception;
throw exception;
}
if(logger.isInfoEnabled())
logger.info("Bean factory for application context [" + getId() + "]: " + ObjectUtils.identityToString(beanFactory));
if(logger.isDebugEnabled())
logger.debug(beanFactory.getBeanDefinitionCount() + " beans defined in " + this);
return beanFactory;
}

protected ConfigurableListableBeanFactory obtainFreshBeanFactory(){
refreshBeanFactory();
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if(logger.isInfoEnabled())
logger.info("Bean factory for application context [" + getId() + "]: " + ObjectUtils.identityToString(beanFactory));
if(logger.isDebugEnabled())
logger.debug(beanFactory.getBeanDefinitionCount() + " beans defined in " + this);
return beanFactory;
}
protected final void refreshBeanFactory() throws BeansException{
if(hasBeanFactory()){//若果存在
destroyBeans();//销毁已经存在的bean
closeBeanFactory(); //关闭bean工厂
}
try
{
DefaultListableBeanFactory beanFactory = createBeanFactory();
customizeBeanFactory(beanFactory);
loadBeanDefinitions(beanFactory); //这里以后单独看 太多啦
synchronized(beanFactoryMonitor)
{
this.beanFactory = beanFactory;
}
}catch(IOException ex){
throw new ApplicationContextException("I/O error parsing XML document for application context [" + getDisplayName() + "]", ex);
}
}
public final ConfigurableListableBeanFactory getBeanFactory(){
Object obj = beanFactoryMonitor;
JVM INSTR monitorenter ;
if(beanFactory == null)
throw new IllegalStateException("BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext");
return beanFactory; //就是刚刚 refreshBeanFactory出来的beanfactory
Exception exception;
exception;
throw exception;
}
protected DefaultListableBeanFactory createBeanFactory(){
return new DefaultListableBeanFactory(getInternalParentBeanFactory());
}
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory){
if(allowBeanDefinitionOverriding != null)
beanFactory.setAllowBeanDefinitionOverriding(allowBeanDefinitionOverriding.booleanValue());
if(allowCircularReferences != null)
beanFactory.setAllowCircularReferences(allowCircularReferences.booleanValue());
}
上一步吧BeanFactory给创建出来了现在要做一些以后工作的准备工作
public static ClassLoader getDefaultClassLoader()
{
ClassLoader cl = null;
try
{
cl = Thread.currentThread().getContextClassLoader();
}
catch(Throwable ex) { }
if(cl == null)//判断线程上下文的类加载器被手动设置为NULL没有
cl = (org.springframework.util.ClassUtils.class).getClassLoader();
return cl;
}
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory)
{
beanFactory.setBeanClassLoader(getClassLoader()); //bean的类加载器默认是使用的正在使用的类加载器
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this)); //增加一个处理文件资源的属性编辑器
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
//为工厂添加一个Bean创建后处理器主要处理: passes the ApplicationContext to beans that implement the ResourceLoaderAware, ApplicationEventPublisherAware, MessageSourceAware and/or ApplicationContextAware interfaces
beanFactory.ignoreDependencyInterface(org.springframework.context.ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(org.springframework.context.ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(org.springframework.context.MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(org.springframework.context.ApplicationContextAware.class);
//在使用自动组装(autoWrite)方式创建bean的时候忽略上述注入的接口
beanFactory.registerResolvableDependency(org.springframework.beans.factory.BeanFactory.class, beanFactory);
//大概意思是:如果注入的时候参数类型是第一个参数,则注入第二个参数作为注入的对象
beanFactory.registerResolvableDependency(org.springframework.core.io.ResourceLoader.class, this);
beanFactory.registerResolvableDependency(org.springframework.context.ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(org.springframework.context.ApplicationContext.class, this);
//增加loadTimeWeaver功能通过 instrumentation 的动态字节码增强在装载期向 domain object 中注入依赖
if(beanFactory.containsBean("loadTimeWeaver ") && JdkVersion.isAtLeastJava15())
{
try
{
Class ltwapClass = ClassUtils.forName("org.springframework.context.weaving.LoadTimeWeaverAwareProcessor", (org.springframework.context.support.AbstractApplicationContext.class).getClassLoader());
BeanPostProcessor ltwap = (BeanPostProcessor)BeanUtils.instantiateClass(ltwapClass);
((BeanFactoryAware)ltwap).setBeanFactory(beanFactory);
beanFactory.addBeanPostProcessor(ltwap);
}
catch(ClassNotFoundException ex)
{
throw new IllegalStateException("Spring's LoadTimeWeaverAwareProcessor class is not available");
}
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
}
预留方法postProcessBeanFactory() 用户扩展修改beanfactory的设置
protected void postProcessBeanFactory(ConfigurableListableBeanFactory configurablelistablebeanfactory){
}

invokeBeanFactoryPostProcessors()实例化和调用所用注册了BeanFactoryPostProcessor的beans,执行时候按照顺序,必须在实例化单例之前调用例子:如果一个bean实现BeanFactoryPostProcessor 则它在beanFactory创建后就立即创建了,并且可以改变beanFactory的属性,通过它也可以做一些扩张工作
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)
{
BeanFactoryPostProcessor factoryProcessor;
for(Iterator it = getBeanFactoryPostProcessors().iterator(); it.hasNext(); factoryProcessor.postProcessBeanFactory(beanFactory))
factoryProcessor = (BeanFactoryPostProcessor)it.next();
//调用了 bean的postProcessBeanFactory方法第一次为空getBeanFactoryPostProcessors().iterator()
//第二次调用则是old的BeanFactoryPostProcessor 下面将添加一些新的容
String postProcessorNames[] = beanFactory.getBeanNamesForType(org.springframework.beans.factory.config.BeanFactoryPostProcessor.class, true, false);
List priorityOrderedPostProcessors = new ArrayList();
List orderedPostProcessorNames = new ArrayList();
List nonOrderedPostProcessorNames = new ArrayList();
for(int i = 0; i < postProcessorNames.length; i++)
{
if(isTypeMatch(postProcessorNames[i], org.springframework.core.PriorityOrdered.class))
{
priorityOrderedPostProcessors.add(beanFactory.getBean(postProcessorNames[i]));
continue;
}
if(isTypeMatch(postProcessorNames[i], org.springframework.core.Ordered.class))
orderedPostProcessorNames.add(postProcessorNames[i]);
else
nonOrderedPostProcessorNames.add(postProcessorNames[i]);
}
//上面这种颜色表示的代码是在对BeanFactoryPostProcessor进行分类下面进行调用
Collections.sort(priorityOrderedPostProcessors, new OrderComparator());
invokeBeanFactoryPostProcessors(beanFactory, priorityOrderedPostProcessors);
List orderedPostProcessors = new ArrayList();
String postProcessorName;
for(Iterator it = orderedPostProcessorNames.iterator(); it.hasNext(); orderedPostProcessors.add(getBean(postProcessorName)))
postProcessorName = (String)it.next();
Collections.sort(orderedPostProcessors, new OrderComparator());
invokeBeanFactoryPostProcessors(beanFactory, orderedPostProcessors);
List nonOrderedPostProcessors = new ArrayList();
String postProcessorName;
for(Iterator it = nonOrderedPostProcessorNames.iterator(); it.hasNext(); nonOrderedPostProcessors.add(getBean(postProcessorName)))
postProcessorName = (String)it.next();
invokeBeanFactoryPostProcessors(beanFactory, nonOrderedPostProcessors);
}

初始化消息资源,如果该类没有就是用父context的
protected void initMessageSource()
{
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if(beanFactory.containsLocalBean("messageSource"))
{
messageSource = (MessageSource)beanFactory.getBean("messageSource", org.springframework.context.MessageSource.class);
if(parent != null && (messageSource instanceof HierarchicalMessageSource))
{
// HierarchicalMessageSource可以设置父亲的messageSource  默认是true
HierarchicalMessageSource hms = (HierarchicalMessageSource)messageSource;
if(hms.getParentMessageSource() == null)
hms.setParentMessageSource(getInternalParentMessageSource());
}
if(logger.isDebugEnabled())
logger.debug("Using MessageSource [" + messageSource + "]");
} else
{
DelegatingMessageSource dms = new DelegatingMessageSource();
dms.setParentMessageSource(getInternalParentMessageSource());
messageSource = dms;
beanFactory.registerSingleton("messageSource", messageSource);
if(logger.isDebugEnabled())
logger.debug("Unable to locate MessageSource with name 'messageSource': using default [" + messageSource + "]");
}
}
//就是赋值给自己和父类。在beanfactory中装一个MessageSource的单例bean

Initialize the ApplicationEventMulticaster. Uses SimpleApplicationEventMulticaster if none defined in the context初始化ApplicationEventMulticaster,如果没定义则是用SimpleApplicationEventMulticaster
protected void initApplicationEventMulticaster()
{
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
//只从自己的中拿不从父亲那里来applicationEventMulticaster
if(beanFactory.containsLocalBean("applicationEventMulticaster"))
{
applicationEventMulticaster = (ApplicationEventMulticaster)beanFactory.getBean("applicationEventMulticaster", org.springframework.context.event.ApplicationEventMulticaster.class);
if(logger.isDebugEnabled())
logger.debug("Using ApplicationEventMulticaster [" + applicationEventMulticaster + "]");
} else
{
applicationEventMulticaster = new SimpleApplicationEventMulticaster();
beanFactory.registerSingleton("applicationEventMulticaster", applicationEventMulticaster);
if(logger.isDebugEnabled())
logger.debug("Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [" + applicationEventMulticaster + "]");
}
}
注释:
public interface ApplicationEventMulticaster :Interface to be implemented by objects that can manage a number of ApplicationListeners, and publish events to them.
以后的英文就不翻译了太难得写了哈哈直接贴出来哈registerListeners():Add beans that implement ApplicationListener as listeners. Doesn't affect other listeners, which can be added without being beans.
protected void addListener(ApplicationListener listener)
{
//这个就是上一步创建的
getApplicationEventMulticaster().addApplicationListener(listener);
}

protected void registerListeners()
{
for(Iterator it = getApplicationListeners().iterator(); it.hasNext(); addListener((ApplicationListener)it.next()));
//以前的Listenner
Collection listenerBeans =
getBeansOfType(org.springframework.context.ApplicationListener.class, true, false).values();
for(Iterator it = listenerBeans.iterator(); it.hasNext(); addListener((ApplicationListener)it.next()));
}
finishBeanFactoryInitialization ():Finish the initialization of this context's bean factory, initializing all remaining singleton beans.
public void preInstantiateSingletons()        throws BeansException
{
if(logger.isInfoEnabled())
logger.info("Pre-instantiating singletons in " + this);
synchronized(beanDefinitionMap)
{
Iterator it = beanDefinitionNames.iterator();
do
{
if(!it.hasNext())
break;
String beanName = (String)it.next();
//Returna merged RootBeanDefinition, traversing the parent bean definition if the specified bean corresponds to a child bean definition
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if(!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit())
if(isFactoryBean(beanName))
{
FactoryBean factory = (FactoryBean)getBean("&" + beanName);
if((factory instanceof SmartFactoryBean) && ((SmartFactoryBean)factory).isEagerInit())
getBean(beanName);
} else
{
getBean(beanName);
}
} while(true);
}
}

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)
{
beanFactory.setTempClassLoader(null); //设置临时类加载器
beanFactory.freezeConfiguration();//  Freeze all bean definitions, signalling that the registered bean definitions will not be modified or post-processed any further
beanFactory.preInstantiateSingletons();

}
本文出自 “谦受益” 博客,请务必保留此出处http://ganludong.blog.51cto.com/801200/415037
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: