Spring, Spring Boot, Spring MVC, 到处都是springs! 这篇优锐课优锐课学习笔记将逐步介绍应在何时何地应用这些工具。
在本文中,你将获得Spring,Spring MVC和Spring Boot的概述,了解它们可以解决什么问题以及在哪里最好地应用它们。你将学到的最重要的事情是,Spring,Spring MVC和Spring Boot不会争夺相同的空间。他们解决了不同的问题,并且很好地解决了这些问题。
本文来自国内专业IT教育学院【优锐课】。Java学习资料交流qq群:907135806,在接下来的学习如果过程中有任何疑问,欢迎进群探讨。
认真思考。Spring Framework解决了什么问题?
Spring Framework最重要的功能是依赖注入。所有Spring模块的核心是依赖注入或IOC控制反转。
为什么这很重要?因为,如果正确使用DI或IOC,我们可以开发松耦合的应用程序。松耦合的应用程序可以轻松地进行单元测试。
让我们思考一个简单的例子。
请考虑以下示例:WelcomeController依赖WelcomeService来获取欢迎消息。如何获得WelcomeService的实例?
WelcomeService service = new WelcomeService();
它正在创建它的一个实例。这意味着它们紧密耦合。例如:如果在WelcomeController的单元测试中为WelcomeService创建了一个模拟,如何使WelcomeController使用该模拟?不容易!
@RestController
public class WelcomeController {
private WelcomeService service = new WelcomeService();
@RequestMapping("/welcome")
public String welcome() {
return service.retrieveWelcomeMessage();
}
}
使用依赖注入,世界看起来要简单得多。你让Spring框架完成艰苦的工作。我们只使用两个简单的注释:@Component和@Autowired。
• 使用 @Component,我们告诉Spring Framework:Hey,这是你需要管理的bean。
• 使用 @Autowired,我们告诉Spring Framework:Hey,找到此特定类型的正确匹配项并自动将其插入。
在下面的示例中,Spring框架将为WelcomeService创建一个bean,并将其自动装配到WelcomeController中。
在单元测试中,我可以要求Spring框架将WelcomeService的模拟自动连接到WelcomeController中。(使用Spring Boot,使用@MockBean可以轻松完成此操作。但是,这完全是另一回事了!)
@Component
public class WelcomeService {
//Bla Bla Bla
}
@RestController
public class WelcomeController {
@Autowired
private WelcomeService service;
@RequestMapping("/welcome")
public String welcome() {
return service.retrieveWelcomeMessage();
}
}
Spring Framework是否会因依赖注入而停止?否。它基于依赖注入的核心概念以及许多Spring模块。
• Spring JDBC
• Spring MVC
• Spring AOP
• Spring ORM
• Spring JMS
• Spring Test
思考一下Spring JMS和Spring JDBC。
这些模块是否带来任何新功能?否。我们可以使用J2EE或Java EE来完成所有这一切。那么,这些带来了什么?它们带来简单的抽象。这些抽象的目的是:
• 减少样板代码/减少重复
• 促进去耦/提高单元可测试性
例如,与传统的JDBC或JMS相比,使用JDBCTemplate或JMSTemplate所需的代码少得多。
Spring Framework的伟大之处在于它不会尝试解决已经解决的问题。它所做的一切就是与提供出色解决方案的框架提供良好的集成。
• 为ORM休眠
• 用于对象映射的iBatis
• 用于单元测试的JUnit和Mockito
Spring MVC Framework提供了分离的Web应用程序开发方式。使用诸如Dispatcher Servlet,ModelAndView和View Resolver的简单概念,可以轻松开发Web应用程序。
基于Spring的应用程序有很多配置。
使用Spring MVC时,我们需要配置组件扫描,调度程序servlet,视图解析器,Web jar(用于传递静态内容)等。
<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的典型配置。
dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/todo-servlet.xml 1 dispatcher /当我们使用Hibernate / JPA时,我们需要配置数据源,实体管理器工厂,事务管理器等等。
<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"/>
Spring Boot为此带来了新的思维过程。
我们可以带进更多情报吗? 将spring mvc jar添加到应用程序后,我们可以自动自动配置一些bean吗?
• 如果Hibernate jar在类路径中,如何自动配置数据源?
• 如果Spring MVC jar在类路径上,如何自动配置Dispatcher Servlet?
将提供一些设置来覆盖默认的自动配置。
Spring Boot着眼于a)CLASSPATH上可用的框架b)应用程序的现有配置。基于这些,Spring
Boot提供了使用这些框架配置应用程序所需的基本配置。这称为 Auto Configuration.
假设我们要开发一个网络应用程序。
首先,我们需要确定要使用的框架,使用的框架版本以及如何将它们连接在一起。
所有Web应用程序都有类似的需求。下面列出的是我们在Spring MVC课程中使用的一些依赖项。其中包括Spring MVC,Jackson Databind(用于数据绑定),Hibernate-Validator(用于使用Java Validation API进行服务器端验证)和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>
这是Spring Boot文档中关于入门者的内容。
入门程序是一组便捷的依赖项描述符,你可以在应用程序中包括它们。你可以一站式购买所需的所有Spring和相关技术,而不必遍历示例代码并复制依赖项描述符的粘贴负载。例如,如果你想开始使用Spring和JPA进行数据库访问,只需在项目中包括spring-boot-starter-data-jpa依赖项就可以了。
让我们考虑一个示例启动器:Spring Boot Starter Web。
如果要开发Web应用程序或公开静态服务的应用程序,则可以选择Spring Boot Start Web。让我们使用Spring Initializr使用Spring Boot Starter Web创建一个快速项目。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
依赖关系可分为:
• Spring: core, beans, context, aop
• Web MVC: (Spring MVC)
• Jackson: for JSON Binding
• Validation: Hibernate Validator, Validation API
• Embedded Servlet Container: Tomcat
• Logging: logback, slf4j
任何典型的Web应用程序都将使用所有这些依赖项。Spring Boot Starter Web预先打包了这些内容。作为开发人员,我不必担心这些依赖项或它们的兼容版本。
从Spring Boot Starter Web中可以看到,启动程序项目帮助我们快速开始开发特定类型的应用程序。
• 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服务
技术方面也有一些起步
• 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记录
Spring Boot的目标是在快速启用生产就绪应用程序。
• 执行器: 启用应用程序的高级监视和跟踪。
• 嵌入式服务器集成:由于服务器已集成到应用程序中,因此我需要在服务器上安装单独的应用程序服务器。
• 默认错误处理
本文分享到这。
有想要JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java学习资料和视频课程的童鞋也可以加vx:ddmsiqi 领取啦,共同进步~
抽丝剥茧 细说架构那些事——【优锐课】