AspectJ原生注解注入Spring对象
在研发项目的一些设计中,我们将特殊的业务封装在SDK中暴露接口,提供给业务方使用,比如dubbo的服务暴露也是如此。但是,对于某些特殊的方法或类进行诸如QPS、RT信息收集,又或者如我们下面讲的通用ABTest,为了不污染业务代码,我们在SDK提供了便捷的接入方式:注解,业务方只需要在代码的方法上面添加SDK中注解便可,无需任务其他修改。具体处理的逻辑交给我们SDK封装的方方法通过增强实现。
说道增强实现,就不得不提到AspectJ了,它是最常用的字节码处理框,是AOP编程思想的一个实践。我们SDK中不想依赖Spring的框架和代码,因此直接使用原生的AspectJ实现一个AOP,帮助我们解决业务问题。想法很丰满,现实很骨感,复杂的业务,不单单是一个通用SDK就能完成的,还需要根据各个服务自身的业务来完成个性化需求,最好的解决方法时业务方提供服务能力,通过调用业务方的接口实现完整的业务逻辑。这时候,我们就会遇到如何将业务方提供的服务注入到我们的切面服务中!
只要是使用过spring的开发者,都知道,想要在一个对象中注入spring容器管理的对象,那么首要条件是该对象也必须接受spring容器管理。因此上,我们也是这么去做的,具体看下面的实现。