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

来源:互联网 发布:2014大学生就业率数据 编辑:程序博客网 时间:2024/06/05 11:51

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

  • 我们在利用Spring Aop的时候已经利用了切面来为原有的Bean中的方法新增了额外功能。那么我们也可以利用这个思路创建一个切面来为已有的Bean增点额外的功能(额外的方法)
  • 以下是展示它是如何工作的
  • 这里写图片描述
  • 为了验证改思路是行的通,我们直接贴代码(亲测)
//方式一:利用注解//引入beanpublic interface Encoreable(){     //被引入的新曾方法     void performance();}//引入bean的实现类@Servicepublic class DefaultEncoreable implements Encoreable {    @Override    public void encoreable() {        System.err.println("利用aop注解为对象增减新功能成功了");    }}public interface PerformService {    public void perform(int a);}@Servicepublic 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 接口。
阅读全文
1 0
原创粉丝点击