美文网首页
SpringBoot使用总结

SpringBoot使用总结

作者: 每天进步一丢儿丢儿 | 来源:发表于2020-03-11 13:45 被阅读0次

以下是SpringBoot的SpringApplication相关知识点总结

1、SpringBoot IOC容器下Bean的生命周期

IOC容器下Bean的生命周期函数回调的顺序是:构造函数->@PostConstruct->afterPropertiesSet->init->@PreDestroy->destroy


image.png

2、 启动日志信息的关闭和开启

通过设置spring.main.log-startup-info的值为true或者false来开启和关闭SpringBoot应用的启动日志信息

3、启动SpringBoot应用期间添加额外的启动日志方式

继承SpringApplication并重写logStartupInfo(boolean)方法实现

4、SpringBoot启动失败的错误分析器会提供启动失败的具体信息,帮助开发者定位问题。Spring Boot提供了数量众多的FailureAnalyzer实现。那么如何才能创建并配置自定义的FailureAnalyzer实现呢?

FailureAnalyzer是一种很好的方式,可以在启动时拦截异常并将其转换为可读的消息,并包装在FailureAnalysis中。AbstractFailureAnalyzer是一个方便的扩展,FailureAnalyzer它检查要处理的异常中是否存在指定的异常类型。您可以继承AbstractFailureAnalyzer并实现analyze(Throwable rootFailure, T cause)抽象方法,以便您的实现只有在异常出现时才有机会处理该异常。如果由于某种原因无法处理该异常,请返回null以使另一个实现有机会处理该异常。

FailureAnalyzer实施必须在中注册META-INF/spring.factories。以下示例注册ProjectConstraintViolationFailureAnalyzer:
org.springframework.boot.diagnostics.FailureAnalyzer=
com.example.ProjectConstraintViolationFailureAnalyzer

5、延迟初始化

SpringBoot允许应用延迟初始化,当延迟初始化是启用的情况下,beans只有在需要的时候才会被创建,而不是在启动的过程中被创建。因此,启用延迟初始化可以减少应用程序启动所花费的时间。在Web应用程序中,启用延迟初始化将导致许多与Web相关的Bean直到收到HTTP请求后才被初始化。

延迟初始化的缺点是当一些配置类的bean被延迟初始化时,一些错误将不会在启动的时候发现,这些问题将会延迟暴露在这些配置bean被使用到的时候。还必须注意确保JVM有足够的内存来容纳所有应用程序的bean,而不仅仅是启动期间初始化的那些bean。由于这些原因,默认情况下不会启用延迟初始化,因此建议在启用延迟初始化之前先对JVM的堆大小进行微调。

延迟初始化的启用与否可以通过使用SpringApplicationBuilder 的lazyInitialization 方法或者SpringApplication的setLazyInitialization 方法,或者通过spring.main.lazy-initialization=true配置

6、自定义SpringApplication

SpringBoot开发人员可以通过SpringApplicationBuilder提供的流式API自定义SpringApplication。

7、Springoot源码阅读推荐规则

  1. 查看AutoConfiguration配置类的源码,尤其要关注@Conditional注解的地方,找出什么功能在什么状况下被启用了。添加--debug到命令行或者-Ddebug到系统属性在控制台上获取您在应用中做出的所有自动配置决策的日志,在启用了执行器的运行应用程序中,查看条件端点(/ actuator / conditions或等效的JMX)以获取相同信息。

2.查找属于@ConfigurationProperties的类(例如ServerProperties),然后从中读取可用的外部配置选项。@ConfigurationProperties批注具有一个name属性,该属性充当外部属性的前缀。因此,ServerProperties具有prefix =“ server”,其配置属性是server.port,server.address等。在启用了执行器的运行应用程序中,查看configprops端点

3.寻找在Binder上使用bind方法的方式,以一种轻松的方式将配置值显式地从环境中拉出。它通常与前缀一起使用。

4.查找直接绑定到环境的@Value批注。

