前言
什么是Spring?它解决了什么问题?
- 我们说到Spring,一般指代的是Spring Framework,它是一个开源的应用程序框架,提供了一个简易的开发方式,通过这种开发方式,将避免那些可能致使代码变得繁杂混乱的大量的业务/工具对象,说的更通俗一点就是由框架来帮你管理这些对象,包括它的创建,销毁等,比如基于Spring的项目里经常能看到的
Bean
,它代表的就是由Spring管辖的对象。 - 而在被管理对象与业务逻辑之间,Spring通过IOC(控制反转)架起使用的桥梁,IOC也可以看做Spring最核心最重要的思想,通过IOC能带来什么好处呢?首先来看一个实际开发中的典型应用场景,假设我们有一个基于MVC分层结构的应用,通过controller层对外提供接口,而通过service层提供具体的实现,在service层中有一个
WelcomeService
服务接口,一般情况下都是通过WelcomeService service = new WelcomeServiceImpl();
创建实例并进行调用:
public class WelcomeController {
private WelcomeService service = new WelcomeServiceImpl();
@RequestMapping("/welcome")
public String welcome() {
return service.retrieveWelcomeMessage();
}
}
通过Spring的IOC如何实现,首先将WelcomeService
交由Spring管理:
<bean name="WelcomeService" class="XXX.XXX.XXX.service.impl.WelcomeServiceImpl"/>
然后在业务代码处通过Spring IOC拿到具体对象:
public class WelcomeController {
@Autowired
private WelcomeService service;
@RequestMapping("/welcome")
public String welcome() {
return service.retrieveWelcomeMessage();
}
}
这种方式对业务代码没有任何侵入,它有效的实现松耦合,大家都知道紧耦合的代码是业务发展的噩梦;同时,Spring IOC提供的远不止这些,如通过单例减少创建无用的对象,通过延迟加载优化初始化成本等
当然,Spring 的核心功能远不知这些,如:Spring AOP、Spring JDBC、Spring ORM、Spring MVC、Spring Test、Spring JMS。纵览Spring的结构,你会发现Spring Framework 本身并未提供太多具体的功能,它主要专注于让你的项目代码组织更加优雅,使其具有极好的灵活性和扩展性,同时又能通过Spring集成业界优秀的解决方案
什么是Spring MVC?它解决了什么问题?
- spring MVC主要用于开发WEB应用和网络接口,它是Spring的一个模块,通过Dispatcher Servlet, ModelAndView 和 View Resolver,让应用开发变得很容易,一个典型的Spring MVC应用开发分为下面几步:
首先声明Dispatcher Servlet:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>com.qgd.oms.web.common.mvc.OmsDispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
通过配置文件声明servlet详情,如MVC resource,data source,bean等
<mvc:resources mapping="/css/**/*" location="/static/css/" cache-period="21600"/>
<mvc:resources mapping="/js/**/*" location="/static/js/" cache-period="21600"/>
<mvc:resources mapping="/views/**/*.html" location="/static/views/" cache-period="21600"/>
<mvc:resources mapping="/fonts/**/*" location="/static/fonts/"/>
<mvc:resources mapping="/ueditor/**/*" location="/static/js/lib/ueditor/"/>
<mvc:resources mapping="/img/**/*" location="/static/img/"/>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="validationQuery" value="${jdbc.validationQuery}"/>
<property name="maxTotal" value="10"/>
<property name="minIdle" value="5"/>
<property name="maxIdle" value="10"/>
<property name="defaultAutoCommit" value="true"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="true"/>
<property name="poolPreparedStatements" value="true"/>
<property name="maxOpenPreparedStatements" value="50"/>
</bean>
<bean id="configService" class="com.qgd.oms.web.common.service.ConfigService">
<property name="configStore">
<bean class="com.qgd.oms.web.common.service.impl.DbConfigStore">
<property name="dataSource" ref="dataSource"/>
<property name="taskScheduler" ref="defaultScheduler"/>
<property name="refreshInterval" value="30000"/>
</bean>
</property>
</bean>
若需添加其它功能,如security,则需添加对应配置:
<http pattern="/css/**/*" security="none"/>
<http pattern="/js/**/*" security="none"/>
<http pattern="/views/**/*.html" security="none"/>
<http pattern="/fonts/**/*" security="none"/>
<http pattern="/ueditor/**/*" security="none"/>
<http pattern="/img/**/*" security="none"/>
<http use-expressions="true" entry-point-ref="omsAuthenticationEntryPoint">
<logout logout-url="/omsmc/authentication/logout/*" success-handler-ref="omsLogoutSuccessHandler"></logout>
<intercept-url pattern='/omsmc/authentication/login*' access="permitAll" />
<intercept-url pattern='/ms/**/*' access="permitAll" />
<intercept-url pattern='/**' access="authenticated" />
<!--<security:form-login />-->
<custom-filter ref="omsUsernamePasswordAuthenticationFilter" position="FORM_LOGIN_FILTER" />
<remember-me services-ref="omsRememberMeServices" key="yfboms"/>
<csrf disabled="true"/>
</http>
什么是Spring Boot?它解决了什么问题?
- 初期的Spring通过代码加配置的形式为项目提供了良好的灵活性和扩展性,但随着Spring越来越庞大,其配置文件也越来越繁琐,太多复杂的xml文件也一直是Spring被人诟病的地方,特别是近些年其他简洁的WEB方案层出不穷,如基于Python或Node.Js,几行代码就能实现一个WEB服务器,对比起来,大家渐渐觉得Spring那一套太过繁琐,此时,Spring社区推出了Spring Boot,它的目的在于实现自动配置,降低项目搭建的复杂度,如需要搭建一个接口服务,通过Spring Boot,几行代码即可实现,请看代码示例:
//引入spring-boot-starter-web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
//声明Spring Boot应用,直接写业务逻辑即可
@Controller
@SpringBootApplication
public class MockServerApplication {
@RequestMapping("/hi")
@ResponseBody
String home() {
return "how are you!";
}
public static void main(String[] args) {
SpringApplication.run(MockServerApplication.class, args);
}
}
你甚至都不用额外的WEB容器,直接生成jar包执行即可,因为spring-boot-starter-web
模块中包含有一个内置tomcat,可以直接提供容器使用;基于Spring Boot,不是说原来的配置没有了,而是Spring Boot有一套默认配置,我们可以把它看做比较通用的约定,而Spring Boot遵循的也是约定优于配置原则,同时,如果你需要使用到Spring以往提供的各种复杂但功能强大的配置功能,Spring Boot一样支持
在Spring Boot中,你会发现你引入的所有包都是starter形式,如:
spring-boot-starter-web-services
,针对SOAP Web Servicesspring-boot-starter-web
,针对Web应用与网络接口spring-boot-starter-jdbc
,针对JDBCspring-boot-starter-data-jpa
,基于hibernate的持久层框架spring-boot-starter-cache
,针对缓存支持
Spring Boot对starter的解释如下:
- Starters是一系列极其方便的依赖描述,通过在你的项目中包含这些starter,你可以一站式获得你所需要的服务,而无需像以往那样copy各种示例配置及代码,然后调试,真正做到开箱即用;比如你想使用Spring JPA进行数据操作,只需要在你的项目依赖中引入spring-boot-starter-data-jpa即可
什么是Spring Cloud?它解决了什么问题?
- Spring Cloud是一系列框架的集合。它利用Spring Boot的开发便利性简化了分布式系统基础设施的开发,如服务发现、服务注册、配置中心、消息总线、负载均衡、 熔断器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过SpringBoot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包
- spring cloud大部分的功能插件都是基于springBoot去实现的,springCloud关注于全局的微服务整合和管理,将多个springBoot单体微服务进行整合以及管理; springCloud依赖于springBoot开发,而springBoot可以独立开发;
- 与其说spring cloud是框架,不如说spring cloud是一个生态。它里面包含了多个springBoot。springCloud更关注的是全局微服务的整合和管理,相当于管理多个springBoot框架的单体微服务;
- Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务,Spring Cloud是一个基于Spring Boot实现的开发工具;Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架; Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring Boot来实现,必须基于Spring Boot开发。可以单独使用Spring Boot开发项目,但是Spring Cloud离不开 Spring Boot。
(1)单体架构所有的模块全都耦合在一块,代码量大,维护困难。
- 微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。
(2)单体架构所有的模块都共用一个数据库,存储方式比较单一。
- 微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。
(3)单体架构所有的模块开发所使用的技术一样。
- 微服务每个模块都可以使用不同的开发技术,开发模式更灵活。
总结
Spring MVC和Spring Boot都属于Spring,Spring MVC 是基于Spring的一个 MVC 框架,而Spring Boot 是基于Spring的一套快速开发整合包,Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架