java spi ,servlet3.0 spring web启动

6 篇文章 0 订阅

问题: spring web,在没有web.xml的情况下是如何被tomcat拉起来启动的呢?

首先是,tomcat 会通过 java 的spi 机制(其实tomcat 没java提供的spi方式,只是参照了其规范而已,下面详述),去找 javax.servlet.ServletContainerInitializer (since servlet 3.0)的实现类sping-web jar里有对 ServletContainerInitializer 的实现 SpringServletContainerInitializer 。
然后,tomcat 会调用该接口实现的 onStart 方法。这样就将执行权交给了 spring了。

java 的spi 机制:

  • java 1.6 开始提供一个类叫做 java.util.ServiceLoader, 它是finnal 的,无法被继承个改动。
  • 它有load(Class aClass) 方法,这个方法会去所以jar 中寻找 /META-INF/services/${aClass.fullClassName} 的文件(使用 ClassLoader.getSystemResources 方法),全部找到,然后解析其里面的内容,里面按照规范应该是每行一个对aClass 的一个实现类。并会通过 Class 的 newInstance 将其创建实例后给出来。 如此,调用者即可通过ServiceLoader 类的load 方法,找到实现了某个接口的 实现类并操作其实例。
  • 然而 servlet3.0 并没有直接使用上面说的 java 的spi方式。只是参照其标准,自己写了个 WebappServiceLoader ,其虽然也是找 /META-INF/service 下的东西,但是找的范围被限定在 /WEB-INF/lib 下的jar中。

然后说说 ServletContainerInitializer 这个规范:

  • 其 实现类 通过 spi 方式被找到后, 如果实现类上被注解了 类似 @javax.servlet.annotation.HandlesTypes(A.class,B.class) ,那么调用者按照规范需要将 A.class和 B.class 的实现类的 Class 对象,弄个Set ,传递给这个 ServletContainerInitializer 的 onStart 方法的第一个参数中。servlet3.0 是通过BCEL框架来扫描HandlesTypes中指定接口的实现类的。 Byte Code Engineering Library (BCEL),这是Apache Software Foundation 的Jakarta 项目的一部分,作用同ASM类似,是字节码操纵框架。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值