springmvc 发展历史理解boot的一些特性

 1 在老版的springmvc中 是需要在xml中指定一个监听器

<web-app>

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

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/app-context.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/app/*</url-pattern>
    </servlet-mapping>

</web-app>

ContextLoaderListener这个监听器实现了servlet规范中的一个接口 ServletContextListener,

在tomcat启动的某个节点会来调用到这里 从而完成spring容器的初始化

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
    public ContextLoaderListener() {
    }

    public ContextLoaderListener(WebApplicationContext context) {
        super(context);
    }

    public void contextInitialized(ServletContextEvent event) {
        this.initWebApplicationContext(event.getServletContext());
    }

    public void contextDestroyed(ServletContextEvent event) {
        this.closeWebApplicationContext(event.getServletContext());
        ContextCleanupListener.cleanupAttributes(event.getServletContext());
    }
}

xml中还会初始化一个dispatchServlet 这个大家都很熟悉 请求从tomct调用到这个sevlet做一系列处理

2 在基于代码配置中

基于spring官网的介绍Web on Servlet Stack

import org.springframework.web.WebApplicationInitializer;


public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) {

        // Load Spring web application configuration
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(AppConfig.class);

        // Create and register the DispatcherServlet
        DispatcherServlet servlet = new DispatcherServlet(context);
        ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
        registration.setLoadOnStartup(1);
        registration.addMapping("/app/*");
    }
}

这里就是初始化了容器和创建了dispatchSerlet到tomcat中 但为啥这样就可以了 原理是servlet3.0规范

1 实现了这个接口的类要加在META-INF/services/javax.servlet.ServletContainerInitializer文件中才会生效
2 实现了这个接口的类,这个类上被加了@HandlesTypes注解的类会被注入到这个类的onStartup方法的第一个参数中,也就是Set集合
3 servlet容器在启动的时候要调用这个类的onStartup方法


package javax.servlet;
 
import java.util.Set;
 
/**
 * 定义在META-INF/services/javax.servlet.ServletContainerInitializer文件中
 * 
 * @since Servlet 3.0
 */
public interface ServletContainerInitializer {
 
    
    void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;
}


 

@HandlesTypes({WebApplicationInitializer.class})
public class SpringServletContainerInitializer implements ServletContainerInitializer {
    public SpringServletContainerInitializer() {
    }

    public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException {
        List<WebApplicationInitializer> initializers = new LinkedList();
        Iterator var4;
        if (webAppInitializerClasses != null) {
            var4 = webAppInitializerClasses.iterator();

            while(var4.hasNext()) {
                Class<?> waiClass = (Class)var4.next();
                if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) && WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
                    try {
                        initializers.add((WebApplicationInitializer)ReflectionUtils.accessibleConstructor(waiClass, new Class[0]).newInstance());
                    } catch (Throwable var7) {
                        throw new ServletException("Failed to instantiate WebApplicationInitializer class", var7);
                    }
                }
            }
        }

        if (initializers.isEmpty()) {
            servletContext.log("No Spring WebApplicationInitializer types detected on classpath");
        } else {
            servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath");
            AnnotationAwareOrderComparator.sort(initializers);
            var4 = initializers.iterator();

            while(var4.hasNext()) {
                WebApplicationInitializer initializer = (WebApplicationInitializer)var4.next();
                initializer.onStartup(servletContext);
            }

        }
    }
}

这里WebApplicationInitializer就是上面图中的父接口 这样就实现了0配置

这里重点提一句 springboot是内置的tomct 初始化容器在run方法里 不要被SpringBootServletInitializer误导了,dispatchSetvlet是在WebMvcAutoConfiguration里的DispatcherServletAutoConfiguration初始化的

多提下springmvc组件注册过程

1 老版的springmvc是在DispatcherServlet的initStrategies中注册的

2 springboot中是基于自动装配

总结:

springmvc这些bean的注入 因为老版一般是打成war包 放到tomcat容器中,新版的内置的tomcat,所以玩法都不同 了 但肯定是有一个地方去做这些事,包括组件的注册过程,都会伴随着框架的特性去做调整 这里就展示了springboot 约定大于配置 ,不需要你配置dispatchServlet 而是自动帮你注入一个