5.寻找@ConditionalOnExpression批注,以响应SpEL表达式来打开或关闭功能,通常使用从环境中解析的占位符来评估。

8、自定义Environmen或者ApplicationContext在启动容器之前

SpringApplication具有ApplicationListeners和ApplicationContextInitializers,用于将自定义项应用于上下文或环境。Spring Boot从META-INF / spring.factories内部加载了许多此类自定义项。注册其他自定义项的方法有多种:

1.在运行每个应用程序之前,通过在SpringApplication上调用addListeners和addInitializers方法以编程方式对其进行操作。

2.以声明方式,对于每个应用程序,通过设置context.initializer.classes或context.listener.classes属性。

3.声明性地,对于所有应用程序,通过添加META-INF / spring.factories并将打包的jar文件打包为应用程序全部用作库。

4.还可以使用EnvironmentPostProcessor在刷新应用程序上下文之前自定义环境。每个实现都应在META-INF / spring.factories中注册,如以下示例所示:

org.springframework.boot.env.EnvironmentPostProcessor=com.example.YourEnvironmentPostProcessor

具体操作是实现EnvironmentPostProcessor接口重写postProcessEnvironment方法,并在META-INF / spring.factories中注册,注册方式如上。

public class EnvironmentPostProcessorExample implements EnvironmentPostProcessor {

    private final YamlPropertySourceLoader loader = new YamlPropertySourceLoader();

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        Resource path = new ClassPathResource("com/example/myapp/config.yml");
        PropertySource<?> propertySource = loadYaml(path);
        environment.getPropertySources().addLast(propertySource);
    }

    private PropertySource<?> loadYaml(Resource path) {
        if (!path.exists()) {
            throw new IllegalArgumentException("Resource " + path + " does not exist");
        }
        try {
            return this.loader.load("custom-resource", path).get(0);
        }
        catch (IOException ex) {
            throw new IllegalStateException("Failed to load yaml configuration from " + path, ex);
        }
    }

}

Tips: 也可以参考DevToolsPropertyDefaultsPostProcessor的实现

9、启用HTTP 响应压缩

Tomcat,Jetty,Undertow都支持HTTP响应压缩,它可以通过在applicationproperties文件中添加server.compression.enabled=true开启。默认情况下,响应的长度必须至少为2048个字节才能执行压缩。您可以通过设置server.compression.min-response-size属性来配置此行为。

默认情况下,一下几种类型的mime-types响应才能被压缩。

text/html

text/xml

text/plain

text/css

text/javascript

application/javascript

application/json

application/xml

用户可以通过server.compression.mime-types来设置需要响应压缩的类型。

10、自定义配置Web服务器

@Component
public class MyTomcatWebServerCustomizer
        implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        // customize the factory here
    }
}

Tips: 自定义配置web服务器的实现原理(源码解析)

11、 Servlet环境下添加Servlet ,Filter,Listener到应用

在servlet堆栈应用程序中,即通过spring-boot-starter-web,有两种方法可以将Servlet,Filter,ServletContextListener和Servlet API支持的其他侦听器添加到您的应用程序中

  1. 代码注册通过ServletRegistrationBean、 FilterRegistrationBean 和ServletListenerRegistrationBean 获得控制。也可以通过实现 ServletContextInitializer 接口直接注册。
package org.springboot.sample;

import org.springboot.sample.servlet.MyServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.DispatcherServlet;

@SpringBootApplication
public class SpringBootSampleApplication {

    @Bean
    public ServletRegistrationBean servletRegistrationBean() {
        return new ServletRegistrationBean(new MyServlet(), "/xs/*");
    }

    public static void main(String[] args) {
        SpringApplication.run(SpringBootSampleApplication.class, args);
    }
}
  1. 在 SpringBootApplication 上使用@ServletComponentScan 注解后,Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码。

相关文章

网友评论

      本文标题:SpringBoot使用总结

      本文链接:https://www.haomeiwen.com/subject/pbavrhtx.html