Skip to content

Spring AOP 通过注解引入新功能

🏷️ Spring

前文: Spring AOP 使用切面

通过 AOP 给前文中的 Performance 添加方法,而不需要修改所有的 Performance 接口的实现。

1. 定义一个新的接口,包含一个新方法

java
package concert;

/**
* Created by liujiajia on 2017/3/28.
*/
public interface Encoreable {
    void performEncore();
}

2. 创建一个实现该接口的类

java
package concert;

/**
* Created by liujiajia on 2017/3/28.
*/
public class DefaultEncoreable implements Encoreable {
    public void performEncore() {
        System.out.println("Encoring");
    }
}

3. 创建一个切面,并通过 @DeclareParents 注解给 Performancebean 增加方法

java
package concert;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;
import org.springframework.stereotype.Component;

/**
* Created by liujiajia on 2017/3/28.
*/
@Aspect
@Component
public class EncoreableIntroducer {
    @DeclareParents(value = "concert.Performance+", defaultImpl = DefaultEncoreable.class)
    public static Encoreable encoreable;
}

4. 创建测试类测试效果

java
package concert;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
* Created by liujiajia on 2017/3/28.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ConcertConfig.class)
public class AudienceEncoreTest {
    @Autowired
    private Performance performance;

    @Test
    public void performance() {
        // Performance 自己的方法
        performance.perform();
        // 通过 AOP 增加的方法
        ((Encoreable) performance).performEncore();
    }
}

5. 测试结果(最后一行的 Encoring 就是通过新方法打印的)

Silencing cell phones
Taking seats
Playing music
CLAP CLAP CLAP!!!
Encoring

附 1. @DeclareParents 注解由三部分组成

  • value 属性指定了哪种类型的 bean 要引入该接口。在本例中,也就是所有的 Performance 的类型。(标记符后面的加号表示是 Performance 的所有子类型,而不是 Performance 本身)。

  • defaultImpl 属性指定了为引入该功能提供实现的类。在这里,我们指定的是 DefaultEncoreable 提供实现。

  • @DeclareParents 注解所标注的静态属性指明了要引入接口。在这里,我们所引入的是 Encoreable 接口。