通过Spring Aop编程思想,利用注解为某些对象添加新的功能
- 我们在利用Spring Aop的时候已经利用了切面来为原有的Bean中的方法新增了额外功能。那么我们也可以利用这个思路创建一个切面来为已有的Bean增点额外的功能(额外的方法)
- 以下是展示它是如何工作的
- 为了验证改思路是行的通,我们直接贴代码(亲测)
public interface Encoreable(){
void performance();
}
@Service
public class DefaultEncoreable implements Encoreable {
@Override
public void encoreable() {
System.err.println("利用aop注解为对象增减新功能成功了");
}
}
public interface PerformService {
public void perform(int a);
}
@Service
public class PerformServiceImpl implements PerformService{
@Override
public void perform(int a){
System.err.println("11111111111111111");
}
}
public class AopT extends BaseTest{
@Resource
private PerformService performService;
@Test
public void get(){
Encoreable encoreable = (Encoreable)performService;
encoreable.encoreable();
}
}
@Aspect
public class EncoreableIntroducer(){
@DeclarParents(value="xx.xx.Performance+",defaultImpl=DefaultEncoreable.class)
public static Encoreable encoreable;
}
<bean class="xx.xx.EncoreableIntroducer"></bean>
<aop:config>
<aop:aspect>
<aop:declare-parents types-matching="xx.xx.Performance+"
implement-interface="xx.xx.xx.Encoreable" default-impl="encoreableDelegate" />
</aop:aspect>
</aop:config>
<bean id="encoreableDelegate" class="xx.xx.DefaultDecoreable"></bean>
- 可以看到EncoreableIntroducer是一个切面,但是他与我们熟知的切面不同,没有前置,后置,或者环绕的额外功能,但是通过@DeclarParents注解可以将Encoreable接口引入到Performance bean中
- @DeclarParents注解由三部分组成
- value:属性指的是那种类型的bean要引入该接口,在本例子中也就是所有的实现了Performance接口的Bean,”+”标识表示的是Performance的子类型而不是自己。
- defaultImpl:属性指定了为引入功能提供的实现类,改例子中用DefaultEncoreable作为实现类
- @DeclarParents标注的静态属性指明了要引入的接口,在本例子中我们引入的是Encoreable 接口。