在有些情况下某个类并不能显式的添加实现类,比如我们只有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();
网友评论