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是从服务端调用过来的。

源码见这里

转载于:https://my.oschina.net/u/574870/blog/179925

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值