当前位置:首页 » 网页前端 » web容器spring容器
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

web容器spring容器

发布时间: 2023-01-20 04:08:13

Ⅰ web.xml配置spring容器出Error listenerStart错怎么解决

看看驱动对不对,还有数据库连接

Ⅱ EasyExcel的监听器不能被spring管理

在使用EasyExcel中的读取excel时,需要使用到监听器,但是在Listener监听器中无法使用Spring容器的@Resource或者@Autowired 注解的方法注入bean,因为,在web Server容器中,无论是Servlet,Filter,还是Listener都不是Spring容器管理的,因此我们都无法在这些类中直接使用Spring注解的方式来注入我们需要的对象。在这里,Servlet的整个生命周期都是由Servlet容器来处理的。如果把它硬放到Spring容器中去创建,Servlet对象是可被Spring容器建出来,但Servlet容器可能跟本就不知道这个Servlet是否存在,因为不在它自己的容器中。所以,servlet交给web server来管理,不要交给spring管理。

Ⅲ 从源码理解总结web容器、spring容器、spring mvc容器三者关系

本篇,我打算从springMVC项目的web.xml的配置文件入手,通过部分源码逐步去理解解释三个容器的关系以及调用顺序,因为是基于我个人的理解,可能有所不足。

一般web.xml文件里会有如下两段配置信息:

我们先了解下web.xml,以下引用自 《web.xml文件是什么?有什么用?--详解》 :

然后结合我们上面的web.xml中关于spring和spring mvc的配置信息来进入话题:

    首先,启动web容器的时,会先生成对应项目的ServelContent对象,这个是每个项目的上下文,这个ServelContent可以管理所有的servlet,并将我们web.xml中设置的<context-param>内容作为键值对交给这个对象。

    然后加载<listener>标签内容,这个时候就会产生org.springframework.web.context.ContextLoaderListener。

spring的这个 ContextLoaderListener 在接下来的过程中很重要,我们来看一下源码

首先,可以看出它继承了ContextLoader类,并实现了ServletContextListener接口。

这里再直接引用他人的结论   《Spring中ContextLoaderListener作用》

好了,人家说法中回到我们的起点了,我们基本都被人告知“ContextLoaderListener的作用是创建并初始化spring容器”

那我们就可以深入进去看看,到底哪里做了这一步:

首先,我们知道了ServletContextListene是ServletContext的监听者,监听器的响应动作就是在服务器启动时contextInitialized会被调用,关闭的时候contextDestroyed被调用,这个好理解,那我们就来看一下ContextLoaderListener重写的contextInitialized方法到底做了什么。

我们再进入观察initWebApplicationContext方法细看

我因为自己消化过一遍,直接给出关键位置的方法说明——

1、首先是278行:创建了WebApplicationContext,我们可以理解为spring容器的壳子有了

2、其次是288和289行:对ApplicationContext加载了配置文件,并设置servletContext为WebApplicationContext的parent,到这一步,可以理解为我们的spring容器也就差不多成型了

3、接下来是294行:把ApplicationContext对象以键值对的形式存到servletContext中,这一步很关键,就是因为servletContext中存在这个键值对,所以其他内部成员可以通过servletContext访问到ApplicationContext,当然也能使用其管理的bean,而spring mvc则没有这样存在servletContext,所以我觉得正是这一步决定了子容器springmvc可以取用父容器内的bean,反着则不然。

接下来直到轮到我们的springmvc容器<servlet>标签内容

会生成控制org.springframework.web.servlet.DispatcherServlet,这是一个前端控制器,主要的内容我之前也有一篇文章做过自我记录

《Spring MVC的工作机制简单理解》

我们可以看到设置的

<load-on-startup>1</load-on-startup>

这个标签大概意思就是:

1、load-on-startup 元素标记容器是否应该在web应用程序启动的时候就加载这个servlet,(实例化并调用其init()方法)。

2、它的值必须是一个整数,表示servlet被加载的先后顺序。

3、如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。

4、如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。

在DispatcherServlet的时候就根据springMVC容器容器的配置文件生成。

比如我这边就是

那顺序确定了,我们再看一下spring和spring mvc的父子关系哪里确定:

我们可以从下面3个截图看到dispatcherServlet的继承关系,同时,init方法用的是dispatcherServlet父类的父类的方法。

重点在于initServletBean()方法,经过追踪,我们找到该方法的最终实现又是在dispatcherServlet的父类FrameworkServlet中

其中涉及父子关系的实际是在219行的initWebApplicationContext()方法

initWebApplicationContext()方法主要用于创建或刷新WebApplicationContext实例,并对Servlet功能所使用的变量进行初始化。

从238行源码就可以看到,它获得ContextLoaderListener中初始化的rootContext,

在246行设置了父子关系的引用,也就是从这一点我们看到了spring和springMVC的父子关系!

