AOP对增强REST式的Web服务的功能性、安全性和可扩展性等方面都具有深远意义,因此,完整的REST风格的框架都从容器级别支持AOP式的开发。Jersey可以在不依赖于Spring等AOP支持框架的情况下,天然地支持AOP。
Jersey的AOP功能来自于GlassFish项目集的HK2项目。Jersey通用包jersey-common依赖HK2(轻量级DI架构),包括hk2-api和hk2-locator。
其中hk2-locator依赖于javax.inject包、asm-all-repackage包和cglib包。从这些包名不难看出hk2-locator是致力于AOP方向的包。javax.inject包出自Java依赖规范(JSR-330),cglib是Spring用户熟知的动态代码生成工具。是Spring两种AOP实现方式的一种,其底层依赖于ASM。ASM来自于开源软件国际联盟OW2(http://www.ow2.org),OW2的前身是来自法国的ObjectWeb和来自中国的orientWare两个中间件开源组织。
Jersey提供的REST过滤器和拦截器为开发者提供了很贴心的切面扩展点,开发者无需像在Spring中为了针对某个类的方法进行AOP扩展而写配置文件。在Jersey中,只要实现相应扩展点的接口,即可实现REST请求流程中特点时间点的拦截、扩展,其他工作由底层的HK2帮我们做。典型的应用包括请求和响应的过滤和读取拦截。
Providers详解
javax.ws.rs.ext.Providers是JAX-RS 2.0定义的一种辅助接口,其实现类用于辅助REST框架完成过滤和读取拦截等功能。使用注解@Provider来标注这些实现类,可以被JAX-RS2.0的运行时自动探测、加载。Provider实例可以通过@Context注解被依赖注入到其它实例中。Providers接口定义了4个方法,分别用来获取MessageBodyReader、MessageBodyWriter、ExceptionMapper和ContextResolver实例。