作者:乐傻驴
uee.me/cNDC8
概述
对于 Spring
和 SpringBoot
到底有什么区别,我听到了很多答案,刚开始迈入学习 SpringBoot
的我过后也是一头雾水,随着教训的积攒、我缓缓了解了这两个框架到底有什么区别,置信对于用了 SpringBoot
很久的同学来说,还不是很了解 SpringBoot
到底和 Spring
有什么区别,看完文章中的比拟,或者你有了不同的答案和认识!
什么是 Spring
作为 Java
开发人员,大家都 Spring
都不生疏,简而言之,Spring
框架为开发 Java
应用程序提供了全面的基础架构反对。它蕴含一些很好的性能,如依赖注入和开箱即用的模块,如:
SpringJDBC、SpringMVC、SpringSecurity、SpringAOP、SpringORM、SpringTest
,这些模块缩短应用程序的开发工夫,进步了利用开发的效率例如,在 JavaWeb
开发的晚期阶段,咱们须要编写大量的代码来将记录插入到数据库中。然而通过应用 SpringJDBC
模块的 JDBCTemplate
,咱们能够将操作简化为几行代码。
什么是 Spring Boot
SpringBoot
基本上是 Spring
框架的扩大,它打消了设置 Spring
应用程序所需的 XML 配置
,为更快,更高效的开发生态系统铺平了路线。
SpringBoot
中的一些特色:
1、创立独立的 Spring
利用。
2、嵌入式 Tomcat
、Jetty
、Undertow
容器(无需部署 war 文件)。
3、提供的 starters
简化构建配置
4、 尽可能主动配置 spring
利用。
5、提供生产指标, 例如指标、强壮检查和内部化配置
6、 齐全没有代码生成和 XML
配置要求
从配置剖析
Maven 依赖
首先,让咱们看一下应用 Spring 创立 Web 应用程序所需的最小依赖项
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.0.RELEASE</version>
</dependency>
与 Spring 不同,Spring Boot 只须要一个依赖项来启动和运行 Web 应用程序:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>
在进行构建期间,所有其余依赖项将主动增加到我的项目中。
另一个很好的例子就是测试库。咱们通常应用 SpringTest
,JUnit
,Hamcrest
和 Mockito
库。在 Spring
我的项目中,咱们应该将所有这些库增加为依赖项。然而在 SpringBoot 中
,咱们只须要增加 spring-boot-starter-test
依赖项来主动蕴含这些库。
Spring Boot 为不同的 Spring 模块提供了许多依赖项。一些最罕用的是:
spring-boot-starter-data-jpa
`spring-boot-starter-securityspring-boot-starter-test
spring-boot-starter-web`spring-boot-starter-thymeleaf
无关 starter
的残缺列表,请查看 Spring 文档。
MVC 配置
让咱们来看一下 Spring
和 SpringBoot
创立 JSPWeb
应用程序所需的配置。
Spring
须要定义调度程序 servlet
,映射和其余反对配置。咱们能够应用 web.xml
文件或 Initializer
类来实现此操作:
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.pingfangushi");
container.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
还须要将 @EnableWebMvc
正文增加到 @Configuration
类,并定义一个视图解析器来解析从控制器返回的视图:
@EnableWebMvc
@Configuration
public class ClientWebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver bean
= new InternalResourceViewResolver();
bean.setViewClass(JstlView.class);
bean.setPrefix("/WEB-INF/view/");
bean.setSuffix(".jsp");
return bean;
}
}
再来看 SpringBoot
一旦咱们增加了 Web
启动程序,SpringBoot
只须要在 application
配置文件中配置几个属性来实现如上操作:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
下面的所有 Spring 配置都是通过一个名为 auto-configuration 的过程增加 Bootweb starter
来主动蕴含的。
这意味着 SpringBoot
将查看应用程序中存在的依赖项,属性和 bean
,并依据这些依赖项,对属性和 bean
进行配置。当然,如果咱们想要增加本人的自定义配置,那么 SpringBoot
主动配置将会退回。
配置模板引擎
当初咱们来看下如何在 Spring 和 Spring Boot 中配置 Thymeleaf 模板引擎。
在 Spring
中,咱们须要为视图解析器增加 thymeleaf-spring5
依赖项和一些配置:
@Configuration
@EnableWebMvc
public class MvcWebConfig implements WebMvcConfigurer {
@Autowired
private ApplicationContext applicationContext;
@Bean
public SpringResourceTemplateResolver templateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(applicationContext);
templateResolver.setPrefix("/WEB-INF/views/");
templateResolver.setSuffix(".html");
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setEnableSpringELCompiler(true);
return templateEngine;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
registry.viewResolver(resolver);
}
}
SpringBoot1X
只须要 spring-boot-starter-thymeleaf
的依赖项来启用 Web
应用程序中的 Thymeleaf
反对。然而因为 Thymeleaf3.0
中的新性能,咱们必须将 thymeleaf-layout-dialect
增加为 SpringBoot2X
Web 应用程序中的依赖项。配置好依赖,咱们就能够将模板增加到 src/main/resources/templates
文件夹中,SpringBoot
将主动显示它们。
Spring Security 配置
为简略起见,咱们应用框架默认的 HTTPBasic
身份验证。让咱们首先看一下应用 Spring
启用 Security
所需的依赖关系和配置。
Spring
首先须要依赖 spring-security-web
和 spring-security-config
模块。接下来,咱们须要增加一个扩大 WebSecurityConfigurerAdapter
的类,并应用 @EnableWebSecurity
注解:
@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin")
.password(passwordEncoder()
.encode("password"))
.authorities("ROLE_ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
这里咱们应用 inMemoryAuthentication
来设置身份验证。同样,SpringBoot
也须要这些依赖项能力使其工作。然而咱们只须要定义 spring-boot-starter-security
的依赖关系,因为这会主动将所有相干的依赖项增加到类门路中。
SpringBoot
中的平安配置与下面的雷同。
应用程序启动疏导配置
Spring
和 SpringBoot
中应用程序疏导的根本区别在于 servlet
。Spring
应用 web.xml
或 SpringServletContainerInitializer
作为其疏导入口点。SpringBoot
仅应用 Servlet3
性能来疏导应用程序,上面让咱们具体来理解下
Spring 疏导配置
Spring
反对传统的 web.xml
疏导形式以及最新的 Servlet3+
办法。
配置 web.xml
办法启动的步骤
Servlet
容器(服务器)读取 web.xml
web.xml
中定义的 DispatcherServlet
由容器实例化
DispatcherServlet
通过读取 WEB-INF/{servletName}-servlet.xml
来创立 WebApplicationContext
。最初,DispatcherServlet
注册在应用程序上下文中定义的 bean
应用 Servlet3+
办法的 Spring
启动步骤
容器搜寻实现 ServletContainerInitializer
的类并执行 SpringServletContainerInitializer
找到实现所有类 WebApplicationInitializer
`WebApplicationInitializer创立具备 XML 或上下文
@Configuration类
WebApplicationInitializer创立
DispatcherServlet` 与先前创立的上下文。
SpringBoot 疏导配置
Spring Boot 应用程序的入口点是应用 @SpringBootApplication 正文的类
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
默认状况下,SpringBoot
应用嵌入式容器来运行应用程序。在这种状况下,SpringBoot
应用 publicstaticvoidmain
入口点来启动嵌入式 Web
服务器。此外,它还负责将 Servlet
,Filter
和 ServletContextInitializerbean
从应用程序上下文绑定到嵌入式 servlet
容器。SpringBoot
的另一个个性是它会主动扫描同一个包中的所有类或 Main
类的子包中的组件。
SpringBoot
提供了将其部署到内部容器的形式。咱们只须要扩大 SpringBootServletInitializer
即可:
/**
* War 部署
*
* @author SanLi
* Created by 2689170096@qq.com on 2018/4/15
*/
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.addListener(new HttpSessionEventPublisher());
}
}
这里内部 servlet
容器查找在 war 包下的 META-INF
文件夹下 MANIFEST.MF 文件中定义的 Main-class
,SpringBootServletInitializer
将负责绑定 Servlet
,Filter
和 ServletContextInitializer
。
打包和部署
最初,让咱们看看如何打包和部署应用程序。这两个框架都反对 Maven
和 Gradle
等通用包治理技术。然而在部署方面,这些框架差别很大。例如,Spring Boot Maven 插件在 Maven
中提供 SpringBoot
反对。它还容许打包可执行 jar
或 war
包并 就地
运行应用程序。
在部署环境中 SpringBoot
比照 Spring
的一些长处包含:
1、提供嵌入式容器反对
2、 应用命令_java -jar_独立运行 jar
3、在内部容器中部署时,能够抉择排除依赖关系以防止潜在的 jar 抵触
4、 部署时灵便指定配置文件的选项
5、 用于集成测试的随机端口生成
论断
简而言之,咱们能够说 SpringBoot
只是 Spring
自身的扩大,使开发,测试和部署更加不便。