实现原理:通过传递服务bean的名称、执行的方法及参数,通过反射机制进行调用返回。
优点:只需对外提供一个接口服务即可,只要容器中操作服务bean,通过接口即可调用,增加服务bean无需增加对外接口。
代码如下:
接口类
- public interface ProxyService {
- /**
- * webservice调用代理
- * @param beanName bean或类名
- * @param functionName 调用的函数名
- * @param params 参数
- * @return
- * @throws Exception
- */
- Object proxy(String beanName, String functionName,String... params) throws Exception;
- }
实现类:
服务基于spring,为了方便获取服务bean,实现类实现spring的ApplicationContextAware接口
- @Service
- public class ProxyServiceImpl implements ProxyService ,ApplicationContextAware{
- protected final Logger logger = LoggerFactory.getLogger(getClass());
- @Resource
- private ApplicationContext applicationContext;
- @Override
- public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
- this.applicationContext = applicationContext;
- }
- /**
- * 通过代理执行业务方法,方法数据
- */
- @SuppressWarnings("rawtypes")
- @Override
- public Object proxy(String beanName, String functionName, String... params) throws ServiceException {
- //参数判断
- if(StringUtils.isEmpty(beanName)){
- throw new Exception("error: beanName is empty.");
- }
- if(StringUtils.isEmpty(functionName)){
- throw new Exception("error: functionName is empty.");
- }
- //获取服务bean
- Object bean = getBean(beanName);
- if(bean == null){
- throw new Exception("error: bean is not exist.");
- }
- if(params == null || params.length ==0){
- logger.warn("proxy params is empty.");
- }
- Method method = null;
- //处理无参数调用
- if(params == null || params.length ==0){
- try {
- //获取服务bean方法
- method = bean.getClass().getMethod(functionName);
- } catch (SecurityException e) {
- logger.error("proxy getMethod SecurityException:"+e.getMessage());
- e.printStackTrace();
- } catch (Exception e) {
- logger.error("proxy invoke IllegalArgumentException:"+e.getMessage());
- e.printStackTrace();
- throw new Exception("error: get method Exception:"+e.getMessage());
- }
- }else{
- //处理有参数调用
- //处理调用方法参数
- Class[] paraTypes = new Class[params.length];
- for (int i = 0; i < paraTypes.length; i++) {
- paraTypes[i] = String.class;
- }
- try {
- //获取服务bean方法
- method = bean.getClass().getMethod(functionName, paraTypes);
- }catch (Exception e) {
- logger.error("proxy invoke IllegalArgumentException:"+e.getMessage());
- e.printStackTrace();
- throw new Exception("error: get method Exception:"+e.getMessage());
- }
- }
- if(method == null ){
- throw new Exception("error: function is not exist.");
- }
- Object rs = null;
- try {
- //调用返回数据
- rs = method.invoke(bean,params);
- } catch (Exception e) {
- logger.error("proxy invoke IllegalArgumentException:"+e.getMessage());
- e.printStackTrace();
- throw new Exception("error: invoke method Exception:"+e.getMessage());
- }
- return rs;
- }
- /**
- * 获取bean对象
- * @param beanName
- * @return
- */
- private Object getBean(String beanName){
- Object bean = null;
- bean = applicationContext.getBean(beanName);
- if(bean == null){
- try {
- Class<?> classe = Class.forName(beanName);
- bean = classe.newInstance();
- } catch (InstantiationException e) {
- logger.error("getBean InstantiationException:"+e.getMessage());
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- logger.error("getBean IllegalAccessException:"+e.getMessage());
- e.printStackTrace();
- }catch ( ClassNotFoundException e) {
- logger.error("getBean ClassNotFoundException:"+e.getMessage());
- e.printStackTrace();
- }
- }
- logger.debug("getBean(),beanName:"+beanName);
- return bean;
- }
- }
调用方式如下:
proxyService.proxy("testservice","say","helloword");
testservice 为spring中bean实例
say 为testservice的业务方法
helloword 为参数
以上方式可以使用与远程调用(如webservice等),对外为的代理调用接口。只需实现一个对外接口,调用服务内部多个业务服务。
转载自:http://blog.csdn.net/zhu_tianwei/article/details/18082045,如涉及版权问题,请联系我。本人即刻删除该转载贴