从Servlet技术到Spring和Spring MVC,开发Web应用变得愈来愈简捷。可是Spring和Spring MVC的众多配置有时却让人望而却步,相信有过Spring MVC开发经验的朋友能深入体会到这一痛苦。由于即便是开发一个Hello-World的Web应用,都须要咱们在pom文件中导入各类依赖,编写web.xml、spring.xml、springmvc.xml配置文件等。特别是须要导入大量的jar包依赖时,咱们须要在网上查找各类jar包资源,各个jar间可能存在着各类依赖关系,这时候又得下载其依赖的jar包,有时候jar包间还存在着严格的版本要求,,因此当咱们只是想开发一个Hello-World的超简单的Web应用时,却把极大部分的时间在花在了编写配置文件和导入jar包依赖上,极大地影响了咱们的开发效率。因此为了简化Spring繁杂的配置,Spring Boot应运而生。正如Spring Boot的名称同样,一键启动,Spring Boot提供了自动配置功能,为咱们提供了开箱即用的功能,使咱们将重心放在业务逻辑的开发上。那么Spring Boot又是怎么简化Spring MVC的呢?Spring Boot和Spring、Spring MVC间又是怎样的关系呢?Spring Boot又有什么新特色呢?接下来,让咱们走进Spring MVC 到Spring Boot的简化之路,或许你就能找到这些答案。前端
没有依赖注入的例子:java
@RestController public class WelcomeController { private WelcomeService service = new WelcomeService(); @RequestMapping("/welcome") public String welcome() { return service.retrieveWelcomeMessage(); } } WelcomeService service = new WelcomeService(); 意味着WelcomeController类与WelcomeService类紧密结合在一块儿,耦合度高。
使用依赖注入的例子:web
@Component public class WelcomeService { //Bla Bla Bla } @RestController public class WelcomeController { @Autowired private WelcomeService service; @RequestMapping("/welcome") public String welcome() { return service.retrieveWelcomeMessage(); } } 依赖注入使世界看起来更简单,咱们让Spring 框架作了辛勤的工做: @Component:咱们告诉Spring框架-嘿,这是一个你须要管理的bean @Autowired:咱们告诉Spring框架-嘿,找到这个特定类型的正确匹配并自动装入它
1. 重复代码
Spring框架中止了依赖注入(DI)吗?没有,它在依赖注入(DI)的核心概念上开发了许多Spring模块:spring
2. 与其余框架良好的集成
Spring框架并不尝试去解决已经解决了的问题,它所作的一切就是提供与提供出色解决方案的框架的完美集成。sql
基于Spring的应用程序有不少配置。当咱们使用Spring MVC时,咱们须要配置组件扫描,调度器servlet,视图解析器等:数据库
视图解析器配置: <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/"/> 前端调度器的典型配置: <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时,咱们须要配置一个数据源,一个实体管理器工厂,一个事务管理器以及许多其余事物: <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解决的问题缓存
1. Spring Boot 自动配置
Spring引入了新的思惟过程:咱们能够变得更加智能些吗?当一个spring mvc jar包被添加到应用程序时,咱们是否能够自动配置一些bean?服务器
2. Spring Boot Starter Projects
假设咱们想开发一个Web应用程序。首先,咱们须要肯定咱们想要使用的框架,使用哪一个版本的框架以及如何将它们链接在一块儿。全部Web应用程序都有相似的需求 下面列出的是咱们在Spring MVC中使用的一些依赖关系。这些包括Spring MVC,Jackson Databind(用于数据绑定),Hibernate-Validator(用于使用Java验证API的服务器端验证)和Log4j(用于日志记录)。在建立时,咱们必须选择全部这些框架的兼容版本:mvc
<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>
Starter是一套方便的依赖描述符,能够包含在应用程序中。 你能够得到所需的全部Spring及相关技术的一站式服务,而无需搜索示例代码并复制依赖描述符的粘贴负载。 例如,若是你想开始使用Spring和JPA来访问数据库,只需在你的项目中包含spring-boot-starter-data-jpa依赖项就好。
咱们来看Starter的一个示例 - Spring-Boot-Starter-Webapp
Spring-Boot-Starter-Web依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
如下屏幕截图显示了添加到咱们的应用程序中的不一样依赖关系:
任何典型的Web应用程序都会使用全部这些依赖项.Spring Boot Starter Web预先打包了这些。做为开发人员,咱们不须要担忧这些依赖关系或兼容版本。
3. Spring Boot Starter项目选项
正如Spring Boot Starter Web同样,Starter项目帮助咱们快速入门开发特定类型的应用程序:
前面已经初步介绍过,在这里详细介绍一下。
当咱们启动Spring Boot应用程序时,咱们能够在日志中看到一些重要的消息。
Mapping servlet: 'dispatcherServlet' to [/] Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
上面的日志语句显示了Spring Boot Auto Configuration的行为。
一当咱们在应用中添加了Spring Boot Starter Web依赖,Spring Boot AutoConfiguration就会发现Spring MVC在类路径下,它会自动配置dispatcherServlet,一个默认的错误页面和webjars。
若是你添加了Spring Boot DataJPA Starter依赖,Spring Boot AutoConfiguration会自动配置数据源(datasource)和实体管理器(Entity Manager)
全部的自动配置逻辑都在spring-boot-autoconfigure.jar中实现。mvc、data和其余框架的全部自动配置逻辑都存在与一个jar包中。
spring-boot-autoconfigure.jar中重要的文件是/META-INF/spring.factories,该文件;列出了在EnableAutoConfiguration key下启动的全部自动配置类。下面列出一些重要的配置类:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,\ org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\ org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
打开调试日志
在application.properties打开调试日志:
logging.level.org.springframework: DEBUG
当启动程序时,会打印自动配置日志信息
Spring Boot的出现自己就是为了减低Web开发的门槛,使开发人员可以专一于业务开发,而不需浪费时间在业务开发以外,至此Spring MVC到Spring Boot的简化之路到此结束。
做者:Beyondlcg 连接:https://juejin.im/post/5aa22d1f51882555677e2492 来源:掘金 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。