好好想想,Spring Framework解决了什么问题?
Spring Framework最重要的特性是依赖注入
所有Spring模块的核心是依赖注入或IOC控制反转
为什么这很重要?因为,当正确使用DI或IOC时,我们可以开发松耦合的应用程序。松耦合的应用程序可以很方便进行单元测试。
举个简单的例子。
请考虑以下示例: 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();
}
}
依赖注入使世界看起来更简单。 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();
}
}
Spring Framework停止了依赖注入?不。许多Spring模块建立在依赖注入的核心概念之上:
Spring JDBC
Spring MVC
Spring AOP
Spring ORM
Spring JMS
Spring Test
仔细想想 SpringJMS
和 SpringJDBC
。这些模块是否带来了任何新功能?并没有!我们可以使用 J2EE
或 JavaEE
完成所有这些工作。那么,它们带来了什么?它们带来了简单的抽象。这些抽象的目的是为了:
减少样版代码/减少重复
促进解耦/增加单元可测试性
例如,与传统的 JDBC
或 JMS
相比,使用 JDBCTemplate
或 JMSTemplate
所需的代码要少得多。
SpringFramework
的优点在于它不会尝试解决已经解决的问题。它所做的就是提供与框架的完美集成,从而提供出色的解决方案。
Hibernate for ORM
iBatis for Object Mapping
JUnit和Mockito进行单元测试
Spring MVC Framewrok提供了开发Web应用程序的分离方式。使用Dispatcher Servlet,ModelAndView,View Resolver等概念,可以轻松开发Web应用程序
基于 Spring
的应用程序有很多配置。当我们使用 SpringMVC
时,我们需要配置组件扫描( component scan
), dispatcher servlet
,视图解析器( ViewResolver
), Webjar
(用于提供静态内容)等。
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
下面的代码片段显示了 Web
应用程序中调度程序 servlet
的典型配置。
org.springframework.web.servlet.DispatcherServlet
当我们使用 Hibernate/JPA
时,我们需要配置数据源(datasource),实体管理器工厂(entity manager factory),事务管理器(transaction manager)等众多其他事物。
destroy-method="close">
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
id="entityManagerFactory">
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
(用于日志记录)。在创建此课程时,我们必须选择所有这些框架的兼容版本。
以下是 SpringBoot
文档中关于 starter
的内容.
starter
是一组方便的依赖关系描述符,你可以在应用程序中包含这些描述符。可以获得所需的所有Spring和相关技术的一站式服务,而无需搜索示例代码并复制粘贴依赖。例如,如果你想使用Spring 和JPA进行数据库访问只需在项目中包含spring-boot-starter-data-jpa依赖项就行了
让我们考虑一个示例 starter
: SpringBootStarterWeb
。
如果您想开发Web应用程序或应用程序来公开 restful
服务, SpringBootStartWeb
是首选。使用 SpringInitializr
创建一个使用 SpringBootStarterWeb
的快速项目。 SpringBootStarterWeb
的依赖关系
以下截图显示了应用程序中不同依赖项:
依赖关系可分为:
Spring:核心,bean,context,aop
Web MVC :( Spring MVC)
JackSon:用于JSON绑定
Validation:Hibernate验证器,验证API
嵌入式Servlet容器:Tomcat
Logging:logback,slf4j
任何典型的Web应用程序都将使用所有这些依赖项。 SpringBootStarterWeb
预装了这些。作为开发人员,我不需要担心这些依赖项或它们的兼容版本。
正如我们从 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服务
一些技术性的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:启用高级监控和跟踪应用程序。
嵌入式服务器集成:由于服务器已集成到应用程序中,因此我需要在服务器上安装单独的应用程序服务器。
默认错误处理
感兴趣的朋友可以留言也可以发私信!