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
注解给 Performance
的 bean
增加方法
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
接口。