为什么底层要使用Netty? 在互联网公司中,对性能的要求一般都比较高,spring boot web 默认是Tomcat,但是Tomcat的I/O性能不如Netty。spring boot 默认的还有另外2个内嵌web容器。从源码中也可以看到
另外在spring boot启动的时候会初始化,会根据当前类型的来判断初始化的web容器类型。
然后在run方法中进行创建ApplicationContext的时候,根据webEnvironment字段来选择要创建的contextClass。
引入pom依赖:
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-spring</artifactId>
<version>3.1.0.Final</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.6.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-netty4</artifactId>
<version>3.1.0.Final</version>
</dependency>
直接通过在自己写的starter中的META-INF下的spring-factories
中,加入
因为@EnableAutoConfiguration 作用: 从classpath中搜索所有META-INF/spring.factories配置文件然后,将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration key对应的配置项加载到spring容器 只有spring.boot.enableautoconfiguration为true(默认为true)的时候,才启用自动配置
@EnableAutoConfiguration还可以进行排除,排除方式有2中,一是根据class来排除(exclude),二是根据class name(excludeName)来排除 其内部实现的关键点有: ImportSelector 该接口的方法的返回值都会被纳入到spring容器管理中SpringFactoriesLoader 该类可以从classpath中搜索所有META-INF/spring.factories配置文件,并读取配置。
先看一下@EnableAutoConfiguration的定义:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
/**
* Exclude specific auto-configuration classes such that they will never be applied.
* @return the classes to exclude
*/
Class<?>[] exclude() default {};
/**
* Exclude specific auto-configuration class names such that they will never be
* applied.
* @return the class names to exclude
* @since 1.3.0
*/
String[] excludeName() default {};
}
注意这一行: @Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector实现了ImportSelector接口,并会在实例化时调用selectImports。下面是其方法:
这个方法中的getCandidateConfigurations会从类加载器中查找所有的META-INF/spring.factories,并加载其中实现了@EnableAutoConfiguration的类。
如果你一步一步追下去,你会发现,是在SpringApplication类的refreshContext方法的时候调用了上面的selectImports方法。
说回来,那么这个ResteasyAutoConfiguration,里面需要做什么呢? 1、封装ResteasyProviderFactory 和 ResourceMethodRegister,这两个都是jboss包下reastesy提供的
比如你可以在你想的项目中自定义自己的provider类,然后注册到resteasy的ProviderFactory中
2、实例化resteasy的SpringBeanProcessor,这个处理器会把任何加了@path或者@provier的bean注册到resteasy框架中。
3、实例化ApplicationListener的bean,并实现它的onApplicationEvent方法进行监听,在监听到上下文刷新的时候,将netty启动。
创建NettyJaxrsServer:
为什么呢? 因为SpringApplication.run方法中调用refreshContext方法,然后再调用refresh方法,其中该方法中的finishRefresh容器启动完成最后刷新,发布ContextRefreshedEvent事件。
执行finishRefresh方法发布ContextRefreshedEvent事件,标志的容器已经启动完成。