springboot

本文详细介绍了SpringBoot的核心功能、自动配置原理、监控工具、配置文件管理,以及如何实现应用程序的安全性和跨域问题的解决。涵盖了SpringBoot的启动类、监控端点、注解使用和配置文件加载顺序等内容。

1.什么是springboot

  • spring boot其实就是一个启动spring项目的一个工具。并且包含了很多库。
    它可以用来简化spring应用的初始搭建以及开发过程 ,使用properties或yml文件来进行配置,并且有独立的main方法运行项目。
  • 嵌入的Tomcat 无需部署war文件
  • 简化maven配置 使用pom.xml 管理依赖
  • 自动配置spring,添加对应功能starter自动化配置
  • spring boot来简化spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用

2.Spring Boot 核心功能

1)独立运行的 Spring 项目
Spring Boot 可以以 jar 包的形式独立运行,运行一个 Spring Boot 项目只需通过 java–jar xx.jar 来运行。
2)内嵌 Servlet 容器
Spring Boot 可选择内嵌 Tomcat、Jetty 或者 Undertow,这样我们无须以 war 包形式部署项目。
3)提供 starter 简化 Maven 配置
Spring 提供了一系列的 starter pom 来简化 Maven 的依赖加载,例如,当使用了spring-boot-starter-web 时,会自动加入web的依赖包。
4)自动配置 Spring
Spring Boot 会根据在类路径中的 jar 包、类,为 jar 包里的类自动配置 Bean,这样会极大地减少我们要使用的配置。当然,Spring Boot 只是考虑了大多数的开发场景,并不是所有的场景,若在实际开发中我们需要自动配置 Bean,而 Spring Boot 没有提供支持,则可以自定义自动配置。
5)应用监控
Spring Boot 提供基于 http、ssh、telnet 对运行时的项目进行监控。
6)无代码生成和 xml 配置
Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。

3.Spring Boot 优缺点?

1)优点
快速构建项目。
对主流开发框架的无配置集成。
项目可独立运行,无须外部依赖Servlet容器。
提供运行时的应用监控。
极大地提高了开发、部署效率。
与云计算的天然集成。
2)缺点
版本迭代速度很快,一些模块改动很大。
由于不用自己做配置,报错时很难定位。
网上现成的解决方案比较少

4.Spring 和 SpringBoot 有什么不同?

Spring 框架提供多种特性使得 web 应用开发变得更简便,包括依赖注入、数据绑定、切面编程、数据存取等等。
以前在写spring项目的时候,要配置各种xml文件。配置太对维护起来也不方便,随着spring4的推出,提出约定大于配置,大家也渐渐的从写xml转为写各种注解,在spring4的项目里,甚至可以一行xml都不写。

虽然spring4已经可以做到无xml,maven配置要写几百行,所以就出现了spring boot。spring boot是spring的一个封装。所以,spring能做的事情,spring boot都可以做。除此之外

  • 它可以用来简化spring应用的初始搭建以及开发过程 ,使用properties或yml文件来进行配置,并且有独立的main方法运行项目。
  • 嵌入的Tomcat 无需部署war文件
  • 简化maven配置 使用pom.xml 管理依赖
  • 自动配置spring,添加对应功能starter自动化配置

5.如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?

使用DevTools,将文件更改自动部署到服务器并自动重启服务器。开发人员可以重新加载 Spring Boot 上的更改,而无需重新启动服务器。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

6.Spring Boot 中的监视器是什么?

Spring boot actuator 是 spring 启动框架中的重要功能之一。Spring boot 监视器可帮助访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为 HTTP URL 访问的REST 端点来检查状态。

