Spring MVC 反射對象和依賴注入


今天,上班寫接口的時候,和同事討論,

是否所有接口能調用同一個地址,通過key作為參數,把模塊名和方法名傳入,把模塊名稱和方法名通過反射機制,獲取到對應模塊名下的方法,通過對應的參數返回想要的結果

討論下來,發現貌似是可以的,說做就做,先寫個Demo

傳入json:

{ 
    "action": "UserWebService-login", 
    "timestamp": "1452223478", 
    "gsonValue": "", 
    "appkey": "123", 
    "nonceStr": "06e2fe8b-1e33-4a80-bdc3-4055b1459388", 
    "signature": "3886041eb6336b6f190cc298fb83ce63", 
    "content": { 
        "C_ACCOUNTNAME": "kate", 
        "C_PASSWORD": "1"
    }
}

action就是這個模塊名和方法名的結合UserWebService-login

模塊UserWebService,方法login

通過這個key,還有對應的參數,請求UserWebService下的login,返回對應的結果集

 1     @Resource
 2     HttpServletRequest request;
 3     
 4     public Object UserWebService(ModleForm form,HttpServletRequest req) throws Exception{
 5         return returnMethodValue(form, req, UserWebService.class,userWebService);
 6     }
 7 
 8     /**
 9      * @Title: returnMethodValue
10      * @Description: TODO(通過json,獲取方法名,獲取接口數據)
11      * @param: @param form
12      * @param: @param req
13      * @param: @param clazz
14      * @param: @return
15      * @param: @throws Exception   
16      * @return: Object   
17      * @throws
18      */
19     public Object returnMethodValue(ModleForm form,HttpServletRequest req,Class<?> clazz) throws Exception{
20         JSONObject jsonObject = new JSONObject(form.getJson());
21         String action = (String) jsonObject.get("action");
22         String Method = (String) StringUtils.returnObjectByLength(StringUtils.toSpilt(action, "-"),1);
23         Method actionMethod = clazz.getMethod(Method,ModleForm.class,HttpServletRequest.class);
24         Object object = actionMethod.invoke(clazz.getClass().newInstance(), form , req);
25         return object;
26     }
27     
28     
29     public Map<String,Object> getMapByObject(Object object){
30         Map<String,Object> map = (Map<String, Object>) object;
31         return map;
32     }
33     
34     
35     @ResponseBody
36     @RequestMapping(value = "/mobile_user/entrance")
37     public String entrance() {
38         Object object = null;
39         String json = request.getParameter("json");
40         JSONObject jsonObject = new JSONObject(json);
41         ModleForm modleForm = new ModleForm();
42         modleForm.setJson(json);
43         Map<String,Object> map = new HashMap<String, Object>();
44         //驗證
45         boolean flag = Verification(json);
46         //返回錯誤碼
47         map = getErrorCode(flag,new ModleForm());
48         try {
49             String action = (String) jsonObject.get("action");
50             List<Object> list = StringUtils.toSpilt(action, "-");
51             String Modular = (String) StringUtils.returnObjectByLength(list,0);
52             
53             Method MobileMethod = MobileWebService.class.getMethod(Modular,ModleForm.class,HttpServletRequest.class);
54             object = MobileMethod.invoke(MobileWebService.class.newInstance(), modleForm , request);
55             map = getMapByObject(object);
56         } catch (Exception e) {
57             // TODO Auto-generated catch block
58             e.printStackTrace();
59             map = this.returnErrorCode(new ModleForm().getComponentId()+"-1101", getMesssage(new ModleForm().getComponentId()+"-1101"));
60             return gsonUtils.toJson(map);
61         }
62         return gsonUtils.toJson(map);
63     }

但是,重點來了,因為是用的SpringMVC

MobileMethod.invoke(MobileWebService.class.newInstance(), modleForm , request);
Object object = actionMethod.invoke(clazz.getClass().newInstance(), form , req);

這樣寫,手動new一個對象,SpringMVC是不會根據這個對象,依賴注入后面的service,dao之類的東西的,而我的UserWebService中就有對應的service需要依賴注入!

怎么辦呢,嘗試了各種辦法,找資料,突然想到@Resource:

