Spring AOPは、インターフェースなしのサービスをリリースし、呼び出します.
シーン:Spring容器の中にはたくさんのbeanがインターフェースがないので、今はこれらのbeanをRMIサービスに開発します.
サービス先にSayHello類があると仮定します.
1.サービス端末にRMIProxyインターフェースを追加する:
SayHello、およびRMIProxyインターフェースをコピーします.
ブロックを実現:
ソースはこちらです
サービス先に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はサービスから呼び出されました.ソースはこちらです