JavaMVC框架

AOP_通过切面引入新功能(通过切面为方法添加实现接口

2019-06-15  本文已影响0人  Belmode

在有些情况下某个类并不能显式的添加实现类,比如我们只有class文件,此时我们需要为这个类添加一个接口,就可以使用aop的切面来配置。

一、XML配置

1.目标类

package cn.xt.aop;
 
public class ExtraClass {
 
}

2.需要实现的接口

package cn.xt.aop;
 
public interface INewProduct {
    public void extra();
}

3.接口的某个实现类

package cn.xt.aop;
 
public class NewProductImpl implements INewProduct{
    @Override
    public void extra() {
        System.out.println("这是为通知类扩展的方法.....");
    }
 
}

4.xml配置

<!-- 需要扩展的类 -->
    <bean class="cn.xt.aop.ExtraClass" id="extraClass"></bean>
    <!-- 扩展需要的实现类 -->
    <bean class="cn.xt.aop.NewProductImpl" id="newProductImpl"></bean>
 
<aop:config>
        <aop:aspect><!-- 通过切面为类引入新功能(添加默认实现的接口和实现类) -->
            <aop:declare-parents 
                types-matching="cn.xt.aop.ExtraClass" 
                implement-interface="cn.xt.aop.INewProduct"
                delegate-ref="newProductImpl" />
        </aop:aspect>
    </aop:config>

delegate-ref属性代表引用spring容器中的bean来作为默认实现类,另外可以用default-impl="实现类的全限定名"实现一样的效果

5.测试

//通过切面配置以后,ExtraClass并没有显式实现INewProduct接口,依然可以调用接口方法
        INewProduct ec = (INewProduct) ctx.getBean("extraClass",ExtraClass.class);
        ec.extra();

二、注解配置

1.声明一个切面

@Aspect
public class ExtraAspect {
    @DeclareParents(
        value="cn.xt.aop.annotation.ExtraClass"
        ,
        defaultImpl=NewProductImpl.class
    )
    public static INewProduct newProject;
}

2.将切面声明为spring的一个bean

<bean class="cn.xt.aop.annotation.ExtraAspect" />

3.将扩展的实体声明为spring的一个bean

<!-- 需要扩展的类 -->
    <bean class="cn.xt.aop.annotation.ExtraClass" id="extraClass"></bean>

4.测试

INewProduct ec = (INewProduct) ctx.getBean("extraClass",ExtraClass.class);
        ec.extra();
上一篇 下一篇

猜你喜欢

热点阅读