7.常用注解

  • @SpringBootApplication
    这个注解很常见了,每次在启动SpringBoot项目的时候,都会见到它,它用在类上,标识该类为SpringBoot项目启动类。并且让SpringBoot自动给程序进行必要的配置,等同于@Configuration、@EnableAutoConfiguration、@ComponentScan这三个注解。

  • @Configuration
    相当于传统Spring的xml配置文件。
    如果第三方库需要用到xml文件,需要通过@Configuration类作为项目的配置主类,可以使用@ImportResource注解加载xml配置文件。

  • @EnableAutoConfiguration 自动配置。
    SpringBoot自动配置(auto-configuration),尝试根据添加的启动器(starter)自动配置SpringBoot应用。可以将@EnableAutoConfiguration注解或者@SpringBootApplication注解添加到一个@Configuration类上来选择自动配置。如果发现应用了不想要的特定自动配置类,可以使用@EnableAutoConfiguration注解的排除属性来禁用它们。

  • @ComponentScan
    如果某个类加上@ComponentScan注解,则该类会自动发现扫描组件。
    也就是说,如果扫描到有@Component、@Controller、@Service等这些注解的类,并注册为Bean,可以自动收集所有的Spring组件,包括@Configuration类。
    我们经常使用@ComponentScan注解搜索beans,并结合@Autowired注解导入。如果没有配置的话,SpringBoot会扫描启动类所在包下以及子包下的使用了@Component、@Controller、@Service、@Repository等注解的类。

  • @Controller
    @Controller注解用于定义控制器类,在SpringBoot中由控制器负责将用户发来的URL请求转发到对应的服务接口(Controller层)。
    一般这个注解用在类上,控制器方法需要加上@RequestMapping注解。

  • @ResponseBody
    如果控制器方法加上@ResponseBody注解,该方法的返回结果将直接写入HTTP response body中,一般在异步获取数据时使用,用于构建RESTful的api。
    在使用@RequestMapping后,返回值通常解析为跳转路径,加上@rsponsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@Responsebody后,会直接返回json数据。该注解一般会配合@RequestMapping一起使用。

  • @RestController
    @RestController注解是@Controller和@ResponseBody的合集。
    使用在类上,表示该类是控制器,并且类中所有控制器方法的返回值直接填入HTTP响应体中,是RESTful风格的控制器,控制器方法返回JSON数据。

  • @RequestMapping
    提供路由信息,负责URL到Controller中的具体方法的映射。

  • @Import
    用来导入其他配置类(加了@Configuration注解的类)。

  • @ImportResource
    用来加载xml配置文件。

  • @PathVariable
    获取URL上的参数(Restful风格接口)。

  • @Service
    一般用于修饰service层的组件

  • @Repository
    使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。

  • @Bean
    用@Bean标注方法等价于XML中配置的bean,意思是产生一个bean,并交给SpringBoot管理。

  • @Value
    注入SpringBoot中的配置文件——application.properties配置的属性的值。

  • @Inject
    等价于默认的@Autowired,只是没有required属性。

  • @Component
    泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

  • @AutoWired
    自动导入依赖的bean。byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不报错。

  • @Qualifier
    当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与- @Autowired配合使用。@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者。

  • @Resource(name=”name”,type=”type”)
    没有括号内内容的话,默认byName。与@Autowired干类似的事。

8.配置文件的加载顺序

如果在不同的目录中存在多个配置文件,它的读取顺序是:
1、config/application.properties(项目根目录中config目录下)
2、config/application.yml
3、application.properties(项目根目录下)
4、application.yml
5、resources/config/application.properties(项目resources目录中config目录下)
6、resources/config/application.yml
7、resources/application.properties(项目的resources目录下)
8、resources/application.yml
高优先级的配置内容会覆盖低优先级配置内容。

9. 自动配置原理

Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,通过@ConfigurationProperties注解把全局配置文件中的值绑定到实体类JavaBean上面,再通过@EnableConfigurationProperties注解把绑定的JavaBean 注入到Spring容器当中。

参考1
参考2

7.如何在 Spring Boot 中禁用 Actuator 端点安全性?

默认情况下,所有敏感的 HTTP 端点都是安全的,只有具有 ACTUATOR 角色的用户才能访问它们。安全性是使用标准的 HttpServletRequest.isUserInRole 方法实施的。 我们可以使用来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。

10.为什么我们需要 spring-boot-maven-plugin?

