SpringAop增强的使用记录

By | 2016 年 02 月 15 日

最近使用SpringAop对一些托管在容器中的bean做一些增强处理,这里做一下记录。
这里是用的是InstantiationAwareBeanPostProcessor来做bean的初始化控制。

一、
由于容器中的一些bean是FactoryBean,想要拿到真实对象及其对应的名称,采用了这种方案。先捕获FactoryBean以及对应的名称,然后在根据名称找到第一次出现此非FactoryBean时候的对象。这样就拿到了相对原始的对象了。

二、
上面说相对原始,是什么意思呢?由于bean初始化的Processor执行顺序问题,不能一定保证自己是FactoryBean获取原始Bean之后第一个执行的,而且FactoryBean之后会走一次其他库的AOP,指不定拿到的是哪一个步骤后的产物,因此只能说相对来讲能够拿到少量修饰的对象。不过,这次并不关心是否已经被AOP过了,因为对于已经AOP过的对象,如果再次AOP可以采用下面的方法。

三、
SpringAOP代理过的对象都会让其实现Advised接口。这里就直接判断是否有实现Advised接口,如果实现了,就可以直接调用这个接口的addAdvice方法为其增加Interceptor,而如果没有实现,则就直接使用ProxyFactory为他生成个代理对象。

四、
最后,就是已经提到过的,bean修饰的顺序问题。经过测试,以及粗略过了一下代码,大约有这样的顺序:PriorityOrdered接口->Ordered接口->其他。因为本次只需要保证拿到的是已经被AOP过一次的同时较为原始的Bean,故直接实现Ordered接口,并且将getOrder的方法实现为返回Ordered.LOWEST_PRECEDENCE。

发表评论