初学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 应用场景大部分都是监控系统的运行情况,比如分布式系统调用链中分析服务的调用情况。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值