本节将深入介绍Spring Boot。
Spring应用
本SpringApplication
类提供了一个方便的方式来引导该从开始Spring应用程序main()
的方法。在许多情况下,您可以委派给静态SpringApplication.run
方法,如以下示例所示:
public static void main(String[] args) {
SpringApplication.run(MySpringConfiguration.class, args);
}
当您的应用程序启动时,您应该看到类似于以下输出的内容:
。____ _ __ _ _ _
/ \\ / ___'_ __ _ _(_)_ __ __ _ _ \ \ \ \
(()\ ___ |'_ |'_ | |'_ \ / _` | \ \ \ \
\\ / ___)| | _)| | | | | || (_ | |))))
'| ____ | .__ | _ | | _ | _ | | _ \ __,| / / / /
======== | _ | ============= | ___ / = / _ / _ / _ /
:: Spring Boot :: v2.2.0.RELEASE
2019-10-18 10:11:16.207 INFO 9252 --- [ restartedMain] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 'taskScheduler'
2019-10-18 10:11:16.579 INFO 9252 --- [ restartedMain] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: ServletContext resource [/index.html]
2019-10-18 10:11:16.726 WARN 9252 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : Unable to start LiveReload server
2019-10-18 10:11:16.772 INFO 9252 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2019-10-18 10:11:16.774 INFO 9252 --- [ restartedMain] com.reyco.kn.core.KNApplication : Started KNApplication in 2.404 seconds (JVM running for 2.929)
默认情况下,显示INFO
日志消息,包括一些相关的启动详细信息,例如启动应用程序的用户。如果您需要除以外的其他日志级别INFO
,则可以按照日志级别中所述进行设置。
1. 启动失败
如果您的应用程序无法启动,则注册FailureAnalyzers
后将有机会提供专门的错误消息和解决该问题的具体措施。例如,如果您在端口上启动Web应用程序8080
并且该端口已在使用中,则应该看到类似以下消息的内容:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-10-18 10:16:14.308 ERROR 8040 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in use or the connector may be misconfigured.
Action:
Verify the connector's configuration, identify and stop any process that's listening on port 8081, or configure this application to listen on another port.
2019-10-18 10:16:14.312 INFO 8040 --- [ restartedMain] o.s.s.c.ThreadPoolTaskScheduler : Shutting down ExecutorService 'taskScheduler'
2. 延迟初始化
SpringApplication
允许延迟初始化应用程序。启用延迟初始化后,将根据需要创建bean,而不是在应用程序启动期间创建bean。因此,启用延迟初始化可以减少应用程序启动所需的时间。在Web应用程序中,启用延迟初始化将导致许多与Web相关的Bean直到收到HTTP请求后才被初始化。
延迟初始化的缺点是,它可能会延迟发现应用程序问题的时间。如果错误配置的Bean延迟初始化,则启动期间将不再发生故障,并且只有在初始化Bean时问题才会变得明显。还必须注意确保JVM有足够的内存来容纳所有应用程序的bean,而不仅仅是启动期间初始化的bean。由于这些原因,默认情况下不会启用延迟初始化,因此建议在启用延迟初始化之前先对JVM的堆大小进行微调。
可以使用lazyInitialization
on方法SpringApplicationBuilder
或setLazyInitialization
on 方法以编程方式启用延迟初始化SpringApplication
。或者,可以使用spring.main.lazy-initialization
以下示例中所示的属性来启用它:
spring.main.lazy-initialization=true
3. 自定义横幅
可以通过将banner.txt
文件添加到类路径或将spring.banner.location
属性设置为此类文件的位置来更改启动时打印的横幅。如果文件的编码不是UTF-8,则可以设置spring.banner.charset
。除了一个文本文件,你还可以添加一个banner.gif
,banner.jpg
或banner.png
图像文件到类路径或设置spring.banner.image.location
属性。图像将转换为ASCII艺术作品并打印在任何文字横幅上方。
在banner.txt
文件内部,可以使用以下任意占位符:
${application.version}
您的应用程序的版本号,如中所述MANIFEST.MF。例如,Implementation-Version: 1.0打印为1.0。
${application.formatted-version}
您的应用程序的版本号,已声明MANIFEST.MF并进行了格式显示(用括号括起来,并带有前缀v)。例如(v1.0)。
${spring-boot.version}
您正在使用的Spring Boot版本。例如2.2.0.RELEASE。
${spring-boot.formatted-version}
您正在使用的Spring Boot版本,其格式用于显示(用括号括起来,并带有前缀v)。例如(v2.2.0.RELEASE)。
${Ansi.NAME}(或${AnsiColor.NAME},${AnsiBackground.NAME},${AnsiStyle.NAME})
NAMEANSI转义代码的名称在哪里。有关AnsiPropertySource详细信息,请参见。
${application.title}
您的应用程序的标题,如中所述MANIFEST.MF。例如Implementation-Title: MyApp打印为MyApp。
4. 自定义SpringApplication
如果SpringApplication
默认设置不符合您的喜好,则可以创建一个本地实例并对其进行自定义。例如,要关闭横幅,您可以编写:
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MySpringConfiguration.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
}
也可以SpringApplication
通过使用application.properties
文件来配置。有关详细信息,请参见spring boot相关文档。
5. 应用程序事件和监听器
有些事件实际上ApplicationContext
是在创建之前触发的,因此您无法将其注册为@Bean
。您可以使用SpringApplication.addListeners(…)
方法或SpringApplicationBuilder.listeners(…)
方法注册它们。
如果您希望这些侦听器自动注册,而不管创建应用程序的方式如何,都可以将META-INF/spring.factories
文件添加到项目中,并使用org.springframework.context.ApplicationListener
键引用您的侦听器,如以下示例所示:
org.springframework.context.ApplicationListener = com.example.project.MyListener
6.属性中的占位符
使用中的值时,它们会application.properties
通过现有的值进行过滤Environment
,因此您可以参考以前定义的值(例如,从“系统”属性中)。
app.name=MyApp
app.description=${app.name} is a Spring Boot application
7.使用YAML代替属性
YAML是JSON的超集,因此是一种用于指定层次结构配置数据的便捷格式。该SpringApplication
级自动支持YAML来替代,只要你有属性SnakeYAML在classpath库。
例如,考虑以下YAML文档:
environments:
dev:
url: https://dev.example.com
name: Developer Setup
prod:
url: https://another.example.com
name: My Cool App
前面的示例将转换为以下属性:
environments.dev.url=https://dev.example.com
environments.dev.name=Developer Setup
environments.prod.url=https://another.example.com
environments.prod.name=My Cool App
YAML列表表示为带有[index]
解引用器的属性键。例如,考虑以下YAML:
my:
servers:
- dev.example.com
- another.example.com
前面的示例将转换为以下属性:
my.servers[0]=dev.example.com
my.servers[1]=another.example.com
要使用Spring Boot的Binder
实用程序绑定属性(@ConfigurationProperties
确实如此),您需要在类型为java.util.List
(或Set
)的目标bean中具有一个属性,并且需要提供setter或使用可变值对其进行初始化。例如,以下示例绑定到前面显示的属性:
@ConfigurationProperties(prefix="my")
public class Config {
private List<String> servers = new ArrayList<String>();
public List<String> getServers() {
return this.servers;
}
}
8.日志
Spring Boot使用Commons Logging进行所有内部日志记录,但是使底层日志实现保持打开状态。为Java Util Logging,Log4J2和Logback提供了默认配置。在每种情况下,记录器都已预先配置为使用控制台输出,同时还提供可选文件输出。
默认情况下,如果使用“启动器”,则使用Logback进行日志记录。还包括适当的Logback路由,以确保使用Java Util Logging,Commons Logging,Log4J或SLF4J的从属库都可以正常工作。
1). 日志格式
Spring Boot的默认日志输出类似于以下示例:
2019-10-18 11:17:08.248 INFO 10008 --- [ restartedMain] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 'taskScheduler'
2019-10-18 11:17:08.580 INFO 10008 --- [ restartedMain] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: ServletContext resource [/index.html]
2019-10-18 11:17:08.700 WARN 10008 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : Unable to start LiveReload server
2019-10-18 11:17:08.737 INFO 10008 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2019-10-18 11:17:08.739 INFO 10008 --- [ restartedMain] com.reyco.kn.core.KNApplication : Started KNApplication in 2.145 seconds (JVM running for 2.534)
输出以下项目:
-
日期和时间:毫秒精度,易于排序。
-
日志级别:
ERROR
,WARN
,INFO
,DEBUG
,或TRACE
。 -
进程ID。
-
一个
---
分离器来区分实际日志消息的开始。 -
线程名称:用方括号括起来(对于控制台输出可能会被截断)。
-
记录器名称:这通常是源类名称(通常缩写)。
-
日志消息。
2). 输出文件
默认情况下,Spring Boot仅记录到控制台,不写日志文件。如果除了控制台输出外还想写日志文件,则需要设置一个logging.file.name
或logging.file.path
属性
logging.file.name:写入指定的日志文件。名称可以是确切位置,也可以是相对于当前目录的位置。
logging.file.path:写入spring.log指定的目录。名称可以是确切位置,也可以是相对于当前目录的位置。
日志文件达到10 MB时会旋转,并且与控制台输出一样,默认情况下会记录ERROR
-level,WARN
-level和INFO
-level消息。可以使用该logging.file.max-size
属性更改大小限制。除非logging.file.max-history
已设置属性,否则以前旋转的文件将无限期存档。日志档案的总大小可以使用设置上限logging.file.total-size-cap
。当日志归档的总大小超过该阈值时,将删除备份。要在应用程序启动时强制清除日志存档,请使用该logging.file.clean-history-on-start
属性。
3). 日志级别
所有支持的日志系统可以在弹簧设置的记录器级别Environment
(例如,application.properties
通过使用)logging.level.<logger-name>=<level>
,其中level
为TRACE,DEBUG,INFO,WARN,ERROR,FATAL或OFF之一。该root
记录器可以通过使用被配置logging.level.root
。
以下示例显示了中的潜在日志记录设置application.properties
:
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
4). 自定义日志配置
我们建议您将-spring
变体用于日志记录配置(例如,logback-spring.xml
而不是logback.xml
)。如果使用标准配置位置,Spring将无法完全控制日志初始化。
9. 国际化
Spring Boot支持本地化消息,因此您的应用程序可以迎合不同语言首选项的用户。默认情况下,Spring Boot messages
在类路径的根目录下查找资源束的存在。
10. 静态资源
默认情况下,Spring Boot从类路径中名为/static
(/public
或/resources
或/META-INF/resources
)的目录或根目录提供静态内容ServletContext
。它使用ResourceHttpRequestHandler
Spring MVC中的from,因此您可以通过添加自己WebMvcConfigurer
的addResourceHandlers
方法并覆盖该方法来修改该行为。
默认情况下,资源映射到/**
,但是您可以使用spring.mvc.static-path-pattern
属性对其进行调整。例如,将所有资源重新定位/resources/**
可以通过以下方式实现:
spring.mvc.static-path-pattern=/resources/**
您还可以通过使用spring.resources.static-locations
属性来自定义静态资源位置(用目录位置列表替换默认值)。根Servlet上下文路径,"/"
也会自动添加为一个位置。
要使用缓存清除,以下配置为所有静态资源配置了缓存清除解决方案:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
11. 欢迎页面
Spring Boot支持静态和模板欢迎页面。它首先index.html
在配置的静态内容位置中查找文件。如果未找到,则寻找index
模板。如果找到任何一个,它将自动用作应用程序的欢迎页面。
12. 自定义图标
与其他静态资源一样,Spring Boot favicon.ico
在配置的静态内容位置中查找a 。如果存在这样的文件,它将自动用作应用程序的收藏夹图标。
13. 自定义错误页面
如果要显示给定状态代码的自定义HTML错误页面,可以将文件添加到文件/error
夹。错误页面可以是静态HTML(即添加到任何静态资源文件夹下),也可以使用模板来构建。文件名应为确切的状态代码或系列掩码。
例如,要映射404
到静态HTML文件,您的文件夹结构如下:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
+- <other public assets>
要5xx
使用FreeMarker模板映射所有错误,您的文件夹结构如下:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- templates/
+- error/
| +- 5xx.ftlh
+- <other templates>
对于更复杂的映射,还可以添加实现该ErrorViewResolver
接口的bean ,如以下示例所示:
public class MyErrorViewResolver implements ErrorViewResolver {
@Override
public ModelAndView resolveErrorView(HttpServletRequest request,
HttpStatus status, Map<String, Object> model) {
// Use the request or status to optionally return a ModelAndView
return ...
}
}
您还可以使用常规的Spring MVC功能,例如@ExceptionHandler方法和@ControllerAdvice。在ErrorController
随后拿起任何未处理的异常。
在Spring MVC之外映射错误页面
对于不使用Spring MVC的应用程序,您可以使用ErrorPageRegistrar
接口直接注册ErrorPages
。此抽象直接与基础嵌入式servlet容器一起使用,即使您没有Spring MVC也可以使用DispatcherServlet
。
@Bean
public ErrorPageRegistrar errorPageRegistrar(){
return new MyErrorPageRegistrar();
}
// ...
private static class MyErrorPageRegistrar implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400"));
}
}
14. 跨域支持
跨域资源共享(CORS)是由大多数浏览器实施的W3C规范,可让您灵活地指定授权哪种类型的跨域请求,而不是使用诸如IFRAME或JSONP之类的安全性较低,功能较弱的方法。
从spring 4.2版本开始,Spring MVC 支持CORS。在Spring Boot应用程序中使用带有注释的控制器方法CORS配置@CrossOrigin不需要任何特定的配置。 可以通过使用自定义方法注册bean 来定义全局CORS配置,如以下示例所示:WebMvcConfigurer
addCorsMappings(CorsRegistry)
@Configuration(proxyBeanMethods = false)
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
15. 自定义嵌入式Servlet容器
可以使用Spring Environment
属性来配置常见的servlet容器设置。通常,您将在application.properties
文件中定义属性。
常用服务器设置包括:
-
网络设置:侦听传入HTTP请求的端口(
server.port
),要绑定到的接口地址server.address
,等等。 -
会话设置:会话是否为持久(
server.servlet.session.persistent
),会话超时(server.servlet.session.timeout
),会话数据位置(server.servlet.session.store-dir
)和会话Cookie配置(server.servlet.session.cookie.*
)。 -
错误管理:错误页面的位置(
server.error.path
)等。
程序定制
如果需要以编程方式配置嵌入式servlet容器,则可以注册一个实现该WebServerFactoryCustomizer
接口的Spring bean 。 WebServerFactoryCustomizer
提供对的访问ConfigurableServletWebServerFactory
,其中包括许多自定义设置方法。以下示例显示以编程方式设置端口:
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.stereotype.Component;
@Component
public class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
@Override
public void customize(ConfigurableServletWebServerFactory server) {
server.setPort(9000);
}
}
直接自定义ConfigurableServletWebServerFactory
如果前面的定制技术太有限,你可以注册TomcatServletWebServerFactory
,JettyServletWebServerFactory
或UndertowServletWebServerFactory
豆你自己。
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.setPort(8080);
factory.setSessionTimeout(10, TimeUnit.MINUTES);
factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html"));
return factory;
}
16. 配置数据库
DataSource配置由中的外部配置属性控制spring.datasource.*
。例如,您可以在中声明以下部分application.properties
:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
您至少应通过设置spring.datasource.url
属性来指定URL 。否则,Spring Boot会尝试自动配置嵌入式数据库。
您通常不需要指定driver-class-name
,因为Spring Boot可以从推导大多数数据库url
。
对于DataSource
要创建的池,我们需要能够验证有效的Driver
类是否可用,因此我们在进行任何操作之前都要进行检查。换句话说,如果您设置spring.datasource.driver-class-name=com.mysql.jdbc.Driver
,则该类必须是可加载的。
17. 使用NoSQL技术
Spring Data提供了其他项目来帮助您访问各种NoSQL技术,Spring Boot为Redis,MongoDB,Neo4j,Elasticsearch,Solr Cassandra,Couchbase和LDAP提供自动配置。您可以使用其他项目,但必须自己进行配置。请参阅相应的参考文档,位于spring.io/projects/spring-data。
18. Reids
1). Redis是一个缓存,消息代理和功能丰富的键值存储。Spring Boot为Lettuce和Jedis客户端库以及Spring Data Redis提供的最基本的抽象提供了基本的自动配置。
有一个spring-boot-starter-data-redis
“启动器”可以方便地收集依赖关系。默认情况下,它使用Lettuce。该启动程序可以处理传统应用程序和响应式应用程序。
2). 您可以像插入其他任何Spring Bean一样注入自动配置的RedisConnectionFactory
,StringRedisTemplate
或Vanilla RedisTemplate
实例。默认情况下,实例尝试连接到Redis服务器localhost:6379
。下面的清单显示了这种Bean的示例:
@Component
public class MyBean {
private StringRedisTemplate template;
@Autowired
public MyBean(StringRedisTemplate template) {
this.template = template;
}
// ...
}
19. Solr
Apache Solr是一个搜索引擎。Spring Boot为Solr 5客户端库提供了基本的自动配置,并由Spring Data Solr在其之上提供了抽象。有一个spring-boot-starter-data-solr
“启动器”可以方便地收集依赖关系。
您可以像插入SolrClient
其他任何Spring Bean一样注入自动配置的实例。默认情况下,该实例尝试连接到的服务器localhost:8983/solr
。以下示例显示如何注入Solr bean:
@Component
public class MyBean {
private SolrClient solr;
@Autowired
public MyBean(SolrClient solr) {
this.solr = solr;
}
// ...
}
如果添加自己@Bean
的type SolrClient
,它将替换默认值。
20. Elasticsearch
Elasticsearch是一个开源,分布式,RESTful搜索和分析引擎。Spring Boot为Elasticsearch提供了基本的自动配置。
21. 使用调用REST服务
1).RestTemplate
如果需要从应用程序调用远程REST服务,则可以使用Spring Framework的RestTemplate类。由于RestTemplate
实例通常需要在使用前进行自定义,因此Spring Boot不提供任何单个自动配置的RestTemplate
bean。但是,它会自动配置a RestTemplateBuilder
,可以RestTemplate
在需要时创建实例。自动配置RestTemplateBuilder
可确保明智HttpMessageConverters
地应用于RestTemplate
实例。
以下代码显示了一个典型示例:
@Service
public class MyService {
private final RestTemplate restTemplate;
public MyService(RestTemplateBuilder restTemplateBuilder) {
this.restTemplate = restTemplateBuilder.build();
}
public Details someRestCall(String name) {
return this.restTemplate.getForObject("/{name}/details", Details.class, name);
}
}
RestTemplateBuilder
包括许多有用的方法,可用于快速配置RestTemplate
。例如,要添加BASIC身份验证支持,可以使用builder.basicAuthentication("user", "password").build()
。
2).WebClient
WebClient
用于调用远程REST服务。与相比RestTemplate
,此客户具有更实用的感觉并且完全反应灵敏。您可以在Spring Framework文档WebClient
的专用部分中了解有关的更多信息。
Spring Boot WebClient.Builder
为您创建并预配置a ;强烈建议将其注入您的组件中并使用它来创建WebClient
实例。
以下代码显示了一个典型示例:
@Service
public class MyService {
private final WebClient webClient;
public MyService(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("https://example.org").build();
}
public Mono<Details> someRestCall(String name) {
return this.webClient.get().uri("/{name}/details", name)
.retrieve().bodyToMono(Details.class);
}
}
22. 发送邮件
Spring框架提供了一种使用JavaMailSender
接口发送电子邮件的简单抽象方法,而Spring Boot为其提供了自动配置以及启动程序模块。
如果spring.mail.host
和相关库(由定义spring-boot-starter-mail
)可用,JavaMailSender
则如果不存在则创建默认库。可以通过spring.mail
名称空间中的配置项进一步自定义发送方。请参阅MailProperties以获取更多详细信息。
特别是,某些默认超时值是无限的,您可能需要更改此值,以避免线程被无响应的邮件服务器阻塞,如以下示例所示:
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=3000
spring.mail.properties.mail.smtp.writetimeout=5000
也可以JavaMailSender
使用Session
JNDI中的现有配置进行配置
spring.mail.jndi-name=mail/Session
23. JTA的分布式事务
通过使用Atomikos或Bitronix嵌入式事务管理器,Spring Boot支持跨多个XA资源的分布式JTA事务。部署到合适的Java EE应用程序服务器时,还支持JTA事务。
当检测到JTA环境时,JtaTransactionManager
将使用Spring 来管理事务。自动配置的JMS,DataSource和JPA Bean已升级为支持XA事务。您可以使用标准Spring习惯用法(例如@Transactional
)来参与分布式事务。如果您在JTA环境中,但仍要使用本地事务,则可以将该spring.jta.enabled
属性设置false
为禁用JTA自动配置。
24. 任务执行和计划
在Executor
上下文中没有bean的情况下,Spring Boot会ThreadPoolTaskExecutor
使用合理的默认值自动配置a ,这些默认值可以自动与异步任务执行(@EnableAsync
)和Spring MVC异步请求处理相关联。
线程池使用8个核心线程,这些线程可以根据负载增长和收缩。可以使用spring.task.execution
名称空间对这些默认设置进行微调,如以下示例所示:
spring.task.execution.pool.max-size=16
spring.task.execution.pool.queue-capacity=100
spring.task.execution.pool.keep-alive=10s
这会将线程池更改为使用有界队列,以便在队列已满(100个任务)时,线程池最多增加到16个线程。池的收缩更加激进,因为当线程空闲10秒(而不是默认情况下的60秒)时,它们将被回收。
ThreadPoolTaskScheduler
如果需要与计划的任务执行(@EnableScheduling
)关联,也可以自动配置A。线程池默认使用一个线程,可以使用spring.task.scheduling
名称空间对这些设置进行微调。
既是TaskExecutorBuilder
豆和TaskSchedulerBuilder
绿豆可在上下文提供如果自定义遗嘱执行人或调度需要创建。
25. 创建自己的自动配置
- 1). 了解自动配置的Bean
在后台,自动配置是通过标准@Configuration
类实现的。其他@Conditional
注释用于约束何时应应用自动配置。通常,自动配置类使用@ConditionalOnClass
和@ConditionalOnMissingBean
注释。这样可以确保仅当找到相关的类并且尚未声明自己的类时,自动配置才适用@Configuration
。
- 2). 查找自动配置候选人
Spring Boot检查META-INF/spring.factories
发布的jar中是否存在文件。该文件应在EnableAutoConfiguration
键下列出您的配置类,如以下示例所示:
org.springframework.boot.autoconfigure.EnableAutoConfiguration = \
com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\
com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration
- 3).条件注释
您几乎总是希望@Conditional
在自动配置类中包含一个或多个注释。该@ConditionalOnMissingBean
注释是用来让开发者重写自动配置,如果他们不满意自己的缺省值一个常见的例子。
Spring Boot包含许多@Conditional
注释,您可以通过注释@Configuration
类或单个@Bean
方法在自己的代码中重用它们。