Spring MVC 反射对象和依赖注入
本文内容纲要: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对应的方法里面写很多类似的代码,我的方法中只需要写相关逻辑
本文内容总结:Spring MVC 反射对象和依赖注入
原文链接:https://www.cnblogs.com/lcgblog/p/5131009.html
以上是 Spring MVC 反射对象和依赖注入 的全部内容, 来源链接: utcz.com/z/362628.html