SpringBoot-嵌入式Servlet容器原理

WebServerFactory自动配置

@Configuration
@AutoConfigureOrder(-2147483648)
@ConditionalOnClass({ServletRequest.class})
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@EnableConfigurationProperties({ServerProperties.class})
@Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class, EmbeddedTomcat.class, EmbeddedJetty.class, EmbeddedUndertow.class})
public class ServletWebServerFactoryAutoConfiguration {

	// Servlet Web Server 通用配置,将ServerProperties注入到定制器中,实现application.properties中的配置信息配置 Servlet Web Server
	@Bean
	public ServletWebServerFactoryCustomizer servletWebServerFactoryCustomizer(ServerProperties serverProperties) {
	return new ServletWebServerFactoryCustomizer(serverProperties);
	}

	// Tomcat Servlet Web Server 配置信息
	@Bean
	@ConditionalOnClass(
	name = {"org.apache.catalina.startup.Tomcat"}
	)
	public TomcatServletWebServerFactoryCustomizer tomcatServletWebServerFactoryCustomizer(ServerProperties serverProperties) {
	return new TomcatServletWebServerFactoryCustomizer(serverProperties);
	}
}

EmbeddedTomcat 嵌入式Tomcat

@Configuration
// 判断当前是否引入了 org.apache.catalina.startup.Tomcat 依赖
@ConditionalOnClass({Servlet.class, Tomcat.class, UpgradeProtocol.class})
// 当没有 ServletWebServerFactory 类型的Bean时才注入该组件
@ConditionalOnMissingBean(
	value = {ServletWebServerFactory.class},
	search = SearchStrategy.CURRENT
)
public static class EmbeddedTomcat {
	public EmbeddedTomcat() {
	}

  // 创建Tomcat容器工厂
	@Bean
	public TomcatServletWebServerFactory tomcatServletWebServerFactory() {
		return new TomcatServletWebServerFactory();
	}
}

  ServletWebServerFactory(Servlet容器工厂) 继承关系

@FunctionalInterface
public interface ServletWebServerFactory {
	// 创建WebServer即Servlet容器 
  WebServer getWebServer(ServletContextInitializer... initializers);
}

  WebServer (Servlet容器) 继承关系

public interface WebServer {
    void start() throws WebServerException;

    void stop() throws WebServerException;

    int getPort();
}

  TomcatServletWebServerFactory 获得Tomcat Servlet 容器(即org.apache.catalina.startup.Tomcat)

public WebServer getWebServer(ServletContextInitializer... initializers) {
	// 创建Tomcat容器	
	Tomcat tomcat = new Tomcat();
  // 配置Tomcat运行环境
	File baseDir = this.baseDirectory != null ? this.baseDirectory : this.createTempDir("tomcat");
	tomcat.setBaseDir(baseDir.getAbsolutePath());
	Connector connector = new Connector(this.protocol);
	tomcat.getService().addConnector(connector);
	this.customizeConnector(connector);
	tomcat.setConnector(connector);
	tomcat.getHost().setAutoDeploy(false);
	this.configureEngine(tomcat.getEngine());
	Iterator var5 = this.additionalTomcatConnectors.iterator();

	while(var5.hasNext()) {
		Connector additionalConnector = (Connector)var5.next();
		tomcat.getService().addConnector(additionalConnector);
	}

	this.prepareContext(tomcat.getHost(), initializers);
  // 调用 tomcat.start(); 启动容器
	return this.getTomcatWebServer(tomcat);
}

修改Servlet容器配置信息的方式 

  1)修改application.properties

server.port=8888

  2)  添加定制器

package com.wjz.config;

import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

@Component
public class WebServerConfig implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
    @Override
    public void customize(ConfigurableWebServerFactory factory) {
        factory.setPort(8888);
    }
}  

定制器后置处理器

public class WebServerFactoryCustomizerBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware {

	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		if (bean instanceof WebServerFactory) {
			this.postProcessBeforeInitialization((WebServerFactory)bean);
		}

		return bean;
	}

	private void postProcessBeforeInitialization(WebServerFactory webServerFactory) {
		((Callbacks)LambdaSafe.callbacks(WebServerFactoryCustomizer.class, this.getCustomizers(), webServerFactory, new Object[0]).withLogger(WebServerFactoryCustomizerBeanPostProcessor.class)).invoke((customizer) -> {
			customizer.customize(webServerFactory);
		});
	}

	private Collection<WebServerFactoryCustomizer<?>> getCustomizers() {
		if (this.customizers == null) {
			this.customizers = new ArrayList(this.getWebServerFactoryCustomizerBeans());
			this.customizers.sort(AnnotationAwareOrderComparator.INSTANCE);
			this.customizers = Collections.unmodifiableList(this.customizers);
		}

		return this.customizers;
	}

	private Collection<WebServerFactoryCustomizer<?>> getWebServerFactoryCustomizerBeans() {
		return this.beanFactory.getBeansOfType(WebServerFactoryCustomizer.class, false, false).values();
	}
}

  

猜你喜欢

转载自www.cnblogs.com/BINGJJFLY/p/11878064.html