目录
4. Spring Boot、Spring MVC 和 Spring 有什么区别?
6. SpringBoot starter 作用在什么地方?
7. SpringBoot的 Actuator 是做什么的?
8. Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
9. Spring Boot 的配置文件有哪几种格式?它们有什么区别?
关注我们,更多技术干货:
Java微服务实战296集大型视频-谷粒商城【附代码和课件】
Java开发微服务畅购商城实战【全357集大项目】-附代码和课件
2021年JAVA 精心整理的常见面试题-附详细答案 | https://mikejun.blog.csdn.net/article/details/114488339 |
2021年- 精心整理的 SpringMVC 常见面试题-【附详细答案】 | https://mikejun.blog.csdn.net/article/details/114992529 |
2021年JAVA 面试题之--数据结构篇【附详细答案】 | https://mikejun.blog.csdn.net/article/details/114647742 |
精心整理的计算机各类别的电子书籍【超全】 | https://mikejun.blog.csdn.net/article/details/115442555 |
三天刷完《剑指OFFER编程题》--Java版本实现(第一天) | https://mikejun.blog.csdn.net/article/details/106996017 |
三天刷完《剑指OFFER编程题》--Java版本实现(第二天) | https://mikejun.blog.csdn.net/article/details/108098502 |
三天刷完《剑指OFFER编程题》--Java版本实现(第三天) | https://mikejun.blog.csdn.net/article/details/108253489 |
1. Spring Boot 自动配置原理是什么?
- 在springboot的启动类中使用了注解@SpringBootApplication注解,里面的@EnableAutoConfiguration注解是自动配置的核心,注解内部使用@Import(AutoConfigurationImportSelector.class)(class文件用来哪些加载配置类)注解来加载配置类,并不是所有的bean都会被加载,在配置类或bean中使用@Condition来加载满足条件的bean。
- @EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类,筛选有效的自动配置类。每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能
2. SpringBoot配置-profile
- profile是用来完成不同环境下,配置动态切换功能的
- profile配置方式
多profile文件方式:提供多个配置文件,每个代表一种环境。
application-dev.properties/yml 开发环境
application-test.properties/yml 测试环境
application-pro.properties/yml 生产环境 - profile激活方式
配置文件:spring.profiles.active=dev
3. SpringBoot中有哪些常用注解
在使用SpringBoot的过程中,几乎没有了XML配置,采用注解+JavaConfig方式开发,这样做的好处是:
- 采用纯java代码,不在需要配置繁杂的xml文件
- 在配置中也可享受面向对象带来的好处
- 类型安全对重构可以提供良好的支持
- 减少复杂配置文件的同时亦能享受到springIoC容器提供的功能
@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后,返回值通常解析为跳转路径,加上@esponsebody后返回结果不会被解析为跳转路径,而是直接写入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干类似的事。
@JsonBackReference
解决嵌套外链问题。
@RepositoryRestResourcepublic
配合spring-boot-starter-data-rest使用。
全局异常注解
@ControllerAdvice
包含@Component,可以被扫描到。统一处理异常。
@ExceptionHandler(Exception.class)
用在方法上面表示遇到这个异常就执行以下方法。
JPA注解
JPA是ORM思想的规范接口,存在两个核心:
- 建立表与实体类的映射。
- 建立表字段与实体类属性映射,操作实体类就是操作表。
Hibernate框架作为JPA的实现者之一。
@Entity&@Table(name="表名")
@Entity注解表明这是一个实体类。
@Table(name="表名")映射一张表,但是如果表名和实体类名相同的话,@Table可以省略。
@MappedSuperClass
用在确定是父类的entity上。父类的属性子类可以继承。
@NoRepositoryBean
一般用作父类的repository,有这个注解,SpringBoot不会去实例化该repository。
@Column
建立表字段与实体类属性映射,如果字段名与列名相同,则可以省略。
@Id
表示该属性为主键。
@Transient
- 表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。
- 如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic。
@Basic
@Basic(fetch=FetchType.LAZY):标记可以指定实体属性的加载方式
@GeneratedValue
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = “repair_seq”)表示主键生成策略是sequence(可以为Auto、IDENTITY、native等,Auto表示可在多个数据库间切换),指定sequence的名字是repair_seq。
@SequenceGeneretor
@SequenceGeneretor(name = “repair_seq”, sequenceName = “seq_repair”, allocationSize = 1):name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致。
@JsonIgnore
作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。
@OneToOne、@OneToMany、@ManyToOne
对应多表之间的一对一,一对多,多对一关系。
4. Spring Boot、Spring MVC 和 Spring 有什么区别?
- Spring
Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。
当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。 - Spring MVC
Spring MVC 提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。 - SpringBoot
Spring 和 SpringMVC 的问题在于需要配置大量的参数。
Spring Boot 通过一个自动配置和启动的项来目解决这个问题。为了更快的构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征。
5. springboot的核心功能与使用优点?
- 核心功能:
springboot项目为独立运行的spring项目,java -jar xx.jar即可运行.
内嵌servlet容器(可以选择内嵌: tomcat ,jetty等服务器.).
提供了starter的pom 配置 简化了 maven的配置.
自动配置spring容器中的bean.当不满足实际开发场景,可自定义bean的自动化配置.
准生产的应用监控(基于: ssh , http , telnet 对服务器运行的项目进行监控.).
springboot无需做出xml配置,也不是通过代码生成来实现(通过条件注解.). - 使用优点:
快速搭建项目,
与主流框架集成无需配置集成.
内嵌服务容器.
具有应用监控.
开发部署方便,后期与云计算平台集成方便.
6. SpringBoot starter 作用在什么地方?
- 依赖管理是所有项目中至关重要的一部分。当一个项目变得相当复杂,管理依赖会成为一个噩梦,因为当中涉及太多 artifacts 了。
- 这时候 SpringBoot starter 就派上用处了。每一个 stater 都在扮演着提供我们所需的 Spring 特性的一站式商店角色。其他所需的依赖以一致的方式注入并且被管理。
- 所有的 starter 都归于 org.springframework.boot 组中,并且它们都以由 spring-boot-starter- 开头取名。这种命名方式使得我们更容易找到 starter 依赖,特别是当我们使用那些支持通过名字查找依赖的 IDE 当中。
- 比如说其中最常用的是:
spring-boot-starter:核心 starter,包括自动化配置支持,日志以及 YAML
spring-boot-starter-aop:Spring AOP 和 AspectJ 相关的切面编程 starter
spring-boot-starter-data-jpa:使用 Hibernate Spring Data JPA 的 starter
spring-boot-starter-jdbc:使用 HikariCP 连接池 JDBC 的 starter
spring-boot-starter-security:使用 Spring Security 的 starter
spring-boot-starter-test:SpringBoot 测试相关的 starter
spring-boot-starter-web:构建 restful、springMVC 的 web应用程序的 starter
7. SpringBoot的 Actuator 是做什么的?
- 本质上,Actuator 通过启用 production-ready 功能使得 SpringBoot 应用程序变得更有生命力。这些功能允许我们对生产环境中的应用程序进行监视和管理。
- 集成 SpringBoot Actuator 到项目中非常简单。我们需要做的只是将 spring-boot-starter-actuator starter 引入到 POM.xml 文件当中。
- SpringBoot Actuaor 可以使用 HTTP 或者 JMX endpoints来浏览操作信息。大多数应用程序都是用 HTTP,作为 endpoint 的标识以及使用 /actuator 前缀作为 URL路径。
- 这里有一些常用的内置 endpoints Actuator:
auditevents:查看 audit 事件信息
env:查看 环境变量
health:查看应用程序健康信息
httptrace:展示 HTTP 路径信息
info:展示 arbitrary 应用信息
metrics:展示 metrics 信息
loggers:显示并修改应用程序中日志器的配置
mappings:展示所有 @RequestMapping 路径信息
scheduledtasks:展示应用程序中的定时任务信息
threaddump:执行 Thread Dump
8. Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
- Spring Boot 中有以下两种配置文件:
- bootstrap (.yml 或者 .properties)
- application (.yml 或者 .properties)
- bootstrap/ application 的区别:
Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap,,另外一种是 application,,bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。因此,对比 application 配置文件,bootstrap 配置文件具有以下几个特性:1. boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载. 2. boostrap 里面的属性不能被覆盖
- bootstrap/ application 的应用场景:
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景:1. 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;2. 一些固定的不能被覆盖的属性,一些加密/解密的场景。
9. Spring Boot 的配置文件有哪几种格式?它们有什么区别?
- .properties 和 .yml,它们的区别主要是书写格式不同。
- 1).properties
app.user.name = javastack
- 2).yml
- 1).properties
app:
user:
name: javastack
另外,.yml 格式不支持 @PropertySource 注解导入配置。
10. 开启 Spring Boot 特性有哪几种方式?
- 有以下两种方式:
- 继承spring-boot-starter-parent项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
- 导入spring-boot-dependencies项目依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependencies>
</dependencyManagement>
- Spring Boot依赖注意点:
- 属性覆盖只对继承有效
Spring Boot依赖包里面的组件的版本都是和当前Spring Boot绑定的,如果要修改里面组件的版本,只需要添加如下属性覆盖即可,但这种方式只对继承有效,导入的方式无效。
<properties>
<slf4j.version>1.7.25<slf4j.version>
</properties>
如果导入的方式要实现版本的升级,达到上面的效果,这样也可以做到,把要升级的组件依赖放到Spring Boot之前。
需要注意,要修改Spring Boot的依赖组件版本可能会造成不兼容的问题。
11. Spring Boot 自动配置原理是什么?
Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射。
org.springframework.core.io.support.SpringFactoriesLoader.loadFactoryNames(Class<?>, ClassLoader)
public static List<String> loadFactoryNames(Class<?> factoryClass,ClassLoader classLoader){
String factoryClassName = factoryClass.getName();
try{
Enumeration<URL> urls = (classLoader!=null?classLoader.getResources(FACTORIES_RESOURCE_LOCATION):lassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
List<String> result = new ArrayList<String>();
while(urls.hasMoreElements()){
URL url = urls.nextElement();
Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
String factoryClassNames = properties.getProperty(factoryClassName);
result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
}
return result;
}catch(IOException ex){
throw new IllegalArgumentException("Unable to load ["+factoryClass.getName()+"] factories from location ["+FACTORIES_RESOURCE_LOCATION+"]",ex);
}
}
这个方法会加载类路径及所有jar包下META-INF/spring.factories配置中映射的自动配置的类。
/**
* The location to look for factories.
* <p>Can be present in multiple JAR files.
*/
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
查看Spring Boot自带的自动配置的包: spring-boot-autoconfigure-1.5.6.RELEASE.jar,打开其中的META-INF/spring.factories文件会找到自动配置的映射。
- 再来看看数据源自动配置的实现注解
@Configuration,@ConditionalOnClass就是自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。
12. Spring Boot 的目录结构是怎样的?
Spring Boot 与传统项目最大的区别是,传统项目都是打成 WAR 包部署到服务器上面,需要额外的 Servlet 容器, 而 Spring Boot 则可以直接打成 jar包,并内置集成了 Servlet 容器,通过命令 java -jar xx.jar 则可以直接运行,不需要独立的 Servlet 容器。
打成可执行 jar 包后,我们来看下其中的 META-INF/MANIFEST.MF 文件:
其中有一个 Start-Class 便是这个 jar 包的入口类,这个入口类推荐是放在一个项目的顶层包中,其他所有的类都放在其子包下面,目录结构如以下所示:
这个目录结构是主流及推荐的做法,而在主入口类上加上 @SpringBootApplication
注解来开启 Spring Boot 的各项能力,如自动配置、组件扫描等。
如果你不想这么做,你也可以充分利用 @EnableAutoConfiguration
和 @ComponentScan
注解自定义你的行为,不过这不是推荐的做法。
13. springboot配置监听器、过滤器和拦截器
监听器继承HttpSessionListener
过滤器继承Filter
拦截器继承HandlerInterceptor
配置类注解@Configuration实现WebMvcConfigurer
14. 拦截器过滤器的区别
拦截器可以访问action上下文、值栈里的对象而过滤器不能
拦截器只能对action请求起作用,拦截器可以多次被调用,过滤器可以对几乎所有的请求起作用
Filter在Servlet前后作用,Interceptor在方法的前后作用,异常抛出前后,具有更大的弹性。所以优先使用拦截器。
15. Spring Boot 中如何解决跨域问题 ?
跨域可以在前端通过 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);
}
}
--------------------其他增加-------------
8. 怎么简单实现一个springboot应用
1)新建maven项目
2)让项目以spring-boot-starter-parent为父模块
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
3)根据场景选择一些starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
4)进行application.yml/application.properties配置
server:
port: 8080
5)写入口类
@SpringBootApplication
public class PetHomeApplication {
public static void main(String[] args) {
SpringApplication.run(PetHomeApplication.class,args);
} }
6)测试
启动main,通过localhost:8080启动不报错
9. springboot怎么实现多环境配置
1)什么是多环境配置
就是一套代码,有可能要在多个环境使用。就要对多种环境进行配置。
2)怎么进行多环境配置
①在一个文件中配置多个环境
②多个文件(application-环境名.yml/properties)
3)怎么指定具体的环境
①默认启动
②指定启动环境
10. springboot项目怎么部署
Springboot默认已经集成了内置的Tomcat,对它进行打包jar后,里面就有tomcat。直接以jar包方式运行就ok。
1)打包
pom.xml加入打包插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
打包:
mvn clean package
2)部署
windows: java -jar xxx.jar
Linux:后台运行nohup java -jar xxx.jar
11. 说一下springboot自动配置原理
当我们引入了starter,就会使用springboot自动配置原理,对这种场景进行配置。
①Springboot应用入口类通过@SpringBootApplication注解简介使用@EnableAutoConfiguration(是父注解)
②使用@EnableAutoConfiguration后,会扫描所有jar中的spring.factories文件,加载所有的配置类(加了 @Configuration的类)
③配置类(加了@Configuration的类)使用XxxProperties以@Bean的方式完成对应场景的配置
④XxxPropereis里面的配置信息有默认值,但是我们可以在application.properties/application.yml中获取
19. Spring Boot 最核心的 25 个注解
1、@SpringBootApplication
这是 Spring Boot 最最最核心的注解,用在 Spring Boot 主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。
其实这个注解就是 @SpringBootConfiguration
、@EnableAutoConfiguration
、@ComponentScan
这三个注解的组合,也可以用这三个注解来代替 @SpringBootApplication
注解。
2、@EnableAutoConfiguration
允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。
如:当前类路径下有 Mybatis 这个 JAR 包,MybatisAutoConfiguration
注解就能根据相关参数来配置 Mybatis 的各个 Spring Bean。
3、@Configuration
这是 Spring 3.0 添加的一个注解,用来代替 applicationContext.xml 配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在类来进行注册。
4、@SpringBootConfiguration
这个注解就是 @Configuration 注解的变体,只是用来修饰是 Spring Boot 配置而已,或者可利于 Spring Boot 后续的扩展。
5、@ComponentScan
这是 Spring 3.1 添加的一个注解,用来代替配置文件中的 component-scan 配置,开启组件扫描,即自动扫描包路径下的 @Component 注解进行注册 bean 实例到 context 中。
6、@Conditional
这是 Spring 4.0 添加的新注解,用来标识一个 Spring Bean 或者 Configuration 配置文件,当满足指定的条件才开启配置。
7、@ConditionalOnBean
组合 @Conditional
注解,当容器中有指定的 Bean 才开启配置。
8、@ConditionalOnMissingBean
组合 @Conditional
注解,和 @ConditionalOnBean
注解相反,当容器中没有指定的 Bean 才开启配置。
9、@ConditionalOnClass
组合 @Conditional
注解,当容器中有指定的 Class 才开启配置。
10、@ConditionalOnMissingClass
组合 @Conditional
注解,和 @ConditionalOnMissingClass
注解相反,当容器中没有指定的 Class 才开启配置。
11、@ConditionalOnWebApplication
组合 @Conditional
注解,当前项目类型是 WEB 项目才开启配置。
当前项目有以下 3 种类型。
enum Type {
/**
* Any web application will match.
*/
ANY,
/**
* Only servlet-based web application will match.
*/
SERVLET,
/**
* Only reactive-based web application will match.
*/
REACTIVE
}
12、@ConditionalOnNotWebApplication
组合 @Conditional
注解,和 @ConditionalOnWebApplication
注解相反,当前项目类型不是 WEB 项目才开启配置。
13、@ConditionalOnProperty
组合 @Conditional
注解,当指定的属性有指定的值时才开启配置。
14、@ConditionalOnExpression
组合 @Conditional
注解,当 SpEL 表达式为 true 时才开启配置。
15、@ConditionalOnJava
组合 @Conditional
注解,当运行的 Java JVM 在指定的版本范围时才开启配置。
16、@ConditionalOnResource
组合 @Conditional
注解,当类路径下有指定的资源才开启配置。
17、@ConditionalOnJndi
组合 @Conditional
注解,当指定的 JNDI 存在时才开启配置。
18、@ConditionalOnCloudPlatform
组合 @Conditional
注解,当指定的云平台激活时才开启配置。
19、@ConditionalOnSingleCandidate
组合 @Conditional
注解,当指定的 class 在容器中只有一个 Bean,或者同时有多个但为首选时才开启配置。
20、@ConfigurationProperties
用来加载额外的配置(如 .properties 文件),可用在 @Configuration
注解类,或者 @Bean
注解方法上面。
21、@EnableConfigurationProperties
一般要配合 @ConfigurationProperties
注解使用,用来开启对 @ConfigurationProperties
注解配置 Bean 的支持。
22、@AutoConfigureAfter
用在自动配置类上面,表示该自动配置类需要在另外指定的自动配置类配置完之后。
如 Mybatis 的自动配置类,需要在数据源自动配置类之后。
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
23、@AutoConfigureBefore
这个和 @AutoConfigureAfter
注解使用相反,表示该自动配置类需要在另外指定的自动配置类配置之前。
24、@Import
这是 Spring 3.0 添加的新注解,用来导入一个或者多个 @Configuration
注解修饰的类,这在 Spring Boot 里面应用很多。
25、@ImportResource
这是 Spring 3.0 添加的新注解,用来导入一个或者多个 Spring 配置文件,这对 Spring Boot 兼容老项目非常有用,因为有些配置无法通过 Java Config 的形式来配置就只能用这个注解来导入。
20. Spring boot 中的starter是什么?
依赖管理对于项目至关重要。当项目足够复杂时,管理依赖项可能会变成一场噩梦,因为涉及的组件太多了。
这就是Spring Boot 的 starter
就派上用场了。每个starter都可以为我们提供所需要的Spring技术的一站式服务。并且以一致的方式传递和管理其他所需的依赖关系。
所有官方starter都在 org.springframework.boot
组下,其名称以 spring-boot-starter-
开头 。非官方的starter的名称在前,如 mybatis-spring-boot-starter
。这种命名模式使得查找启动器变得很容易,尤其是在使用支持按名称搜索依赖关系的IDE时。但是这个不是绝对的,有些开发者可能不遵从这种契约。
目前大概有超过50
种官方starter
。最常用的是:
spring-boot-starter
: 核心启动器,包括自动配置支持,日志记录和YAMLspring-boot-starter-aop
: 使用Spring AOP
和AspectJ
进行面向方面编程的初学者spring-boot-starter-data-jpa
: 使用Spring Data JPA
和Hibernate
的启动器spring-boot-starter-jdbc
: 用于将JDBC
与HikariCP
连接池一起使用的启动器spring-boot-starter-security
: 使用Spring Security
的启动器spring-boot-starter-test
: 用于测试Spring Boot
应用程序的启动器spring-boot-starter-web
: 使用Spring MVC
构建Web的启动器,包括RESTful
应用程序
21. 如何禁用特定的自动配置?
22. 如何注册自定义自动配置?
23. 如何根据不同的条件来加载bean?
使用@Conditional
系列注解。 例如@ConditionalOnMissingBean
。此注释的最显着属性是:
value
:要检查的bean类型name
:要检查的bean的名称
放置在使用@Bean
装饰的方法上时,目标类型默认为方法的返回类型:
表示的意思是如果不存在CustomService
类型的bean则初始化并注入该bean。
24. 如何将Spring Boot Web应用程序部署为JAR和WAR文件?
传统上,我们将Web应用程序打包为WAR文件,然后将其部署到外部服务器中。这样做可以让我们在同一台服务器上安排多个应用程序。在CPU和内存稀缺的时候,这是节省资源的好方法。
但事情发生了变化。现在计算机硬件相当便宜,并且注意力转向服务器配置。在部署期间配置服务器的一个小错误可能会导致灾难性后果。
Spring通过提供一个插件即spring-boot-maven-plugin
来解决这个问题,将Web应用程序打包为可执行的JAR
。要包含此插件,只需向pom.xml
添加一个插件元素:
有了这个插件,我们将在执行包阶段后得到一个fat JAR
。此JAR包含所有必需的依赖项,包括嵌入式服务器。因此,我们不再需要担心配置外部服务器。
然后我们可以像运行普通的可执行JAR
一样运行应用程序。
请注意,必须将pom.xml
文件中的packaging
元素设置为 jar
才能构建JAR
文件:
25. Spring boot支持哪些外部配置?
Spring Boot支持外部配置,允许我们在各种环境中运行相同的应用程序。我们可以使用properties
文件,YAML文件
,环境变量,系统属性和命令行选项参数来指定配置属性。
然后,我们可以访问使用这些属性@Value注释,经由绑定对象 的@ConfigurationProperties
注释或Environment
环境抽象类注入。
以下是最常见的外部配置来源:
- 命令行属性:命令行选项参数是以双连字符开头的程序参数,例如
-server.port = 8080
。Spring Boot将所有参数转换为属性,并将它们添加到环境属性集中。- 应用程序属性:应用程序属性是从
application.properties
文件或其YAML
对应文件加载的属性。默认情况下,Spring Boot会在当前目录,类路径根或其config
子目录中搜索此文件。
特定于配置文件的属性:特定于配置文件的属性从application- {profile} .properties
文件或其YAML
对应文件加载。{profile}
占位符是指活性轮廓。这些文件与非特定属性文件位于相同位置,并且优先于非特定属性文件。
26. Spring Boot Actuator有什么用?
Spring Boot Actuator
可以帮助你监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等。所有的这些特性可以通过JMX
或者HTTP endpoints
来获得。
Actuator同时还可以与外部应用监控系统整合,比如 Prometheus
, Graphite
, DataDog
, Influx
, Wavefront
, New Relic
等。这些系统提供了非常好的仪表盘、图标、分析和告警等功能,使得你可以通过统一的接口轻松的监控和管理你的应用。Actuator
使用Micrometer
来整合上面提到的外部应用监控系统。这使得只要通过非常小的配置就可以集成任何应用监控系统。
将Spring Boot Actuator集成到一个项目中非常简单。我们需要做的就是在pom.xml
文件中包含 spring-boot-starter-actuator
启动器:
Spring Boot Actuator
可以使用HTTP
或JMX
端点公开操作信息。但是,大多数应用程序都使用HTTP
,其中端点的标识和/执行器前缀形成URL
路径。
以下是Actuator提供的一些最常见的内置端点:
auditevents
: 公开审计事件信息env
: 公开环境属性health
: 显示应用程序运行状况信息httptrace
: 显示HTTP跟踪信息info
: 显示任意应用程序信息metrics
: 显示指标信息mappings
: 显示所有@RequestMapping路径的列表scheduledtasks
: 显示应用程序中的计划任务threaddump
: 执行线程转储- `beans :所有加载的spring bean