您的位置:首页 > 运维架构

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

2016-12-11 15:54 309 查看
在有些情况下某个类并不能显式的添加实现类,比如我们只有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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 切面 实现类
相关文章推荐