spring-boot-maven-plugin 提供了一些像 jar 一样打包或者运行应用程序的命令。

  • spring-boot:run 运行你的 SpringBooty 应用程序。
  • spring-boot:repackage 重新打包你的 jar 包或者是 war 包使其可执行
  • spring-boot:start 和 spring-boot:stop 管理 Spring Boot 应用程序的生命周期(也可以说是为了集成测试)。
  • spring-boot:build-info 生成执行器可以使用的构造信息。

12.如何在 Spring Boot 中添加通用的 JS 代码?

在源文件夹下,创建一个名为 static 的文件夹。然后,你可以把静态的内容放在这里面。

例如,myapp.js 的路径是 resources\static\js\myapp.js

你可以参考它在 jsp 中的使用方法:

35道SpringBoot面试题及答案,面试常被问到!

14.如何使用配置文件通过 Spring Boot 配置特定环境的配置?

比方说现在有两个配置文件application-dev.properties和application-prod.properties。在application.properties中使用 spring.profiles.active=prod即可加载application-prod.properties配置文件的配置。

15.什么是Swagger?你用Spring Boot实现了吗?

Swagger 广泛用于可视化 API,使用 Swagger UI 为前端开发人员提供在线沙箱。Swagger 是用于生成 RESTful Web 服务的可视化表示的工具,规范和完整框架实现。它使文档能够以与服务器相同的速度更新。当通过 Swagger 正确定义时,消费者可以使用最少量的实现逻辑来理解远程服务并与其进行交互。因此,Swagger消除了调用服务时的猜测。

16.如何实现Spring Boot应用程序的安全性?

为了实现Spring Boot的安全性,使用spring-boot-starter-security依赖项,并且必须添加安全配置。它只需要很少代码。配置类将必须扩展WebSecurityConfigurerAdapter并覆盖其方法。

17.比较一下Spring Security和Shiro各自的优缺点?

1.相同点
①认证功能
②授权功能
③加密功能
④会话管理
⑤缓存支持
⑥rememberMe功能

2.不同点
①Spring Security是一个重量级的安全管理框架;Shiro则是一个轻量级的安全管理框架
②Spring Security 基于Spring开发,项目若使用Spring作为基础,配合Spring Security 做权限更便捷,而Shiro需要和Spring 进行整合开发;
③Spring Security 功能比Shiro更加丰富些,例如安全维护方面;
④Spring Security 社区资源相对于Shiro更加丰富;
⑤Shiro 的配置和使用比较简单,Spring Security 上手复杂些;
⑥Shiro 依赖性低,不需要任何框架和容器,可以独立运行, Spring Security依赖Spring容器;
⑦Shiro 不仅仅可以使用在web中,它可以工作在任何应用环境中。在集群会话时Shiro最重要的一个好处或许就是它的会话是独立于容器的;

18.Spring Boot中如何解决跨域问题?

  • @CrossOrigin
    可以在类或者方添加该注解,如果在类上添加该注解,该类下的所有接口都可以通过跨域访问,如果在方法上添加注解,那么仅仅只限于加注解的方法可以访问。

  • 通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。
    addMapping:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。

    allowedOrigins:允许跨域请求资源的域名,可以固定单条或者多条内容,如:“http://www.baidu.com”,只有百度可以访问我们的跨域资源。

    allowCredentials: 响应头表示是否可以将对请求的响应暴露给页面。返回true则可以,其他值均不可以

    allowedMethods:允许输入参数的请求方法,如:POST、GET、PUT、OPTIONS、DELETE等。

    allowedHeaders:允许请求头信息,如:“X-YAUTH-TOKEN”

    maxAge:配置客户端缓存预检请求的响应的时间(以秒为单位)。默认设置为1800秒(30分钟)。

  • Nginx 反向代理解决跨域问题

19.Spring Boot的核心注解是哪些?他由哪几个注解组成的?

启动类上面的注解是@SpringBootApplication,他也是SpringBoot的核心注解,主要组合包含了以下3个注解:

@SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能;
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置的功能:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class});
@ComponentScan:Spring组件扫描。

