1. 程式人生 > >基於代理的spring aop中目標物件引入新特性的實現

基於代理的spring aop中目標物件引入新特性的實現

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();
	}
}