通过Spring Aop编程思想,利用注解为某些对象添加新的功能

通过Spring Aop编程思想,利用注解为某些对象添加新的功能

  • 我们在利用Spring Aop的时候已经利用了切面来为原有的Bean中的方法新增了额外功能。那么我们也可以利用这个思路创建一个切面来为已有的Bean增点额外的功能(额外的方法)
  • 以下是展示它是如何工作的
  • 这里写图片描述
  • 为了验证改思路是行的通,我们直接贴代码(亲测)
//方式一:利用注解
//引入bean
public interface Encoreable(){
     //被引入的新曾方法
     void performance();
}

//引入bean的实现类
@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 //当spring发现有一个此注解的时候,就会创建一个代理类然后将调用委托给被被代理的bean或者被引入的实现
public class EncoreableIntroducer(){
    @DeclarParents(value="xx.xx.Performance+",defaultImpl=DefaultEncoreable.class)
    public static Encoreable encoreable;
}
//与之前的切面一样要在Spring的配置文件里声明这个需要需要创建代理Bean的Bean  
<bean class="xx.xx.EncoreableIntroducer"></bean>

//方式二:利用spring配置文件
<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 接口。

猜你喜欢

转载自blog.csdn.net/suubyy/article/details/78019802