使用注解引入新功能

2020/10/30 40

Spring

一些编程语言,例如 JavaScirpt 和 Groovy,有开放类的理念,它们可以不用直接修改对象或类的定义,就能够为类添加新的方法。不过 Java 并不是动态语言,一旦编译完成了,我们就很难添加新的功能了。

事实上,利用利用 AOP,切面可以为 Spring bean 添加新方法。Spring中,切面只是实现了它们所包装 bean 相同接口的代理。如果代理实现了接口的同时,暴露新的接口,会怎么样?

使用 Spring AOP,我们可以为 bean 引入新的方法

使用 Spring AOP,我们可以为 bean 引入新的方法。代理拦截调用并委托给实现该方法的其它对象

解决 AOP 的引入功能,我们可以不必在设计上妥协或入侵性地改变现有地实现。

package concert;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;

@Aspect
public class EncoreableIntroducer {
    @DeclareParents(value = "concert.Performance+", defaultImpl = DefaultEncoreable.class)
    public static Encoreable encoreable;
}

它与之前创建的切面不同,没有前置、后置、环绕通知,而是通过 @DeclareParents 注解,将 Encoreable 接口引入到 Performance bean 中。

@DeclareParents 注解由三部分组成: