注解开发SpringMVC并使用main函数启动

最重要的话说在前面:本文旨在告诉大家使用内嵌的tomcat,用注解开发SpringMVC,用main函数启动项目所需要做的配置工作。

一  随意吧,标题怎么起都行

本文不适合初学者,适合对Spring开发有一定经验的人。每月收入-支出 >0 的大神,前方施工,也请调头!

本文目的

  • 学会使用搭建注解开发的SpringMVC工程环境
  • 弄清楚SpringMVC和Servlet的启动顺序
  • 学会使用main函数启动Web应用
  • 提供一个能跑起来的使用的基本工程(以便复用和定制) 

本文暂时不提供过多的源码解析。有时间会提供一系列的个人对常用框架源码的理解的总结。

            我们从理清楚几个概念的关系开始入手。

          Spring和SpringMVC的关系是: SpringMVC是Spring的一部分。SpringMVC依赖Spring的core部分。见下图:

spring overview

        as we all know , 要用Spring,最起码要有Spring 的core部分。Spring core Container就是一个ApplicationContexxt实例。因为Spring framework是可以应用到web也可以应用到非web环境。用到Web环境时,站在整个Spring体系的角度来讲,绝大多数都只是用到了core部分和Web部分的Web、Servlet这两个小模块。只不过Web部分采用了MVC的设计模式,我们习惯把它Web部分称之为SpringMVC。

        为了让Spring和SpringMVC之间有关联,但又不相互耦合。(Core可以无需Web,但Web必须依赖core), 设计者就告诉我们:当你要用springmvc时,Spring的core部分创建一个ApplicationContext实例,主要存放那些和web不相关的Bean。例如:@Service、@Repository、还有数据源等Bean。而   Spring的Web部分创建一个ApplicationContext实例,主要存放那些和web有相关的Bean。例如:@Controller、ViewResolver等Bean。见下图1

 

mvc context hierarchy

     WebApplicationContext接口继承了ApplicationContext接口。所以在web环境下,实质上创建会创建两个WebApplicationContext对象(需要看源码才知道)。一个在语义上叫 Root  WebApplicationContext,另一个叫 Servlet WebApplicaionContext。到这里,你一定想问一堆问题:为什么要把Bean分开放到两个容器中,这样一来Bean对象不就分离了吗。那么Controller要调用Service对象时,不就放到两个不同的容器里了吗?怎么还能取得到?要是我在开发中想获取WebApplicationContext,那我需不需要关注到底获取的是哪个WebApplicationContext,否则我怎么Bean分开存放之后,我通过context.getBean方法怎么拿得到?  以上的问题,其实就是一个问题:这两个WebApplicationContext对象会不会完全隔离?答案是不会。Servlet WebApplicationContext会委托(Delegates)Root WebApplicationContext查找bean,如果Servlet WebApplicationContext找不到bean的情况下。所以在这里是单向关联。源码暂不分析,不过给个简单的证明的办法:ApplicationContextAware接口有一个唯一的抽象方法。一个java实现类只要实现了这个接口,并且通过注解(或XML的<bean>标签配置) 声明为一个Bean,Spring启动过程中,会将创建好的ApplicationContext对象通过seApplicationContext 传入Bean对象。结合ApplicationContext的getParent方法,我们就可以通过以下代码测试并验证:到底有几个ApplicationContext对象,某个ApplicationContext对象中是否包含指定的Bean。

c46ab993b3fafc914874c90f95d1b78334d.jpg

看到这里已经很清晰明了了,但我还是啰嗦一句:在web环境下,Spring会先创建Root WebApplicationContext,再创建Servlet WebApplicationContext对象。
可是还有一个问题,那到底用WebApplicationContext的哪个实现类来创建对象呢?  翻源码呗,我信你个鬼【抠鼻】!在没有任何经验的情况下,你就知道用哪个?别傻了。还是得靠经验或者从别人哪里学习得知。所以只好这么说,as we all know:

    9dd41328c9625a018514b7668b578ed26d8.jpg

        ClassPathXmlApplicationContext 这个实现类,是使用XML配置文件创建的ApplicationContext。AnnotationConfigWebApplicationContext类就是使用注解来来创建ApplicationContext对象的。呼~~,So,使用注解来开发SpringMVC就是要创建两个AnnotationConfigWebApplicationContext实例作为IOC容器。这时候,你可能在想,还等什么赶紧看下AnnotationConfigWebApplicationContext的构造函数吧!!! 别慌!
AnnotationConfigWebApplicationContext可以不用我们手动创建!
AnnotationConfigWebApplicationContext可以不用我们手动创建!
AnnotationConfigWebApplicationContext可以不用我们手动创建!

往下看!

     2 SpringMVC和Servlet容器(本文是Tomcat)的关系是:SpringMVC有一个Servlet名字叫作DispatcherServlet,它被Servlet容器加载并初始化。SpringMVC会把自己的ROOT ApplicationContext对象放到Servlet容器的Servl

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值