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

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

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

    中文JAVA技術(shù)平等自由協(xié)作創(chuàng)造

    Java專題文章博客和開源

    常用鏈接

    統(tǒng)計(jì)

    最新評(píng)論

    基于反射機(jī)制的服務(wù)代理調(diào)用

      實(shí)現(xiàn)原理:通過傳遞服務(wù)bean的名稱、執(zhí)行的方法及參數(shù),通過反射機(jī)制進(jìn)行調(diào)用返回sat答案

      優(yōu)點(diǎn):只需對(duì)外提供一個(gè)接口服務(wù)即可,只要容器中操作服務(wù)bean,通過接口即可調(diào)用,增加服務(wù)bean無需增加對(duì)外接口。

      代碼如下:

      接口類

      public interface ProxyService {

      /**

      * webservice調(diào)用代理

      * @param beanName bean或類名

      * @param functionName 調(diào)用的函數(shù)名

      * @param params 參數(shù)

      * @return

      * @throws Exception

      */

      Object proxy(String beanName, String functionName,String… params) throws Exception;

      }

      實(shí)現(xiàn)類:

      服務(wù)基于spring,為了方便獲取服務(wù)bean,實(shí)現(xiàn)類實(shí)現(xiàn)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;

      }

      /**

      * 通過代理執(zhí)行業(yè)務(wù)方法,方法數(shù)據(jù)

      */

      @SuppressWarnings("rawtypes")

      @Override

      public Object proxy(String beanName, String functionName, String… params) throws ServiceException {

      //參數(shù)判斷

      if(StringUtils.isEmpty(beanName)){

      throw new Exception("error: beanName is empty.");

      }

      if(StringUtils.isEmpty(functionName)){

      throw new Exception("error: functionName is empty.");

      }

      //獲取服務(wù)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;

      //處理無參數(shù)調(diào)用

      if(params == null || params.length ==0){

      try {

      //獲取服務(wù)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{

      //處理有參數(shù)調(diào)用

      //處理調(diào)用方法參數(shù)

      Class[] paraTypes = new Class[params.length];

      for (int i = 0; i < paraTypes.length; i++) {

      paraTypes[i] = String.class;

      }

      try {

      //獲取服務(wù)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 {

      //調(diào)用返回?cái)?shù)據(jù)

      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對(duì)象

      * @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;

      }

      }

      調(diào)用方式如下:

      proxyService.proxy("testservice","say","helloword");

      testservice 為spring中bean實(shí)例

      say 為testservice的業(yè)務(wù)方法

      helloword 為參數(shù)

      以上方式可以使用與遠(yuǎn)程調(diào)用(如webservice等),對(duì)外為的代理調(diào)用接口。只需實(shí)現(xiàn)一個(gè)對(duì)外接口,調(diào)用服務(wù)內(nèi)部多個(gè)業(yè)務(wù)服務(wù)托福答案

     

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


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    PK10開獎(jiǎng) PK10開獎(jiǎng)
    主站蜘蛛池模板: 大地资源中文在线观看免费版| 另类图片亚洲校园小说区| 婷婷亚洲综合五月天小说| 亚洲AV中文无码乱人伦下载| 亚洲精品无码午夜福利中文字幕 | 亚洲免费人成视频观看| 国产精品视频免费一区二区 | 国产亚洲人成在线影院| 国产又黄又爽胸又大免费视频| 99爱免费观看视频在线| 无码国产亚洲日韩国精品视频一区二区三区| 亚洲高清有码中文字| 亚洲AV无码久久精品蜜桃| 亚洲人成网站看在线播放| 亚洲国产成人久久精品动漫| 精品国产成人亚洲午夜福利| 无遮挡国产高潮视频免费观看 | www在线观看免费视频| 亚洲免费网站观看视频| 亚洲av无码不卡| eeuss影院免费直达入口| 女人让男人免费桶爽30分钟| 国产精品无码免费专区午夜| 国产桃色在线成免费视频| 亚洲一区无码精品色| 亚洲宅男天堂在线观看无病毒 | 亚洲国产AV无码专区亚洲AV| 国产成人精品免费视频大全五级 | 亚洲国产精品va在线播放| 日韩在线视频免费| 亚洲高清无码专区视频| 亚洲人成网站在线在线观看| 免费在线视频你懂的| 亚洲国产成人久久精品app| 亚洲日产2021三区| 99爱在线精品免费观看| 亚洲婷婷第一狠人综合精品| 免费观看91视频| 亚洲中文无码av永久| 久久久高清免费视频| 日韩亚洲国产综合高清|