1  需要初始化spring容器,老版是tomcat实现sevlet规范基于spi去加载,springboot直接run里初始化

2  需要注入dispatchSevlet,老版是配置xml中,springboot自动装配

3  需要注入mvc的组件,老版是dispachservelet的的父类serlet的init方法,springboot自动装配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. spring杂谈[原创] 1.1 Spring事务处理时自我调用的解决方案及一些实现方式的风险 1.2 我对AOP的理解 1.3 Spring开闭原则的表现-BeanPostProcessor的扩展点-1 1.4 我对IoC/DI的理解 1.5 SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结 1.6 »Spring 之AOP AspectJ切入点语法详解(最全了,不需要再去其他地找了) 1.7 Spring开闭原则的表现-BeanPostProcessor扩展点-2 1.8 Spring3.1 对Bean Validation规范的新支持(方法级别验证) 1.9 Spring对事务管理的支持的发展历程(基础篇) 1.10 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。 1.11 在spring中获取代理对象代理的目标对象工具类 1.12 如何为spring代理类设置属性值 1.13 我对SpringDAO层支持的总结 1.14 我对SpringDAO层支持的总结 1.15 我对SpringDAO层支持的总结 1.16 我对Spring 容器管理事务支持的总结 1.17 我对Spring 容器管理事务支持的总结 1.18 不重复配置——利用Spring通用化配置 1.19 @Value注入Properties 错误的使用案例 1.20 @Value注入Properties 使用错误的案例 1.21 扩展SpringMVC以支持更精准的数据绑定 1.22 扩展SpringMVC以支持更精准的数据绑定1 1.23 扩展SpringMVC以支持绑定JSON格式的请求参数 1.24 扩展SpringMVC以支持绑定JSON格式的请求参数 1.25 在应用层通过spring特性解决数据库读写分离 1.26 context:component-scan扫描使用上的容易忽略的use-default-filters 1.27 idea内嵌jetty运行springmvc项目报ConversionFailedException 1.28 springmvc 3.2 @MatrixVariable注解 1.29 spring3.2 带matrix变量的URL匹配问题 1.30 Shiro+Struts2+Spring3 加上@RequiresPermissions 后@Autowired失效 1.31 Spring事务不起作用 问题汇总 1.32 Spring3 Web MVC下的数据类型转换(第一篇)——《跟我学Spring3 Web MVC》抢先看 1.33 Spring 注入集合类型
Spring MVCSpring Boot是两个常用的Java框架,用于开发Web应用程序。它们有各自的优点和缺点,下面是对它们的介绍: Spring MVC: 优点: 1. 成熟稳定:Spring MVC是一个成熟的框架,已经在许多项目中得到广泛应用。 2. 灵活性:Spring MVC提供了很高的灵活性,可以根据项目需求进行定制和扩展。 3. 易于集成:Spring MVC可以与其他Spring框架(如Spring Security、Spring Data等)无缝集成,提供全面的解决方案。 4. 强大的生态系统:Spring MVC拥有庞大的社区和生态系统,可以轻松获取各种插件和扩展。 缺点: 1. 配置复杂:相对于其他框架,Spring MVC的配置相对复杂,需要编写大量的XML配置文件。 2. 学习曲线较陡峭:对于初学者来说,理解和掌握Spring MVC的概念和工作原理可能需要一些时间和精力。 Spring Boot: 优点: 1. 简化配置:Spring Boot通过自动配置和约定大于配置的原则,大大简化了项目的配置过程。 2. 快速开发:Spring Boot提供了快速开发的能力,可以快速搭建起一个可运行的应用程序。 3. 内嵌服务器:Spring Boot内置了Tomcat、Jetty等常用的Web服务器,无需额外配置即可运行Web应用程序。 4. 微服务支持:Spring Boot对微服务架构提供了良好的支持,可以轻松构建和部署微服务应用。 缺点: 1. 过度封装:Spring Boot的自动配置和约定大于配置的特性可能导致一些开发者对底层细节的掌握不够深入。 2. 约束性较强:由于Spring Boot的约定和规范,可能会限制一些自定义需求的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值