SpringSpring专题

SpringAOP中如何向类引入新方法?

2019-11-18  本文已影响0人  自律赢

前言

我们在这里所说的向类引入新方法并不是指通过修改类来新增方法,而是在不修改类的前提下来新增。这种操作在AOP编程中叫做引入(Introduction),即向现有的类添加新方法和属性。我们还是从一个小例子入手吧。这个小例子中定义2种行为即2个接口,一种是跑(Run),一种是飞(Fly)。它们的实现分别叫Runner和Bird。现在让Runner实现类在不实现Fly接口的情况下,向它引入Fly接口的功能。即让Runner类也能飞。

接口和实现类的定义

Run接口和其实现:

Run接口 Run接口的实现

Fly接口和其实现:

Fly接口 Fly接口的实现

通过注解实现引入新功能fly

java配置类中通过@ComponentScan注解开启自动扫描,通过@EnableAspectJAutoProxy注解开启自动代理模式。如下图:

java配置

在切面类MyAspect中通过@Component注解标记bean,通过@Aspect注解定义切面,通过@DeclareParents注解定义需要引入的新功能Fly。其中@DeclareParents注解的value属性定义了需要向哪个类引入新功能,defaultImpl属性定义了需要引入的新功能是由哪个类实现的。如下图:

切面进行引入

完成之后我来进行单元测试:

单元测试

执行一下runner方法看下结果:

从结果中我们看到runner执行了run方法也执行了fly方法。那么我们的问题是为什么Runner类没有实现Fly接口也能执行fly方法呢?答案其实也很简单,我们看一下单元测试类中注入的runner是什么就知道了。如下图:

打印结果:

从上图中可以看出,单元测试类中注入的runner是一个代理类,这个代理类同时实现了run接口和Fly接口。现在大家应该明白了吧,之所以Runner在没有实现Fly接口的情况下也能提供Fly接口的功能,就是在从Spring容器中获取Runner这个Bean的时候,他会返回一个代理,这个代理不仅实现了Run接口也实现了Fly接口。这样就达到了向Runner引入新方法的目的。

那么我们看看使用xml怎么实现。

通过xml实现引入新功能fly

下图是通过xml配置实现向Runner类引入新功能fly的。这个和配置aop的结构很像,但是这里使用的标签是<aop:declare-parents>。其中types-matching属性指定了要向哪个类引入新功能,implement-interface属性指定了要引入的新功能的接口,delegate-ref属性指定了要引入的新功能的实现是哪一个bean。

delegate-ref属性引入新功能

delegate-ref属性还有另一个替代的方法,那就是default-impl属性,这个属性直接指定一个类的全限定名称作为新功能的实现。如图:

default-impl属性引入新功能

到这里就介绍完了如何使用xml引入新功能,也挺简单的吧。

总结

本篇文章我们介绍了什么是AOP中的引入以及他的实现方法和原理,相信小伙伴们应该都理解了吧。Aop中的引入在工作当中可能用的并不多,这里只是做一个介绍,不过这个功能看起来还是蛮帅的啊。小伙伴们如果有什么疑问可以在下方留言哦。

上一篇下一篇

猜你喜欢

热点阅读