
最近因为写书的事情,一段时间没有写博客了,有朋友最近问到了spring加载类的过程,尤其是基于annotation注解的加载过程,有些时候如果由于某些系统部署的问题,加载不到,很是不解!就针对这个问题,我这篇博客说说spring启动过程,用源码来说明,这部分内容也会在书中出现,只是表达方式会稍微有些区别,我将使用spring 3.0的版本来说明(虽然版本有所区别,但是变化并不是特别大),另外,这里会从WEB中使用spring开始,中途会穿插自己通过new ClassPathXmlApplicationContext的区别和联系。
要看这部分源码,其实在spring 3.0以上大家都一般会配置一个Servelet,如下所示:
当然servlet的名字决定了,你自己获取SpringContext的方式,在前面文章:《spring里头各种获取ApplicationContext的方法》有详细的说明,这里就不细说了,我们就通过DispatcherServlet来说明和跟踪(注意我们这里不说请求转发,就说bean的加载过程),我们知道servlet的规范中,如果load-on-startup被设定了,那么就会被初始化的时候装载,而servlet装载时会调用其init()方法,那么自然是调用DispatcherServlet的init方法,通过源码一看,竟然没有,但是并不带表真的没有,你会发现在父类的父类中:org.springframework.web.servlet.HttpServletBean有这个方法,如下图所示:
publicfinalvoidinit()throwsServletException{
if(logger.isDebugEnabled()){
logger.debug("Initializingservlet'"+getServletName()+"'");
}
//Setbeanpropertiesfrominitparameters.
try{
PropertyValuespvs=newServletConfigPropertyValues(getServletConfig(),this.requiredProperties);
BeanWrapperbw=PropertyAccessorFactory.forBeanPropertyAccess(this);
ResourceLoaderresourceLoader=newServletContextResourceLoader(getServletContext());
bw.registerCustomEditor(Resource.class,newResourceEditor(resourceLoader));
initBeanWrapper(bw);
bw.setPropertyValues(pvs,true);
}
catch(BeansExceptionex){
logger.error("Failedtosetbeanpropertiesonservlet'"+getServletName()+"'",ex);
throwex;
}
//Letsubclassesdowhateverinitializationtheylike.
initServletBean();
if(logger.isDebugEnabled()){
logger.debug("Servlet'"+getServletName()+"'configuredsuccessfully");
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-64433-1.html
所以麻麻一把年纪还纯真的喜欢你@TFBOYS-易烊千玺呀
找骂
肯定有反制措施