基於代理的spring aop中目標物件引入新特性的實現
阿新 • • 發佈:2018-12-12
IntroductionInterceptor也是一個標記介面,其子類中有個便捷的實現類,即DelegatingIntroductionInterceptor.
說明,定義引入的實現類,也需要實現新增特性的介面.
目標物件類
package siye;
public class TargetObj
{
public void targetMeth()
{
System.out.println("target_object_method....");
}
}
新增特性介面
package siye; public interface NewFeature { void featureMeth(); }
引入實現類
package siye; import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.support.DelegatingIntroductionInterceptor; public class IntroductionInterceptorImpl extends DelegatingIntroductionInterceptor implements NewFeature {// 實現引入介面的同時,也要實現新增特性的介面. private static final long serialVersionUID = -5595327221312353940L; @Override public Object invoke(MethodInvocation mi) throws Throwable { return super.invoke(mi); } @Override public void featureMeth() { System.out.println("new_feature_method..."); } }
測試基於代理的spring aop引入功能的測試類
package siye; import org.aopalliance.aop.Advice; import org.springframework.aop.framework.ProxyFactory; public class UnitTest { public static void main(String[] args) { TargetObj targetObj = new TargetObj(); Advice adviceImpl = new IntroductionInterceptorImpl(); ProxyFactory proxy = new ProxyFactory(); // 設定cglib代理,否則無法對目標類進行動態代理. proxy.setProxyTargetClass(true); proxy.addAdvice(adviceImpl); proxy.setTarget(targetObj); TargetObj obj0 = (TargetObj) proxy.getProxy(); obj0.targetMeth(); NewFeature obj1 = (NewFeature) obj0; obj1.featureMeth(); } }