并且,可以看到这只是一条单向的引用,spring中没有引用直接指向springMVC,也就是子类能找到父类,然而父类都不知道这个子类,父子容器之间内部对象调用关系更明了。

再通过构造函数和Servlet的contextAttribute属性查找ServletContext来进行webApplicationContext实例的初始化,最终。

这个方法内263行源码onRefresh(wac)方法是FrameworkServlet提供的模板方法,在子类,也就是我们的DispatcherServlet的onRefresh()方法中进行了重写。而在onRefresh()方法中调用了initStrategies()方法来完成初始化工作,初始化Spring MVC的9个组件。

1、Tomcat在启动时给每个Web应用创建一个全局的上下文环境,这个上下文就是ServletContext,其为后面的Spring容器提供环境。

2、Tomcat在启动过程中触发容器初始化事件,Spring的ContextLoaderListener会监听到这个事件,它的contextInitialized方法会被调用,在这个方法中,Spring会初始化全局的Spring根容器,这个就是Spring的IoC容器,IoC容器初始化完毕后,Spring将其存储到ServletContext中,便于以后来获取。

3、Tomcat在启动过程中还会扫描Servlet,一个Web应用中的Servlet可以有多个,以SpringMVC中的DispatcherServlet为例,这个Servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个Servlet请求。

4、Servlet会在容器启动时加载或延迟加载(根据启动级别设置数字)。延迟加载时,当第一个请求达到时,serlet容器发现对应Servlet还没有被实例化,就调用Servlet的init方法。

在spring MVC里

        DispatcherServlet在初始化的时候会建立自己的容器,叫做SpringMVC 容器,用来持有Spring MVC相关的Bean。同时,Spring MVC还会通过ServletContext拿到Spring根容器,并将Spring根容器设为SpringMVC容器的父容器,请注意,Spring MVC容器可以访问父容器中的Bean,但是父容器不能访问子容器的Bean, 也就是说Spring根容器不能访问SpringMVC容器里的Bean。

        说的通俗点就是,在Controller里可以访问Service对象,但是在Service里不可以访问Controller对象。

Ⅳ spring框架通过web容器来启动的类

如下即为启动spring的测试类,初始化spring上下文环境即可启动spring,web项目只是把初始化spring上下文环境转移到了web.xml里。
Action:

