一、 Spring整合SpringMVC
Spring整合SpringMVC唯一的体现就是父子容器:、
- 通常我们会设置父容器(Spring)管理Service、Dao层的Bean, 子容器 (SpringMVC)管理Controller的Bean
- 子容器可以访问父容器的Bean, 父容器无法访问子容器的Bean
实现
在整合SSM时web.xml配置过这段
<!‐‐spring 基于web应用的启动‐‐>
<listener>
<listener‐class>org.springframework.web.context.ContextLoaderListener</listener‐class>
</listener>
<!‐‐全局参数:spring配置文件‐‐>
<context‐param>
<param‐name>contextConfigLocation</param‐name>
<param‐value>classpath:spring‐core.xml</param‐value>
</context‐param>
<!‐‐前端调度器servlet‐‐>
<servlet>
<servlet‐name>dispatcherServlet</servlet‐name>
<servlet‐class>org.springframework.web.servlet.DispatcherServlet</servlet‐class>
<!‐‐设置配置文件的路径‐‐>
<init‐param>
<param‐name>contextConfigLocation</param‐name>
<param‐value>classpath:spring‐mvc.xml</param‐value>
</init‐param>
<!‐‐设置启动即加载‐‐>
<load‐on‐startup>1</load‐on‐startup>
</servlet>
<servlet‐mapping>
<servlet‐name>dispatcherServlet</servlet‐name>
<url‐pattern>/</url‐pattern>
</servlet‐mapping>
配置了DispatcherServlet前端控制器和ContextLoaderListener上下文加载监听器
二、 零配置SpringMVC实现
省略web.xml的方式
1. 注解方式
- @WebServlet
- @WebFilter
- @WebListener
这种方式不利于扩展,如果编写在jar包中toamcat是无法感知的
2. SPI的方式
服务接口扩展,更加易于扩展可用于共享库可插拔的一种方式
服务提供商提供要求的一个接口, 在固定的目录 (META-INF/)放上以接口全类名为命名的文件, 文件中放入接口的实现的全类名,该类由我们自己实现,按照这种约定的方式(即SPI规范),服务提供商会 调用文件中实现类的方法, 从而完成扩展。
-
在固定的目录放上接口的文件名 (META-INF/javax.servlet.ServletContainerInitializer)
-
文件中放入实现类(该实现类由你实现): 一行一个实现类。
com.ppku.javaweb.spi.CustomServletContainerInitializer
-
通过java.util.ServiceLoader提供的ServiceLoader就可以完成SPI的实现类加载
// 示例 public class App { public static void main(String[] args) { ServiceLoader<IUserDao> daos = ServiceLoader.load(IUserDao.class); for (IUserDao dao : daos) { dao.save(); } } } public class TulingSpringServletContainerInitializer extends SpringServletContainerInitializer { @Override public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException { // 通过servletContext动态添加Servlet servletContext.addServlet("spiServlet", new HttpServlet() { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("spiServlet‐‐doGet"); } }).addMapping("/spiServlet.do"); } }
三、实现基于SPI规范的SpringMVC
在SpringMVC中, 上面的接口文件和实现类都把我们实现好了,甚至 ContextLoaderListener和DispatcherServlet都帮我们注册好了,我们只要让他生效