
SSM的加载顺序
地址都一样的:
解决方法时不用注入的方式,并将外围bean实现BeanFactoryAware 接口,如下:
发布日期:2021-05-06 20:00:15
浏览次数:16
分类:技术文章
本文共 2624 字,大约阅读时间需要 8 分钟。
SSM的加载顺序
一直采用的是Tomcat,所以这里也以Tomcat加载SSM项目时配置文件的处理顺序作为例子.....
Tomcat加载顺序
Tomcat启动后,首先会先加载你项目下的web.xml,ssm在项目运行时,首先会加载web.xml,然后按序寻找如下的节点:
- context-param
- listener
- filter
- servlet
- interceptor
如下,是我从Tomcat的一次启动过程中按日志打印顺序截取出来的信息
信息: Initializing Spring root WebApplicationContext信息: Initializing log4j from [classpath:log4j.properties]信息: Initializing Spring FrameworkServlet 'spring-dispatcher'
而我的web.xml如下,首先是context-param:
contextConfigLocation classpath:spring.xml log4jConfigLocation classpath:log4j.properties log4jRefreshInterval 600000
接着是,监听器
org.springframework.web.context.ContextLoaderListener org.springframework.web.util.Log4jConfigListener
然后再是过滤器
CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 CharacterEncodingFilter /*
最后是servlet和拦截器,SpringMVC其实是对servlet的封装来着,如果用过原生的servlet,我们都知道它需要在web配置好多的servlet和servlet-mapping节点。而通过<load-on-startup>
节点,我们可以指定Tomcat启动时初始化servlet的优先级,至于拦截器,其实本质上也是一个servlet来着~如登录判读,缓存判断.
spring-dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring-mvc.xml 1 spring-dispatcher /
Spring加载顺序
Spring在初始化容器时,会先解析和加载所有的Bean (如果没有设置为延迟加载的话,即bean标签中的lazy-init没有设置为true),如果符合要求则通过Class生成BeanDefinition,存入BeanFactory中,在加载完所有Bean Class后,开始有序的通过BeanDefinition实例化Bean。同一级别的bean一般按照文件中的顺序进行初始化。
补充两点点,(1)如果一个bean的scope属性为scope="pototype"多例时,lazy-init的属性值即使设置为false,容器启动时也不会实例化bean,而是等到需要时,再进行实例化。(2)如果一个beanA依赖于另一个beanB,而你需要将beanA设置为单例,beanB设置为多例时,不能简单的将将beanB嵌套在beanA中,因为那样设置的话,由于外围的beanA在启动的时候就已经设置为单例了,而beanA又依赖于beanB,所以连带着beanB也被实例化,此时会将beanB也实例化为单例的。如下图所示:


public class TestBeans implements BeanFactoryAware { private TestSingleton tool; private BeanFactory factory; public TestBeans(){ System.out.println("单例初始化"); } public TestSingleton getTool() { return tool; } public void init(){ System.out.println("多例初始化"); this.tool = (TestSingleton) factory.getBean("tool"); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { factory = beanFactory; }}
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月06日 17时13分12秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【更新】CLion v2018.3发布(六):VCS和插件
2019-03-01
文件服务器——src文件夹
2019-03-01
从零构建通讯器--5.2三次握手,telnet,wireshark
2019-03-01
如何判断两个浮点数是否相等?
2019-03-01
2021牛客寒假算法基础集训营3
2019-03-01
苹果进军搜索,背后藏着什么“阳谋”?
2019-03-01
egg:如何在控制器中拿到前端传的参数
2019-03-01
MVC之修改
2019-03-01
struct 模块
2019-03-01
python之集合类型内置方法
2019-03-01
编程与编程语言分类
2019-03-01
【 UVA - 572 】 Oil Deposits (DFS水题)
2019-03-01
约瑟夫环问题
2019-03-01
CF #716 (Div. 2) B. AND 0, Sum Big(思维+数学)
2019-03-01
Java 設計模式 - 建造者模式
2019-03-01
ES6 JavaScript 重新認識 Promise
2019-03-01
分享九款不同页面404源码html
2019-03-01
404页圈小猫游戏代码
2019-03-01
好看清新卡通人物404单页网站源码
2019-03-01