import org.apache.log4j.Logger;import org.springframework.context.support.;public class Action { private static Logger logger = Logger.getLogger(DisposeAction.class); private static String[] contexts = { "applicationContext.xml" }; public static void main(String[] args) { logger.info("[i] : preDispose Server start ... "); ctx = new (contexts); //SpringBeanManager.initContext(ctx); logger.info("[i] : preDispose Server start ok ... "); }}

Ⅳ spring是不是必须在web容器中才能跑

Web应用当然要在Web容器中应用啦,呵呵,但是测试什么的,有框架可以模拟的,其他的都可以读出applicationContext.xml的配置来应用的啊

Ⅵ web容器启动初始化完 SpringIOC 实例化完bean 项目启动完成,关于实例化问题

Class.forName("beanClassName"); 这个跟spring ioc木有关系了!因为这个是java语言反射的特性!就像男人就是阳性!如果你木有记错的话应该知道Java默认一个空构造函数!就是根据这个来反射得到bean实例!
大量的框架都是使用了这个特性才支持了动态装载一个class来完成了,对象最大化管理!但是反射消耗性能也是比较高的!
种方式是:光热转换(太阳能热水器);光电转换(太

Ⅶ Spring容器启动流程

通过AbstractApplicationContext#refresh()提供了在加载完配置文件后的启动过程。以SpringBoot的Web环境来看启动过程(文末有spring容器的启动过程及区别)

1.prepareRefresh():由于在此时还没有加载servlet容器,所以servletContext=null,servletConfig=null,还没有进行初始化propertySource,添加了几个ApplicationListeners。

2.obtainFreshBeanFactory():创建BeanFactory,即DefaultListableBeanFactory

3.prepareBeanFactory():对DefaultListableBeanFactory进行属性填充。如:添加类加载器,添加BeanPostProcessor等等。

4.postProcessBeanFactory():在上面prepareBeanFactory()公共的之后,提供子类的特殊处理,注册特殊的后处理器,此处为的具体实现。

5.():主要是扫描包,注册成BeanDefinition,对类配置的信息解析成BeanDefinition的属性。然后执行实现了BeanFactoryPostProcessor接口的bean的postProcessBeanFactory()方法。

对于类型的BeanFactoryPostProcessor,执行

类型的processor,检查包名是否异常

获取类型为并且是PriorityOrdered优先排序类型的beanDefinition

上面获取postProcessorNames的具体实现如下

调用刚获取到的currentRegistryProcessor列表中的bean的()方法

获取到启动类

对启动类开始进行解析,包装成SourceClass,开始解析

获取到需要扫描的包信息,开始进行解析

解析是否有includeFilters,excludeFilters,lazyInit等属性,解析basePackage,basePackageClasses配置,如果没有,则根据启动类的包名获取,最终获得需要扫描的包。

解析包下所有beanDefinition,遍历并逐个解析。  如果实现了AnnotatedBeanDefinition接口,解析是否有lazy,Primary,DependsOn,Role,Description等注解并对beanDefinition进行相应属性设置。   检查是否在beanDefinitionMap中,如果不存在则将beanDefinition注册到beanDefinitionMap中。

对获取到的包下的beanDefinition进行遍历处理。处理是否import,ImportResource,Bean注解,处理实现的接口。

处理完类型的bean之后,处理之前注册的处理器,前两个处理器没做任何处理,第三个处理器,对目前加载的所有的beanDefinition进行处理。如果是启动类,生成代理类并替换原来的beanClass

获取实现了BeanFactoryPostProcessor接口的类,去除了上面已经解析过的,根据是否排序进行分类,然后按照PriorityOrdered,Ordered,nonOrdered以此执行。

6.registerBeanPostProcessors():获取实现了BeanPostProcessor的bean,并根据是否实现order接口进行排序,并按顺序注册到beanPostProcessors中。

7.initMessageSource():

8.():注册事件广播器

9.onRefresh():获取ServletWebServerFactory(tomcatServletWebServerFactory),创建TomcatWebServer,然后initServletPropertySources

创建TomcatWebServer之后获取需要初始化的servlet,filter

将servlet添加到servletContext中

将filter添加到servletContext中

10.registerListeners():在事件广播器中注册监听器,注册监听器name,如果earlyApplicationEvents存在,则广播事件。

11.():实例化bean

先进行实例化之前的操作,再实例化bean。

如果有实现, 则执行

根据实例化策略进行实例化(这里是cglib)包装成BeanWrapper

实例化之后执行后处理

执行postProcessProperties

属性设置,在中进行依赖注入

是否实现BeanNameAware,BeanClassLoaderAware,BeanFactoryAware等接口

init之前

调用自定义的init方法,在中处理

如果实现了InitializingBean,执行afterPropertiesSet()方法

然后执行init之后的方法

12.finishRefresh():主要做的事情是启动tomcat,并发布事件

逐个listener去匹配事件

以下为spring环境启动与web环境启动的相同和不同:

1.prepareRefresh():区别在于initPropertySources()的实现不同,spring上下文为,web上下文AnnotationConfig

2.obtainFreshBeanFactory():相同

3.prepareBeanFactory():相同

4.postProcessBeanFactory():spring使用的AbstractApplicationContext的默认处理,没有提供实现,web提供了实现注册了特殊的处理器

5.():相同

6.registerBeanPostProcessors():相同

7.initMessageSource():相同

8.():相同

9.onRefresh():spring什么都没做,使用的AbstractApplicationContext的默认实现,web提供了创建web容器的过程

10.registerListeners():相同

11.():相同

12.finishRefresh():spring主要做的事情是发布事件,web容器多了一步启动web容器

综上:web环境和spring环境启动容器流程基本相同,spring默认使用AbstractApplicationContext的实现,web多了properties解析,注册特殊处理器,创建webServer和启动webServer的过程。

Ⅷ 1.IDEA明明已经导入了jar包为什么还是提示找不到类

首先找到出错的位置,查看是否可以进到哪个类当中。
比如在web容器和Spring容器在整合的时候要使用org.springframework.web.context.ContextLoaderListener这个类来在Web容器启动时启动Spring容器,有时候会报错这不到这个类,此时可以在web.xml中Ctrl+鼠标左键,看看是否可以进入到这个类当中,如果不能说明没有真的引入。

如果可以进入,说明类的路径没毛病,如果用的tomcat,删掉后重新部署,最后重新编译,编译完成后进入tomcat部署项目的文件夹查看对应项目的classes文件夹中有没有你项目编译后产生的相关文件,都有的话,重新试一下。

方法一:在项目名称上右键,选择MAVEN,然后点击reimport即可。

方法二:左上角点击file,选择Invalidate Caches/Restart,然后点击左边第一个按键即可。我的项目中此问题得以解决。

方法三:使用方法一后,再右上角点击 toggle offline mode

方法四:将maven仓库所在包当中的,提示缺的jar包删除,然后在maven当中再次引用,或者换个版本,或者换个版本后在换回原来的版本。

一般通过以上几个方法都可以解决。

Ⅸ web容器怎么启动spring

在应用程序web.xml中做了以下配置信息时,当启动Web容器时就会自动加载Spring容器。

[java] view plainprint?
<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>