@Resource 注解被用來激活一個命名資源(named resource)的依賴注入,在JavaEE應用程序中,該注解被典型地轉換為綁定於JNDI context中的一個對象。 Spring確實支持使用@Resource通過JNDI lookup來解析對象,默認地,擁有與@Resource注解所提供名字相匹配的“bean name(bean名字)”的Spring管理對象會被注入。 在下面的例子中,Spring會向加了注解的setter方法傳遞bean名為“dataSource”的Spring管理對象的引用。

他可以幫助我們來依賴注入,那是不是我可以不去手動new一個對象呢,說來就來
 1     @Resource
 2     MobileWebService mobileWebService;
 3     
 4     
 5     @Resource
 6     UserWebService userWebService;
 7     
 8     
 9     
10     @Resource
11     HttpServletRequest request;
12     
13     public Object UserWebService(ModleForm form,HttpServletRequest req) throws Exception{
14         return returnMethodValue(form, req, UserWebService.class,userWebService);
15     }
16 
17     /**
18      * @Title: returnMethodValue
19      * @Description: TODO(通過json,獲取方法名,獲取接口數據)
20      * @param: @param form
21      * @param: @param req
22      * @param: @param clazz
23      * @param: @return
24      * @param: @throws Exception   
25      * @return: Object   
26      * @throws
27      */
28     public Object returnMethodValue(ModleForm form,HttpServletRequest req,Class<?> clazz,Object classObject) throws Exception{
29         JSONObject jsonObject = new JSONObject(form.getJson());
30         String action = (String) jsonObject.get("action");
31         String Method = (String) StringUtils.returnObjectByLength(StringUtils.toSpilt(action, "-"),1);
32         Method actionMethod = clazz.getMethod(Method,ModleForm.class,HttpServletRequest.class);
33         Object object = actionMethod.invoke(classObject, form , req);
34         return object;
35     }
36     
37     
38     public Map<String,Object> getMapByObject(Object object){
39         Map<String,Object> map = (Map<String, Object>) object;
40         return map;
41     }
42     
43     
44     @ResponseBody
45     @RequestMapping(value = "/mobile_user/entrance")
46     public String entrance() {
47         Object object = null;
48         String json = request.getParameter("json");
49         JSONObject jsonObject = new JSONObject(json);
50         ModleForm modleForm = new ModleForm();
51         modleForm.setJson(json);
52         Map<String,Object> map = new HashMap<String, Object>();
53         //驗證
54         boolean flag = Verification(json);
55         //返回錯誤碼
56         map = getErrorCode(flag,new ModleForm());
57         try {
58             String action = (String) jsonObject.get("action");
59             List<Object> list = StringUtils.toSpilt(action, "-");
60             String Modular = (String) StringUtils.returnObjectByLength(list,0);
61             
62             Method MobileMethod = MobileWebService.class.getMethod(Modular,ModleForm.class,HttpServletRequest.class);
63             object = MobileMethod.invoke(mobileWebService, modleForm , request);
64             map = getMapByObject(object);//轉成map
65         } catch (Exception e) {
66             // TODO Auto-generated catch block
67             e.printStackTrace();
68             map = this.returnErrorCode(new ModleForm().getComponentId()+"-1101", getMesssage(new ModleForm().getComponentId()+"-1101"));
69             return gsonUtils.toJson(map);
70         }
71         return gsonUtils.toJson(map);
72     }

這樣的話,我們的反射機制和依賴注入就完成了,所有的接口都通過這個入口

http://localhost:8080/xxx/mobile_user/entrance.bk?json={"action":"UserWebService-login","timestamp":"1452223478","gsonValue":"","appkey":"123","nonceStr":"06e2fe8b-1e33-4a80-bdc3-4055b1459388","signature":"3886041eb6336b6f190cc298fb83ce63","content":{"C_ACCOUNTNAME":"kate","C_PASSWORD":"1"}}
返回我想要的結果

這樣做的好處呢是:對應的,我的工作量就變小了,在入口處寫 接口日志,獲取session信息,返回錯誤碼,接口驗證我都能在一個地方完成,而不需要在每一個Controller對應的方法里面寫很多類似的代碼,我的方法中只需要寫相關邏輯

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM