赞
踩
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
Spring Boot 是快速开发的 Spring 框架,而 Spring Cloud 是完整的微服务框架,Spring Cloud 依赖于 SpringBoot进行开发。
核心注解是 @SpringBootApplication,它主要由@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan这三个构成:
主要有.properties 和 .yml,它们的区别主要是写的格式不同:
.properties:
user.name = jason
.yml:
user:
name: javastack
这里需要注意:.yml 格式不支持 @PropertySource 注解导入配置
不需要,因为已经内置了 Tomcat/ Jetty 等容器
个人理解 Spring Boot 就是由各种 Starter 组合起来的,我们自己也可以开发Starter。
当一个项目变得相当复杂,管理依赖会成为一个噩梦,因为当中涉及太多 artifacts 了。
这时候 SpringBoot starter 就派上用处了。其他所需的依赖以一致的方式注入并且被管理。
所有的 starter 都归于 org.springframework.boot 组中,并且它们都以由 spring-boot-starter- 开头取名。这种命名方式使得我们更容易找到 starter 依赖,特别是当我们使用那些支持通过名字查找依赖的 IDE 当中。
SpringBoot 提供了非常多的 starter ,其中最常用的是:
使用 @ImportResource 注解导入老 Spring 项目配置文件
Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过@ImportResource 注解可以引入一个 XML 配置
为了实现Spring Boot的安全性,我们使用 spring-boot-starter-security依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter并覆盖其方法
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.2</version>
</parent>
Spring Boot 支持 Logging、Log4j2、Lockback 做为日志框架,若是你使用 Starters 启动器,Spring Boot 将使用 Logback 做为默认日志框架
Spring Initiatlizr 让创建 Spring Boot 项目变的很容易,但是,也可以通过设置一个 maven 项目并添加正确的依赖项来开始一个项目
创建方式有两种:
我们在虚拟机上面部署应用程序需要几个步骤:
1、安装 Java
2、安装 Web 或者是应用程序的服务器(Tomat/Wbesphere/Weblogic 等等)
3、部署应用程序 jar 或者 war 包
如果把这些步骤简化了,应该怎么做呢?
让我们来思考如何使服务器成为应用程序的一部分?
我们只需要一个安装了 Java 的虚拟机,就可以直接在上面部署应用程序了
这就是嵌入式服务器的起源
前后端分离开发日益流行,大部分情况下,我们都是通过 Spring Boot 做前后端分离开发,前后端分离一定会有接口文档,不然会前后端会深深陷入到扯皮中。一个比较笨的方法就是使用 word 或者 md 来维护接口文档,但是效率太低,接口一变,所有人手上的文档都得变。在 Spring Boot 中,这个问题常见的解决方案是 Swagger ,使用 Swagger 我们可以快速生成一个接口文档网站,接口一旦发生变化,文档就会自动更新,所有开发工程师访问这一个在线网站就可以获取到最新的接口文档,非常方便
跨域可以在前端通过JSONP来解决,但是JSONP只可以发送GET请求,无法发送其他类型的请求,在RESTful风格的应用中,就显得非常鸡肋,因此推荐在后端通过(CORS,Cross-origin resource sharing)来解决跨域问题。这种解决方案并非Spring Boot特有的,在传统的SSM框架中,就可以通过CORS来解决跨域问题,只不过之前我们是在XML文件中配置CORS,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
项目中前后端分离部署,所以需要解决跨域的问题。
我们使用cookie存放用户登录的信息,在spring拦截器进行权限控制,当权限不符合时,直接返回给用户固定的json结果。
当用户登录以后,正常使用;当用户退出登录状态时或者token过期时,由于拦截器和跨域的顺序有问题,出现了跨域的现象。
我们知道一个http请求,先走filter,到达servlet后才进行拦截器的处理,如果我们把cors放在filter里,就可以优先于权限拦截器执行
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.setAllowCredentials(true); UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); } }
Maven的目录结构:
启动一个 Spring Boot项目,首先运行 Application 启动类的 main 方法,main 方法中调用了 SpringApplication.run 方法,run 方法中又调用了最核心的 refreshContext 方法,这里面又调用了我们最熟悉了 spring 容器启动模板方法refresh 方法,默认 Spring Boot 会启动 Tomcat,在 refresh 中的 onRefresh() 中执行;
onRefresh 调用了 createWebServer() 方法,通过 TomcatServletWebServerFactory 开始创建 Tomcat 实例;
最后在 refresh 方法中的 finishRefresh() 中调用 Tomcat 实例的 start 逻辑,并将应用上下文发布的 webServer 中,至此完成 Tomcat 的启动
Spring Boot 配置加载顺序优先级是:propertiese文件、YAML文件、系统环境变量、命令行参数。
bootstrap 比 applicaton 优先加载,配置在应用程序上下文的引导阶段生效, 而且 boostrap 里面的属性不能被覆盖;
application 用于 Spring Boot 项目的自动化配置
Spring boot actuator 是 spring 启动框架中的重要功能之一,Spring boot 监视器可以访问生产环境中正在运行的应用程序的当前状态。监视器模块公开了一组可直接作为 HTTP URL 访问的 REST 端点来检查状态
Spring 通过使用 @ControllerAdvice 注解处理异常,实现一个ControllerAdvice 类来处理控制器类抛出的所有异常
使得 Spring Boot 配置文件更加有层次感,结构也比较清晰,不容易混淆,目前也是人类可读的数据序列化语言
1、pom <!--分页插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>${pagehelper-version}</version> </dependency> 2、配置文件 pagehelper: helper-dialect: mysql reasonable: true support-methods-arguments: true params: count=countSql 3、service层 //用插件进行分页 PageHelper.startPage(pageNum, pageSize); return articleMapper.findByPage(); 4、controller层 通过service调用方法后获取数据。 // 需要把Page包装成PageInfo对象才能序列化。该插件也默认实现了一个PageInfo PageInfo<Article> pageInfo = new PageInfo<>(articles);
在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled 注解,另一个则是使用第三方框架 Quartz。
使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。
使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可
bootstrap.properties 和 application.properties
创建SpringBoot Web项目,引入下列pom坐标 <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.5.1</version> </dependency> <dependency> 在你的启动类上添加:@EnableAdminServer注解 =================================== 在你需要监控的服务中加入下列pom坐标 <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.5.1</version> </dependency> 在需监控服务中配置: spring.boot.admin.client.url=http://localhost:8080 (监控服务url) management.endpoints.web.exposure.include=*
Spring Boot 打成jar包可以直接通过 java -jar *.jar 启动项目,但是不能够像普通 jar 包一样被其他项目引用。
普通 jar 解压后就是包名,可以直接引用内部的类,而 Spring Boot 解压后 BOOT/classes 目录下才是真正的代码,因此不能被直接引用,如果需要被引用可以配置 pom,将 SpringBoot 打包成两个 jar 包,一个可执行,一个可引用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。