场景 :Spring容器中有很多bean是没有接口的,现在要把这些bean开发成RMI服务。
假设服务端现在有SayHello类:
package com;
public class SayHello {
public String say(String name){
return "Hello,"+name;
}
}
1.在服务端增加一个RMIProxy接口:
package com;
public interface RMIProxy {
public Object call(String beanId,String method,Class<?>[] paramsType, Object[] params) throws Exception;
}
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;
}
}
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;
}
}
<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"));
源码见这里