Spring AOPは、インターフェースなしのサービスをリリースし、呼び出します.


シーン:Spring容器の中にはたくさんのbeanがインターフェースがないので、今はこれらのbeanをRMIサービスに開発します.
サービス先にSayHello類があると仮定します.
package com;

public class SayHello {
	public String say(String name){
		return "Hello,"+name;
	}
}
今はこのbeanをRMIに開放してコールします.
1.サービス端末にRMIProxyインターフェースを追加する:
package com;


public interface RMIProxy {
	public Object call(String beanId,String method,Class<?>[] paramsType, Object[] params) throws Exception;
}
2.実現インターフェース:
package com;

import java.lang.reflect.Method;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class RMIProxyImpl implements RMIProxy,ApplicationContextAware{
	private ApplicationContext context;
	@Override
	public Object call(String beanId, String method,Class<?>[] paramsType, Object[] params)throws Exception {
		Object obj = context.getBean(beanId);
		Method mtd = obj.getClass().getDeclaredMethod(method, paramsType);
		return mtd.invoke(obj, params);
	}

	@Override
	public void setApplicationContext(ApplicationContext arg0) throws BeansException {
		this.context = arg0;
	}

}
3です.設定xml:
bean id="rmiProxy" class="com.RMIProxyImpl"/>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
    <property name="serviceName" value="rmiProxy"/>
    <property name="service" ref="rmiProxy"/>
    <property name="serviceInterface" value="com.RMIProxy"/>
    <property name="registryPort" value="1199"/>
</bean>
<bean class="com.SayHello"></bean>
クライアント:
SayHello、およびRMIProxyインターフェースをコピーします.
ブロックを実現:
package com;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class RMIInterceptor implements MethodInterceptor{
	private RMIProxy rmiProxy;
	@Override
	public Object invoke(MethodInvocation arg0) throws Throwable {
		
		return rmiProxy.call(arg0.getThis().getClass().getName(), arg0.getMethod().getName(),arg0.getMethod().getParameterTypes(), arg0.getArguments());
	}
	public RMIProxy getRmiProxy() {
		return rmiProxy;
	}
	public void setRmiProxy(RMIProxy rmiProxy) {
		this.rmiProxy = rmiProxy;
	}
	

}
設定xml:
<bean id="rmiProxy" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
		<property name="serviceUrl" value="rmi://127.0.0.1:1199/rmiProxy" />
		<property name="serviceInterface" value="com.RMIProxy" />
	</bean>
	<aop:config>

		<aop:pointcut expression="execution(* com.SayHello.*(..))" id="hh" />
		<aop:advisor advice-ref="adri" pointcut-ref="hh" />
	</aop:config>
	<bean id="adri" class="com.RMIInterceptor">
		<property name="rmiProxy" ref="rmiProxy"></property>
	</bean>

	<bean id="sayHello" class="com.SayHello"></bean>
今からクライアントを呼び出します.
SayHello sh = (SayHello) context.getBean("sayHello");
   System.out.println(sh.say("vidy"));
SayHelloはサービスから呼び出されました.
ソースはこちらです