<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    中文JAVA技術平等自由協作創造

    Java專題文章博客和開源

    常用鏈接

    統計

    最新評論

    基于反射機制的服務代理調用

      實現原理:通過傳遞服務bean的名稱、執行的方法及參數,通過反射機制進行調用返回sat答案

      優點:只需對外提供一個接口服務即可,只要容器中操作服務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等),對外為的代理調用接口。只需實現一個對外接口,調用服務內部多個業務服務托福答案

     

    posted on 2014-01-12 22:01 好不容易 閱讀(136) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    PK10開獎 PK10開獎
    主站蜘蛛池模板: 中文字幕亚洲乱码熟女一区二区| 0588影视手机免费看片| 免费人成在线观看播放国产 | 久久久久免费精品国产| 精品亚洲成α人无码成α在线观看 | 亚洲高清专区日韩精品| 两个人看的www免费高清| 国产亚洲成归v人片在线观看| 久青草视频在线观看免费| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 精品亚洲AV无码一区二区| 免费观看AV片在线播放| 国产精品亚洲四区在线观看| 久久久久免费看黄A片APP| 亚洲精品成a人在线观看夫| 在线免费观看韩国a视频| 美女被免费网站在线视频免费 | 国产精品视频免费| 中日韩亚洲人成无码网站| 午夜免费福利在线| 一区二区三区AV高清免费波多| 久久被窝电影亚洲爽爽爽| 亚洲香蕉免费有线视频| 亚洲国产成人精品无码区二本| 亚洲M码 欧洲S码SSS222| 很黄很污的网站免费| 亚洲国产成人久久77| 日本v片免费一区二区三区| jizz在线免费播放| 亚洲天天做日日做天天欢毛片| 久久不见久久见中文字幕免费 | 免费国产99久久久香蕉| 亚洲欧洲综合在线| 国产真实伦在线视频免费观看| 久久国产一片免费观看| 亚洲国产精品张柏芝在线观看| 免费A级毛片无码久久版| 久久国产精品免费专区| 亚洲欧美日韩国产成人| 亚洲人成在线播放网站| 无码免费午夜福利片在线 |