初学spring boot (定制tomcat容器)--002

一:spring boot定制tomcat容器

1. 首先spring boot 通过注解@EnableAutoConfiguration初始化各种自动装配和bean,其中默认注册 TomcatEmbeddedServletContainerFactory 到 DefaultListableBeanFactory。

2. 转化为java语言:定制一个bean. 第一反应就是借鉴spring aop思想,继承BeanPostProcessor定制bean。

3. spring boot 默认实现是通过EmbeddedServletContainerCustomizerBeanPostProcessor定制tomcat容器,可通过EmbeddedServletContainerCustomizer接口扩展

4.第二种方式是自定义一个bean: EmbeddedServletContainerFactory。

实现Demo:

@Component
public class TomcatContainerCustomizer implements EmbeddedServletContainerCustomizer {

  private static final Logger logger = LoggerFactory.getLogger(TomcatContainerCustomizer.class);
  private static final String TOMCAT_ACCEPTOR_COUNT = "server.tomcat.accept-count";
  @Autowired
  private Environment environment;

  @Override
  public void customize(ConfigurableEmbeddedServletContainer container) {
    if (!(container instanceof TomcatEmbeddedServletContainerFactory)) {
      return;
    }
    if (!environment.containsProperty(TOMCAT_ACCEPTOR_COUNT)) {
      return;
    }
    TomcatEmbeddedServletContainerFactory tomcat =
        (TomcatEmbeddedServletContainerFactory) container;
    tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer() {
      @Override
      public void customize(Connector connector) {
        ProtocolHandler handler = connector.getProtocolHandler();
        if (handler instanceof Http11NioProtocol) {
          Http11NioProtocol http = (Http11NioProtocol) handler;
          int acceptCount = Integer.parseInt(environment.getProperty(TOMCAT_ACCEPTOR_COUNT));
          http.setBacklog(acceptCount);
          logger.info("Setting tomcat accept count to {}", acceptCount);
        }

      }
    });
  }
}

相关源码截图:

EmbeddedWebApplicationContext和 EmbeddedServletContainerCustomizerBeanPostProcessor类

 

 

 

 最后:质疑和想象

1。Java在1.5引入java.lang.instrument,由此可以实现一个Java agent,通过此agent来修改类的字节码即改变一个类。也就是可以定制一个类,  更底层的定制一个bean,其实spring aop可选择JDK动态代理和cglib动态代理,默认采用的是JAVA动态代理,这2个代理的本质也是修改字节码,和instrument思想一样。

 

2.instrument 应用场景大部分都是监控系统的运行情况,比如分布式系统调用链中分析服务的调用情况。

 

 

猜你喜欢

转载自ahua186186.iteye.com/blog/2392393