复制就完事,无需多言 <servlet> <servlet-name>SpringMVC</servlet-name> ...
Spring原理说明: // 方式零:就在实现类中改,用哪个改哪个 // new出来的,耦合性太强,依赖于具体的实现类,如果我具体的实现类变了,那么这里的接口代码也得跟着变,这样不好。...IUserDao dao = new IUserDaoImpl(); // private IUserDao dao = new IUserDaoImplForOracle(); // 方式一:不在实现类中修改...,在工厂类中改forName的参数 // private IUserDao dao = BeanFactory.newInstance().getUserDao(); // 方式二:不在工厂类中修改...,在配置文件中修改,拿到的是代理对象,让代理对象帮我生成,我去这是最懒的方式啊!...// 所以Spring在web.xml中的就是配置实现了一个实现了ServletContextListener接口的监听器。
, 应用的web.xml,还有jar包里的web.xml **找到应用中所有的ServletContainerInitializer实现类:**将应用目录下META-INF/services/javax.servlet.ServletContainerInitializer...标注的实现类生成映射:**如果该实现类有@HandlesTypes注解,则将注解里的value作为key,该实现类(ServletContainerInitializer实现类)添加到value,存入typeInitializerMap...的key匹配,匹配上就把当前class(也就是HandlesTypes.value的实现类)添加到initializerClassMap的value中; 到这里,typeInitializerMap的工作也就完成了...= ServletContainerInitializer实现类集合(需要传入当前key类型的实现类), 对应的功能: initializerClassMap :存储应用初始化程序类及需要的参数对象类型...实现类,并把当前class作为参数类型存到initializerClassMap中,待后面启动时,直接获取。
当然要利用下metaclass做手脚啦 class Final(type): def __new__(cls, name, bases, classdi...
不安全,构造函数只执行一次 ServletContainerInitializer接口 在web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等,servlet...规范中通过ServletContainerInitializer实现此功能。...的文件,文件内容指定具体的ServletContainerInitializer实现类。...1、Servlet容器启动会扫描,当前应用里面每一个jar包的 ServletContainerInitializer的实现 2、提供ServletContainerInitializer的实现类;...实现类的全类名; META-INF:tomcat默认就会去读取的 @HandlesTypes(value = MyHandlesType.class) public class MyServletContainerInitializer
或更高版本,服务器会在启动的时候在类路径下查找javax.servlet.ServletContainerInitializer接口的实现类,执行实现类的onStartup方法用于配置Servlet容器...;如果ServletContainerInitializer接口的实现类使用@HandlesTypes注解声明了感兴趣的类或接口,那么这个感兴趣的类及其子类或接口的实现类就会被设置到Set的文件,这个文件的内容是ServletContainerInitializer接口实现类的全路径,例如com.example.demo.MyServletContainerInitializer,下面实现一个简单的...Spring3.1中的SpringServletContainerInitializer实现了ServletContainerInitializer接口,同时在相应的jar包META-INF/services...,所以,支持Servlet3.0+的容器在启动时会自动扫描classpath下WebApplicationInitializer接口的实现类,并将这些实现类传递给onStartup方法的第一个参数。
手动创建容器 1)前置说明 在使用Servlet3.1版本的规范时,脱离了web.xml进行注解开发,它除了支持使用注解的配置方式外,还支持纯手动创建Servlet容器的方式。...,@HandlesTypes源码如下: /** * 用于指定要加载到ServletContainerInitializer接口实现了中的字节码 * @see javax.servlet.ServletContainerInitializer...实现类的onStartUp方法中类的字节码。...>> c, ServletContext ctx) throws ServletException { } } 在脱离web.xml时,要求在src目录下包含一个META-INF...在目录中创建一个名称为javax.servlet.ServletContainerInitializer的文件,里面写实现了ServletContainerInitializer接口的全限定类名。
Servlet的配置要求配在web.xml中。...手动创建容器 1)前置说明 在使用Servlet3.1版本的规范时,脱离了web.xml进行注解开发,它除了支持使用注解的配置方式外,还支持纯手动创建Servlet容器的方式。...,@HandlesTypes源码如下: /** * 用于指定要加载到ServletContainerInitializer接口实现了中的字节码 * @see javax.servlet.ServletContainerInitializer...实现类的onStartUp方法中类的字节码。...在目录中创建一个名称为javax.servlet.ServletContainerInitializer的文件,里面写实现了ServletContainerInitializer接口的全限定类名。
那时,还离不开 web.xml 的配置,在 xml 文件中编写繁琐的 servlet 和 filter 的配置。...的实现类,并且容器将 WEB-INF/lib 目录下 JAR 包中的类都交给该类的 onStartup() 方法处理,我们通常需要在该实现类上使用 @HandlesTypes 注解来指定希望被处理的类...而方法入参中 Set<class<class</class</class 这么声明一个 ServletContainerInitializer 的实现类,web 容器并不会识别它,所以,需要借助 SPI...寻找 spring 中 ServletContainerInitializer 的实现类并不困难,可以迅速定位到 SpringServletContainerInitializer 该实现类。...,实际上一开始我在各种 ServletContainerInitializer 的实现类中打了断点,最终定位到,根本没有运行到 SpringServletContainerInitializer 内部,
,我们会在web.xml中配置SpringMVC,然后SpringMVC会根据web.xml中的配置初始化DisptacherServlet在servlet3.0之后,出现了ServletContainerInitializer...,可以在项目启动最开始时,会自动扫描实现了ServletContainerInitializer接口的类,对Servlet、Listener、Filter进行动态注册,利用此技术,可以通过实现ServletContainerInitializer...,往后面看)ServletContainerInitializer的作用和web.xml差不多,都是部署servlet,listener,filter,只是一个是用java代码配置,一个用xml配置在实现了...ServletContainerInitializer接口的类上要注解上@HandlesTypes(//要动态注册的class,一定要是Servlet或者Listener或者Filter)ServletContainerInitializer...接口中只有一个方法onStart(Set,ServletContext)当应用启动的时候,会调用onStart方法,参数Set就是@HandlesTypes中的类,意味着这些类可以被动态注册实现动态注册的核心方法
web.xml文件的继承 在${CATALINA_HOME}\conf\web.xml中的内容,相当于写到了每个项目的web.xml中,它是所有web.xml的父文件。...每个完整的JavaWeb应用中都需要有web.xml,但我们不知道所有的web.xml文件都有一个共同的父文件,它在Tomcat的conf/web.xml路径。 conf/web.xml 在应用的web.xml中如果没有对进行覆盖,那么默认主页为index.html、index.html、index.jsp 关于web.xml配置中的在webapps目录下的项目名为we] 就会匹配到我们指定的中,即/index然后一步一步找到对应的<...Path 4.我们可以通过使用*.do来过滤请求, 这样如果我们在页面中的请求中添加后缀名.do就可以避免对静态资源的过滤了,也就不需要对静态资源做特殊处理了
实现了 Servlet 接口的类在 Servlet 容器中可用于处理请求并发送响应。...的实现类,并且容器将 WEB-INF/lib 目录下 JAR 包中的类都交给该类的 onStartup() 方法处理,我们通常需要在该实现类上使用 @HandlesTypes 注解来指定希望被处理的类...ServletContainerInitializer 的实现类,Web 容器并不会识别它,需要借助 SPI 机制来指定该初始化类,通过在项目 ClassPath 路径下创建 META-INF/services...,无论是 web.xml 中的配置,还是 Servlet3.0 中的 ServletContainerInitializer 和 SpringBoot 的加载流程都没有太大的关联。...一个比较核心的类,一般我们可以从中获取到那些注册在容器中的托管 Bean,而这篇文章,主要分析的便是它在内嵌容器中的实现类:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
web.xml是web应用中载入有关servlet信息的重要配置文件,起着初始化servlet,filter等web程序的作用。 通常,全部的MVC框架都须要Web应用载入一个核心控制器。...仅仅须要在web.xml文件里配置FilterDispatcher就可以。 在web.xml里面配置struts。...configProviders:假设用户须要实现自己的ConfigurationProvider类,用户能够提供一个或多个实现了ConfigurationProvider接口的类。...到此,配置完struts2的核心控制器后,基本完毕了struts2在web.xml文件里的配置。...struts2-core-2.0.6.jar文件中,在struts2-core-2.0.6.jar文件的META-INF路径下。
如果第三方实现了ServletContainerInitializer接口,并且在其META-INF/目录下的services文件中声明了该实现类,那么Servlet容器可以借助JDK的ServiceLoader...探测到所有第三方实现类,然后Servlet容器将ServletContext对象依次传递给第三方实现类的onStartup()方法(不用头疼ServletContext对象的获取问题了,Servlet容器直接传给你...WebApplicationInitializer接口是Spring为第一种部署模式量身打造的一个接口,即它只能应用于外置Servlet容器中,大家可以在Intellj IDEA中DEBUG运行一个Spring...实现类的呢?...其中在方式三和方式四中,方式四更贴近Spring风格,而方式三是Servlet API 3.0引入的一种原生方式;如果大家深挖方式四的话,其实底层原理依然是通过方式三实现的。
我们配置DispatcherServlet最典型的是使用web.xml文件。...它可以充分利用编译器,在编译期间检查出配置中的错误,另外,这增强了配置的灵活性和可控性,你可以在启动过程中自定义需要的检查验证条件。...Spring mvc是跟着更底层的接口标准servlet走的,servlet3+以后引入ServletContainerInitializer接口,这为去web.xml,基于代码配置提供了一种途径: public...>> c, ServletContext ctx) throws ServletException; } Spring的SpringServletContainerInitializer 类实现了该接口...META-INF/services/javax.servlet.ServletContainerInitializer,文件内声明实现类,进而调用其onStartup方法,如果以后我们要自己实现ServletContainerInitializer
大家好,又见面了,我是你们的朋友全栈君。...在web.xml中通过contextConfigLocation配置spring,contextConfigLocation参数定义了要装入的 Spring 配置文件。 1....在web.xml里配置需要加载的spring配置文件。 如果要装入多个配置文件,在标记中用逗号作分隔符即可。...在web.xml里配置Listener,本Listener会去加载第一步中指定的配置文件。...如果指定了要加载的文件,则会去加载相应的xml,而不会去加载/WEB-INF/下的applicationContext.xml。
http://localhost:8080/we/index时[假设我部署在webapps目录下的项目名为we] 就会匹配到我们指定的中,即/index然后一步一步找到对应的 那我们输入的URL:http://localhost:8080/we/index又是如何与中的/index匹配的呢?...是我们的Servlet的地址,我们称为Servlet Path,这里就是需要与我们的匹配的内容 注:在/index后边我们还可以跟其他的信息,例如:/index?...name=admin&pass=admin 这是其中一种明文表示的方式 标签中*的使用 我们知道在写时有一种通配符的使用写法,即* 1.当我使用<url-pattern...Path 4.我们可以通过使用*.do来过滤请求, 这样如果我们在页面中的请求中添加后缀名.do就可以避免对静态资源的过滤了,也就不需要对静态资源做特殊处理了
前言 在之前的一篇文章【小家Spring】Spring注解驱动开发—Servlet 3.0整合Spring MVC(不使用web.xml部署描述符,使用ServletContainerInitializer...,返回一个ServiceLoader的实现,而ServiceLoader实现了Iterable接口,所以可以通过ServiceLoader来遍历所有在配置文件中定义的类的实例。...(继承或者实现)的类放在ServletContainerInitializer接口的集合参数c中传递进来。...如果不定义处理类型,或者应用中不存在相应的实现类,则集合参数c为null 这一类实现了SCI(全名:ServletContainerInitializer)的接口,如果做为独立的包发布,在打包时,会在JAR...(); } } // 这一步就是Tomcat专门寻找,并且执行Servlet规范中的`ServletContainerInitializer`的所有的实现类的 /*
关于SPI可以去了解我的另一篇文章 Java SPI 机制详解 SPI在springboot中的应用 我们看spring-web这个项目的spi文件javax.servlet.ServletContainerInitializer...ServletContainerInitializer 是 Servlet 3.0 新增的一个接口,主要用于在容器启动阶段通过编程风格注册Filter, Servlet以及Listener,以取代通过web.xml...文件中,那么Tomcat等容器启动的时候就会去调用所有实现类的onStartup方法。...,其本质上是利用了Servlet3.0规范中的Tomcat启动时会去调用ServletContainerInitializer接口的onStartup方法,同时把使用类注解@HandlesTypes中标注的接口的实现类作为参数传入到...onStartup中,并依次调用其实现类的onStartup方法。
ASP.NET将所有的引用和代码生成的dll都部署在bin中,而Java Web的引用jar和生成的class分别存放在WEB-INF的子目录lib和classes中。...开始支持,在ASP.NET中没有对应项): (1)WebServlet:作用在javax.servlet.http.HttpServlet的实现类上。...(2)WebFilter:作用在javax.servlet.Filter的实现类上。...用于Servlet容器初始化的ServletContainerInitializer(可实现无web.xml,3.0开始支持,可类比ASP.NET的Application_Start方法): (1)Servlet...(3)Servlet容器在启动时调用ServletContainerInitializer实现类的onStartup方法,该方法可以获取HandlesTypes标注的所有类型对象。