20.保护SpringBoot应用有哪些方法?

  • 在生产中使用HTTPS
  • 使用Snyk检查你的依赖关系
  • 升级到最新版本
  • 启用CSRF保护
  • 使用内容安全策略防止XSS攻击

21.SpringBoot 2.X有哪些新特性?与1.X有什么区别?

  • 配置变更
  • JDK版本升级
  • 第三方类库升级
  • 响应式Spring编程支持
  • HTTP/2支持
  • 配置属性绑定
  • 更多改进与加强

22. Spring Boot 有哪几种读取配置的方式?

Spring Boot 可以通过 @PropertySource,@Value,@Environment, @ConfigurationPropertie注解来绑定变量

23.什么是 JavaConfig?

它提供了配置 Spring IOC 容器的纯Java 方法。避免使用 XML 配置。使用 JavaConfig 的优点在于:

面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean 方法等。

减少或消除 XML 配置。JavaConfig 提供了一种纯 Java 方法来配置与 XML 配置相似的 Spring 容器。

常用的Java config:

@Configuration:在类上打上写下此注解,表示这个类是配置类
@ComponentScan:在配置类上添加 @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan >。
@Bean:bean的注入:相当于以前的< bean id=“objectMapper” class=“org.codehaus.jackson.map.ObjectMapper” />
@EnableWebMvc:相当于xml的<mvc:annotation-driven >
@ImportResource: 相当于xml的 < import resource=“applicationContext-cache.xml”>

24.Spring Boot 是否可以使用 XML 配置 ?

Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。

25.什么是 YAML?

YAML 是一种数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。
YAML 配置和传统的 properties 配置相比优势:

  • 配置有序,在一些特殊的场景下,配置有序很关键

  • 简洁明了,他还支持数组,数组中的元素可以是基本数据类型也可以是对象

  • 相比 properties 缺点是不支持 @PropertySource 注解导入自定义的 YAML 配置。

26.如何读取配置文件

一:读取核心配置文件信息application.properties的内容
核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两种

  • 使用@Value方式,在@Value的${}中包含的是核心配置文件中的键名
//application.properties
test.msg=Hello World SpringBoot
//WebController.java
 @Value("${test.msg}")
	private String msg;
  • 2.使用Environment方式,依赖注入Evnironment来完成,在创建的成员变量private Environment env上加上@Autowired注解即可完成依赖注入,然后使用env.getProperty(“键名”)即可读取出对应的值。
 
@RestController
public class WebController {
	@Autowired
	private Environment env;
	
	@RequestMapping("/index2") 
	public String index2(){
		return "方式二:"+env.getProperty("test.msg");
	}
}

二:读取自定义配置文件信息

加载指定的配置文件(*.properties)到 Spring 的 Environment 中

  • @PropertySource 、 @Value、@Component
    组合使用,可以将自定义属性文件中的属性变量值注入到当前类的使用@Value注解的成员变量中。
  • @PropertySource 、 @ConfigurationProperties、@Component
    组合使用,可以将属性文件与一个Java类绑定,将属性文件中的变量值注入到该Java类的成员变量中。

@Component,可以直接在其他地方使用@Autowired来创建其实例对象

27. 多配置文件设置

在SpringBoot主配置文件编写的时候,文件名可以是application-{profile}.properties/yml。
默认使用的是application.properties配置文件的配置。
1 applicaiton.properties
2 application-dev.properties
3 application-test.properties
4 application-prod.properties

  • 主配置文件中指定激活的profile
    如果是properties格式的配置文件,那么可以在主配置文件中这样指定激活的profile: spring.profiles.active = dev
    如果是yml格式的配置文件,可以用“—”来划分文档块,每个文档块都被看作是一个profile,可以在主文档块中指定生效的profile:
 spring:
      profiles:
         active: dev # 指定激活哪个配置文件
  • 命令行激活

在生产环境中直接使用命令行启动项目,启动的同时可以指定激活的profile:java -jar --spring.profiles.active=dev my-spring-boot-app.1.0.0.jar

  • 设置虚拟机参数激活
    可以通过设置Java虚拟机参数的方式来激活指定profile:
    [vm options:] -Dspring.profiles.action=dev
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值