If you need to access the application arguments that were passed to SpringApplication.run(… ), you can inject a org.springframework.boot.ApplicationArguments bean. The ApplicationArguments interface provides access to both the raw String[] arguments as well as parsed option and non-option arguments, as shown in the following example:
@Autowired publicMyBean(ApplicationArguments args){ boolean debug = args.containsOption("debug"); List<String> files = args.getNonOptionArgs(); // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"] }
}
1 2 3
Spring Boot also registers a CommandLinePropertySource with the Spring Environment. This lets you also inject single application arguments by using the @Value annotation.
Spring Boot还向Spring环境注册了一个CommandLinePropertySource。这使您同样能够通过使用注解@Value注入单应用参数。
If you need to access the application arguments that were passed to SpringApplication.run(… ), you can inject a org.springframework.boot.ApplicationArguments bean. The ApplicationArguments interface provides access to both the raw String[] arguments as well as parsed option and non-option arguments, as shown in the following example:
@Autowired publicMyBean(ApplicationArguments args){ boolean debug = args.containsOption("debug"); List<String> files = args.getNonOptionArgs(); // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"] }
}
1 2 3
Spring Boot also registers a CommandLinePropertySource with the Spring Environment. This lets you also inject single application arguments by using the @Value annotation.
Spring Boot还向Spring环境注册了一个CommandLinePropertySource。这使您同样能够通过使用注解@Value注入单应用参数。
A SpringApplication attempts to create the right type of ApplicationContext on your behalf. The algorithm used to determine a WebEnvironmentType is fairly simple:
• If Spring MVC is present, an AnnotationConfigServletWebServerApplicationContext is used • If Spring MVC is not present and Spring WebFlux is present, an AnnotationConfigReactiveWebApplicationContext is used • Otherwise, AnnotationConfigApplicationContext is used
This means that if you are using Spring MVC and the new WebClient from Spring WebFlux in the same application, Spring MVC will be used by default. You can override that easily by calling setWebApplicationType(WebApplicationType).
Some events are actually triggered before the ApplicationContext is created, so you cannot register a listener on those as a @Bean. You can register them with the SpringApplication.addListeners(… ) method or the SpringApplicationBuilder.listeners(… ) method. If you want those listeners to be registered automatically, regardless of the way the application is created, you can add a META-INF/spring.factories file to your project and reference your listener(s) by using the org.springframework.context.ApplicationListener key, as shown in the following example: org.springframework.context.ApplicationListener=com.example.project.MyListener
Application events are sent in the following order, as your application runs:
随着您的应用程序运行,应用程序事件按以下顺序发送:
1 2 3 4 5 6
1. An ApplicationStartingEvent is sent at the start of a run but before any processing, except for the registration of listeners and initializers. 2. An ApplicationEnvironmentPreparedEvent is sent when the Environment to be used in the context is known but before the context is created. 3. An ApplicationPreparedEvent is sent just before the refresh is started but after bean definitions have been loaded. 4. An ApplicationStartedEvent is sent after the context has been refreshed but before any application and command-line runners have been called. 5. An ApplicationReadyEvent is sent after any application and command-line runners have been called. It indicates that the application is ready to service requests. 6. An ApplicationFailedEvent is sent if there is an exception on startup.
You often need not use application events, but it can be handy to know that they exist. Internally, Spring Boot uses events to handle a variety of tasks.
Application events are sent by using Spring Framework’s event publishing mechanism. Part of this mechanism ensures that an event published to the listeners in a child context is also published to the listeners in any ancestor contexts. As a result of this, if your application uses a hierarchy of SpringApplication instances, a listener may receive multiple instances of the same type of application event.
To allow your listener to distinguish between an event for its context and an event for a descendant context, it should request that its application context is injected and then compare the injected context with the context of the event. The context can be injected by implementing ApplicationContextAware or, if the listener is a bean, by using @Autowired.
If you need to build an ApplicationContext hierarchy (multiple contexts with a parent/child relationship) or if you prefer using a “fluent” builder API, you can use the SpringApplicationBuilder.
The SpringApplicationBuilder lets you chain together multiple method calls and includes parent and child methods that let you create a hierarchy, as shown in the following example:
new SpringApplicationBuilder() .sources(Parent.class) .child(Application.class) .bannerMode(Banner.Mode.OFF) .run(args);
1 2 3 4 5
There are some restrictions when creating an ApplicationContext hierarchy. For example, Web components must be contained within the child context, and the same Environment is used for both parent and child contexts. See the SpringApplicationBuilder Javadoc for full details.
If the SpringApplication defaults are not to your taste, you can instead create a local instance and customize it. For example, to turn off the banner, you could write:
publicstaticvoidmain(String[] args){ SpringApplication app = new SpringApplication(MySpringConfiguration.class); app.setBannerMode(Banner.Mode.OFF); app.run(args); }
1 2 3 4 5
The constructor arguments passed to SpringApplication are configuration sources for Spring beans. In most cases, these are references to @Configuration classes, but they could also be references to XML configuration or to packages that should be scanned.
It is also possible to configure the SpringApplication by using an application.properties file. See Chapter 24, Externalized Configuration for details. For a complete list of the configuration options, see the SpringApplication Javadoc.
The banner that is printed on start up can be changed by adding a banner.txt file to your classpath or by setting the spring.banner.location property to the location of such a file. If the file has an encoding other than UTF-8, you can set spring.banner.charset. In addition to a text file, you can also add a banner.gif, banner.jpg, or banner.png image file to your classpath or set the spring.banner.image.location property. Images are converted into an ASCII art representation and printed above any text banner.
The SpringApplication.setBanner(… ) method can be used if you want to generate a banner programmatically. Use the org.springframework.boot.Banner interface and implement your own printBanner() method.
You can also use the spring.main.banner-mode property to determine if the banner has to be printed on System.out (console), sent to the configured logger (log), or not produced at all (off).
The printed banner is registered as a singleton bean under the following name: springBootBanner.
打印banner被注册为一个名为“springBootBanner”的单例bean。
1 2 3 4 5
YAML maps off to false, so be sure to add quotes if you want to disable the banner in your application, as shown in the following example: spring: main: banner-mode: "off"
If your application fails to start, registered FailureAnalyzers get a chance to provide a dedicated error message and a concrete action to fix the problem. For instance, if you start a web application on port 8080 and that port is already in use, you should see something similar to the following message:
*************************** APPLICATION FAILED TO START ***************************
Description:
Embedded servlet container failed to start. Port 8080 was already in use.
Action:
Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
1 2
Spring Boot provides numerous FailureAnalyzer implementations, and you can add your own.
Spring Boot提供了众多的FailureAnalyzer实现,您可以加入您自身的实现。
1 2 3 4
If no failure analyzers are able to handle the exception, you can still display the full conditions report to better understand what went wrong. To do so, you need to enable the debug property or enable DEBUG logging for org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener.
This section dives into the details of Spring Boot. Here you can learn about the key features that you may want to use and customize. If you have not already done so, you might want to read the "Part II, “Getting Started”" and "Part III, “Using Spring Boot”" sections, so that you have a good grounding of the basics.
本章节将介绍SPirng Boot的细节,您可以学习到你想使用和定制的关键功能。如果您还没有准备好,您可以阅读第二部分“Getting Started”和第三部分“Using Spring Boot”章节,这样您可以具备良好的基础知识。
23. SpringApplication
1 2 3 4
The SpringApplication class provides a convenient way to bootstrap a Spring application that is started from a main() method. In many situations, you can delegate to the static SpringApplication.run method, as shown in the following example:
When your application starts, you should see something similar to the following output:
当您的应用启动后,您将看到如下的景象:
1 2 3 4 5 6 7 8 9 10 11 12
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: v2.1.0.BUILD-SNAPSHOT 2013-07-31 00:08:16.117 INFO 56603 --- [ main] o.s.b.s.app.SampleApplication : Starting SampleApplication v0.1.0 on mycomputer with PID 56603 (/apps/myapp.jar started by pwebb) 2013-07-31 00:08:16.166 INFO 56603 --- [ main] ationConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6e5a8246: startup date [Wed Jul 31 00:08:16 PDT 2013]; root of context hierarchy 2014-03-04 13:09:54.912 INFO 41370 --- [ main] .t.TomcatServletWebServerFactory : Server initialized with port: 8080 2014-03-04 13:09:56.501 INFO 41370 --- [ main] o.s.b.s.app.SampleApplication : Started SampleApplication in 2.992 seconds (JVM running for 3.658)
1 2 3 4
By default, INFO logging messages are shown, including some relevant startup details, such as the user that launched the application. If you need a log level other than INFO, you can set it, as described in Section 26.4, “Log Levels”,
21. Packaging Your Application for Production(生产环境打包)
1 2
Executable jars can be used for production deployment. As they are self-contained, they are also ideally suited for cloud-based deployment.
可运行的jars包能够被用于生成环境部署。由于它们是独立的,它们也非常适合基于云的部署。
1 2 3
For additional “production ready” features, such as health, auditing, and metric REST or JMX end-points, consider adding spring-boot-actuator. See Part V, “Spring Boot Actuator: Production-ready features” for details.
You should now understand how you can use Spring Boot and some best practices that you should follow. You can now go on to learn about specific Spring Boot featuresin depth, or you could skip ahead and read about the “production ready” aspects of Spring Boot.