SSM的加载顺序
发布日期:2021-05-06 20:00:15 浏览次数:16 分类:技术文章

本文共 2624 字,大约阅读时间需要 8 分钟。

SSM的加载顺序


一直采用的是Tomcat,所以这里也以Tomcat加载SSM项目时配置文件的处理顺序作为例子.....

Tomcat加载顺序

Tomcat启动后,首先会先加载你项目下的web.xml,ssm在项目运行时,首先会加载web.xml,然后按序寻找如下的节点:

  1. context-param
  2. listener
  3. filter
  4. servlet
  5. 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也实例化为单例的。如下图所示:

在这里插入图片描述

在这里插入图片描述
地址都一样的:
在这里插入图片描述
解决方法时不用注入的方式,并将外围bean实现BeanFactoryAware 接口,如下:

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;    }}
上一篇:SSM发送手机验证码——以网建SMS为例
下一篇:机器学习之支持向量机

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年04月06日 17时13分12秒