Spring、Spring MVC、Spring Boot三者的关系还傻傻分不清楚?
点击蓝色“程序猿DD”关注我
回复“资源”获取独家整理的学习资料!
在本文中,你将获取到有关于Spring,Spring MVC和Spring Boot的概述,了解他们解决的问题以及最佳的应用位置。最重要的是Spring,Spring MVC和Spring Boot不会矛盾。他们很好的解决了不同的问题。
1.Spring框架解决的核心问题是什么?
好好想想,Spring Framework解决了什么问题?
Spring Framework最重要的特性是依赖注入
所有Spring模块的核心是依赖注入或IOC控制反转
为什么这很重要?因为,当正确使用DI或IOC时,我们可以开发松耦合的应用程序。松耦合的应用程序可以很方便进行单元测试。
举个简单的例子。
2.没有依赖注入的示例
请考虑以下示例: WelcomeController
依赖于 WelcomeService
来获取 欢迎
消息。它是如何获取 WelcomeService
实例的?
WelcomeService service = new WelcomeService();
它正在创建它的一个实例,这意味着他们紧密相连。例如:如果我在 WelcomeController
的单元测试中为 WelcomeService
创建一个模拟器,我如何使用模 mock
创建 WelcomeController
?没那么简单!
@RestController
public class WelcomeController { private WelcomeService service = new WelcomeService(); @RequestMapping("/welcome") public String welcome() { return service.retrieveWelcomeMessage(); }
}
3.相同的示例使用依赖注入
依赖注入使世界看起来更简单。 SpringFramework
为你做了很多艰难的工作。我们只使用两个简单的注解: @Component
和 @Autowired
。
使用 @Component
告诉 SpringFramework
:这是一个你需要管理的 bean
。使用 @Autowired
告诉 SpringFramework
:找到这个特定类型的正确匹配并自动装配它。在下面的示例中, Spring
框架将为 WelcomeService
创建一个 bean
,并将其自动装入 WelcomeController
。在单元测试中,我可以要求 Spring
框架将 WelcomeService
的模拟自动连接到 WelcomeController
。( SpringBoot
使用 @MockBean
可以很容易地做到这一点。但是,这是另外一件事了!)
@Component
public class WelcomeService { //Bla Bla Bla
}
@RestController
public class WelcomeController { @Autowired private WelcomeService service; @RequestMapping("/welcome") public String welcome() { return service.retrieveWelcomeMessage(); }
}
3.Spring Framework还能解决什么问题?
问题1:减少样板代码
Spring Framework停止了依赖注入?不。许多Spring模块建立在依赖注入的核心概念之上:
Spring JDBC
Spring MVC
Spring AOP
Spring ORM
Spring JMS
Spring Test
仔细想想 SpringJMS
和 SpringJDBC
。这些模块是否带来了任何新功能?并没有!我们可以使用 J2EE
或 JavaEE
完成所有这些工作。那么,它们带来了什么?它们带来了简单的抽象。这些抽象的目的是为了:
减少样版代码/减少重复
促进解耦/增加单元可测试性
例如,与传统的 JDBC
或 JMS
相比,使用 JDBCTemplate
或 JMSTemplate
所需的代码要少得多。
问题2:与其他框架的良好集成
SpringFramework
的优点在于它不会尝试解决已经解决的问题。它所做的就是提供与框架的完美集成,从而提供出色的解决方案。
Hibernate for ORM
iBatis for Object Mapping
JUnit和Mockito进行单元测试
4.Spring MVC框架解决的核心问题是什么?
Spring MVC Framewrok提供了开发Web应用程序的分离方式。使用Dispatcher Servlet,ModelAndView,View Resolver等概念,可以轻松开发Web应用程序
5.我们为什么需要springboot?
基于 Spring
的应用程序有很多配置。当我们使用 SpringMVC
时,我们需要配置组件扫描( component scan
), dispatcher servlet
,视图解析器( ViewResolver
), Webjar
(用于提供静态内容)等。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <mvc:resources mapping="/webjars/**" location="/webjars/"/>
下面的代码片段显示了 Web
应用程序中调度程序 servlet
的典型配置。
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/todo-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
当我们使用 Hibernate/JPA
时,我们需要配置数据源(datasource),实体管理器工厂(entity manager factory),事务管理器(transaction manager)等众多其他事物。
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${db.driver}" /> <property name="jdbcUrl" value="${db.url}" /> <property name="user" value="${db.username}" /> <property name="password" value="${db.password}" /> </bean> <jdbc:initialize-database data-source="dataSource"> <jdbc:script location="classpath:config/schema.sql" /> <jdbc:script location="classpath:config/data.sql" /> </jdbc:initialize-database> <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="persistenceUnitName" value="hsql_pu" /> <property name="dataSource" ref="dataSource" /> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/>
问题1: SpringBoot自动配置:我们能有不同的想法吗?
SpringBoot
带来了一个全新的思维过程:
我们能在这方面思考更深入吗?
当
spring mvc jar
被添加到应用程序中时,我们可以自动配置一些bean吗?
如果 Hibernatejar
在 classpath
上,自动配置数据源怎么样?
如果 SpringMVC jar
在 classpath
上,那么自动配置 DispatcherServlet
怎么样? 这将有规定会覆盖默认的自动配置。
Spring Boot查看应用的CLASSPATH已存在的配置,基于这些,SpringBoot提供应用程序中框架所需要的这些基本配置。这被称为自动装配(Auto Configuration)
问题2: SpringBootStarter项目:围绕众所周知的模式构建
假设我们想开发一个Web应用程序。
首先,我们需要确定我们想要使用的框架,使用哪些框架版本以及如何将它们连接在一起。所有Web应用程序都有类似的需求。下面列出了我们在Spring MVC课程中使用的一些依赖项。这些包括 SpringMVC
, JacksonDatabind
(用于数据绑定), Hibernate-Validator
(用于使用 JavaValidationAPI
的服务器端验证)和 Log4j
(用于日志记录)。在创建此课程时,我们必须选择所有这些框架的兼容版本。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.2.RELEASE</version>
</dependency>
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version>
</dependency>
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.0.2.Final</version>
</dependency>
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version>
</dependency>
以下是 SpringBoot
文档中关于 starter
的内容.
starter
是一组方便的依赖关系描述符,你可以在应用程序中包含这些描述符。可以获得所需的所有Spring和相关技术的一站式服务,而无需搜索示例代码并复制粘贴依赖。例如,如果你想使用Spring 和JPA进行数据库访问只需在项目中包含spring-boot-starter-data-jpa依赖项就行了
让我们考虑一个示例 starter
: SpringBootStarterWeb
。
如果您想开发Web应用程序或应用程序来公开 restful
服务, SpringBootStartWeb
是首选。使用 SpringInitializr
创建一个使用 SpringBootStarterWeb
的快速项目。 SpringBootStarterWeb
的依赖关系
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId>
</dependency>
以下截图显示了应用程序中不同依赖项:
依赖关系可分为:
Spring:核心,bean,context,aop
Web MVC :( Spring MVC)
JackSon:用于JSON绑定
Validation:Hibernate验证器,验证API
嵌入式Servlet容器:Tomcat
Logging:logback,slf4j
任何典型的Web应用程序都将使用所有这些依赖项。 SpringBootStarterWeb
预装了这些。作为开发人员,我不需要担心这些依赖项或它们的兼容版本。
6.Spring Boot Starter项目选项
正如我们从 SpringBootStarterWeb
中看到的那样,入门项目帮助我们快速开始开发特定类型的应用程序。
spring-boot-starter-web-services:SOAP Web服务
spring-boot-starter-web:Web和RESTful应用程序
spring-boot-starter-test:单元测试和集成测试
spring-boot-starter-jdbc:传统的JDBC
spring-boot-starter-hateoas:为您的服务添加HATEOAS功能
spring-boot-starter-security:使用Spring Security进行身份验证和授权
spring-boot-starter-data-jpa:带有Hibernate的Spring Data JPA
spring-boot-starter-cache:启用Spring Framework的缓存支持
spring-boot-starter-data-rest:使用Spring Data REST公开简单REST服务
7.Spring Boot的其他目标
一些技术性的starter:
spring-boot-starter-actuator:使用开箱即用的监控和跟踪等高级功能
spring-boot-starter-undertow,spring-boot-starter-jetty,spring-boot-starter-tomcat:选择特定的嵌入式Servlet容器
spring-boot-starter-logging:用于使用logback进行日志记录
spring-boot-starter-log4j2:使用Log4j2进行日志记录
SpringBoot
旨在快速实现生产就绪应用程序。
Actuator:启用高级监控和跟踪应用程序。
嵌入式服务器集成:由于服务器已集成到应用程序中,因此我需要在服务器上安装单独的应用程序服务器。
默认错误处理
原文:https://dzone.com/articles/spring-boot-vs-spring-mvc-vs-spring-how-do-they-compare
作者:Ranga Karanam
译者:Yunooa
每日一问
今日问题:烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?
(留言说说你的方案吧,明日推文公布答案)
昨日答案:两边一起烧
(昨日问题可在昨日推文的文末查看)
推荐阅读
可能是全网最好的MySQL重要知识点 | 面试必备
开发高质量的软件要付出什么样的代价?
7月编程语言排行榜来了,为什么不同媒体报道的结果不一样?
装x撩m必备的16条Linux 命令,了解一下?
使用 Optional 摆脱 NullPointException 的折磨
来星球聊聊技术人的斜杠生活
点一点“阅读原文”小惊喜在等你
Spring、Spring MVC、Spring Boot三者的关系还傻傻分不清楚?相关推荐
- MESSL(maven + extjs + spring portlet mvc + spring web flow + liferay )整合架构 1
春节前我曾经为一个项目做架构,作为公司机密我无法透露这个项目的背景,但是它的实现技术主要是如下: 前端: ext-js (这个作为富客户端的javascript框架还是有极强的竞争力的,因为比较炫) ...
- Spring Web MVC (Spring MVC) 的相关例题及解析
MVC.web MVC.Spring MVC 和 Spring Web MVC的联系与区别: 1.MVC 是一种架构分层模式 2.web MVC 是指在 web 领域下实践的 MVC,因为 web 领 ...
- MESSL(maven + extjs + spring portlet mvc + spring web flow + liferay )整合架构 5
流控制文件很简单,就是根元素是<view>,然后用<view-state>来代表一个一个的页面,用<transition>来代表从一个状态到另外一个状态的跳转,如果 ...
- java中mvc模式是什么_什么是MVC模式 MVC模式中三者之间关系
MVC模式设计的初衷是,一旦一个项目的代码量变大的时候,src文件夹中可以写java代码,web文件夹中也可以写jsp代码.除此之外src中还可以写好多包,web文件夹中还可以写好多文件夹,现在假如新 ...
- Spring系列之Spring Web MVC-20
目录 Spring Web MVC DispatcherServlet 上下文层次结构 特殊Bean Web MVC 配置 程序配置 工作原理 异常 视图解析 配置 重定向 转发 内容协商 过滤器 F ...
- 多个切点 boot spring_全网独家Spring/Cloud/MVC/Boot,脑图+面试+进阶,就问你服不服?...
近期搜刮了一些Spring全家桶系列的思维脑图.经典面试题和进阶学习的PDF笔记(非常nice),Spring+SpringCloud+SpringMVC+SpringBoot,一个都没落下全都有!一 ...
- Spring Cloud与Spring Boot版本匹配关系
Spring Cloud与Spring Boot版本匹配关系 Spring Cloud与Spring Boot版本匹配关系 Spring Cloud Spring Boot Finchley 兼容Sp ...
- Spring Boot——2分钟构建spring web mvc REST风格HelloWorld
Spring Boot--2分钟构建spring web mvc REST风格HelloWorld 之前有一篇<5分钟构建spring web mvc REST风格HelloWorld>介 ...
- Spring、SpringMVC和SpringBoot之间的关系
1.Spring Spring是一个开源容器框架,它接管了Web层.业务层.DAO层.持久性层的组件,并可以配置各种bean并维护bean到bean的关系. 其核心是控制反转(IOC)和面向方面(AO ...
最新文章
- You might want to run 'apt-get -f install' to correct these: The following packages have unmet depen
- 对于随机森林的通俗理解
- 对研发人员很有震撼和启发的公式
- 【转】DCMTK各模块说明!!!!!!!
- python经典书 豆瓣_入门,,豆瓣高分推荐的Python书籍
- 行进位,超前进位 ,行波进位 ,并行进位有什么区别
- SVM与feature
- 擅长C(DAY 70)
- 搜人2013笔试题(java)
- 推荐 21 款博主常用 Windows 软件
- 8086汇编段地址和偏移地址分配原则,深入理解.
- 关于MDI文件与Microsoft Office Document Imaging
- it行业se是_计算机行业SSE、SE、BSE、PE、PL各自是什么职位意思?
- linux 网络问题 ipv4 forwarding
- 电脑读取不U盘,在磁盘管理器中显示“无媒体”解决方法
- libreoffice7.0 离线安装
- 04.jQuery++1201
- 固态硬盘跟机械硬盘的区别
- 微信H5、公众号开发,域名重定向
- 螺距规的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
热门文章
- dockerfile 中的 multi-stage 多阶段构建
- linux c dup dup2 重定向函数简介
- linux c 随机函数 rand srand 介绍
- linux socket中 send recv函数的 flags参数
- linux shell scp 远程拷贝 上传下载
- Run-Time Check Failure #0,The value of ESP was not properly saved 错误解决
- windows核心编程 如何等待超过64(MAXIMUM_WAIT_OBJECTS) kernal object
- 关于Debug和Release之本质区别的讨论
- Android Service 全解析
- VC维的来龙去脉(转)