一个controller调用根据不同业务分发不同service

一个controller调用根据不同业务分发不同service在一个项目中需要写很多的 controller 去调用不同的 service 而写一个网关可以省去写 controller 层的痛苦

大家好,欢迎来到IT知识分享网。

 

在一个项目中需要写很多的controller去调用不同的service,而写一个网关可以省去写controller层的痛苦。

下面开始介绍可以分发不同service。

1.因为service在项目启动时就已全部注入到spring容器中,所以我们需要写一个工具类,可以从spring上下文(applicationContext)中获取到对应service

@Component public class SpringUtil implements ApplicationContextAware { @Autowired private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if (SpringUtil.applicationContext == null) { SpringUtil.applicationContext = applicationContext; } System.out.println("========ApplicationContext配置成功,在普通类可以通过调用SpringUtil.getAppContext()获取applicationContext对象,applicationContext=" + SpringUtil.applicationContext + "========"); } //获取applicationContext public static ApplicationContext getApplicationContext() { return applicationContext; } //通过name获取 Bean. public static Object getBean(String name) { return getApplicationContext().getBean(name); } //通过class获取Bean. public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); } //通过name,以及Clazz返回指定的Bean public static <T> T getBean(String name, Class<T> clazz) { return getApplicationContext().getBean(name, clazz); } } 

2.上面的SpringUtil我们已经可以在上下文中直接取到对于的service了,下面就开始编写controller进行请求的分发(我称之为网关)。首先我们需要先写一个抽象类,来定义service,这样接下来的sevice只需要继承这个抽象类即可(我们还可以写一些时间统计,交易流水入库等。。自我感觉很大的用处)。

public abstract class RootService { private Logger logger = LoggerFactory.getLogger(RootService.class); private long beforeTime; private long endTime; private void before (String action) { beforeTime = System.currentTimeMillis(); logger.info("交易:" + action + "开始时间:" + beforeTime); } private void end (String action) { endTime = System.currentTimeMillis(); long time = endTime - beforeTime; logger.info("交易:" + action + "结束时间:" + endTime); logger.info("交易:" + action + "耗时:" + time); } public JSONObject execute(String actionName,Map map) { before(actionName); JSONObject jsonObject = doNext(map); end(actionName); return jsonObject; } private JSONObject doNext(Map map) { try { return doAction(map); } catch (Exception e) { e.printStackTrace(); JSONObject js = new JSONObject(); js.put("retCode","000000"); js.put("retMsg","程序报错"); return js; } } protected abstract JSONObject doAction(Map map); } 

3.一切准备就绪,我们可以开始编写contrconoller了(网关) 

@Controller @RequestMapping("/root") public class RootController { @ResponseBody @RequestMapping(value = "/h5.do",produces = {"application/json;charset=UTF-8"},method = RequestMethod.POST) public JSONObject root(@RequestBody Map<String,Object> map, HttpServletRequest httpServletRequest){ String service = (String) map.get("service"); JSONObject js = new JSONObject(); RootService rootService = (RootService) SpringUtil.getBean(service); return rootService.execute(service,map); } } 

到这里一个网关就写好了,然后我们写一个service进行测试一下(对应的Dao层我就不现丑了,相信大家都会)

/ 这里的service最好使用别名来 */ @Service("userServiceImpl ") public class UserServiceImpl extends RootService{ private Logger logger = LoggerFactory.getLogger(UserService.class); @Autowired private UserDao userDao; @Override protected JSONObject doAction(Map map) { JSONObject js = new JSONObject(); String id = (String) map.get("id"); User user = userDao.getUser(id); js.put("user",user); logger.info("进入了UserService"); return js; } } 

下面我们用postman测试一下测试报文为:

{   "id":"1",   "service":"userServiceImpl" }
2019-10-18 17:24:41.089  INFO 6452 --- [nio-8080-exec-2] c.s.s.service.util.RootService           : 交易:userService开始时间:89 2019-10-18 17:24:41.138  INFO 6452 --- [nio-8080-exec-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting... 2019-10-18 17:24:41.227  INFO 6452 --- [nio-8080-exec-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed. 2019-10-18 17:24:41.255  INFO 6452 --- [nio-8080-exec-2] c.s.s.service.impl.UserService           : 进入了UserService 2019-10-18 17:24:41.256  INFO 6452 --- [nio-8080-exec-2] c.s.s.service.util.RootService           : 交易:userService结束时间:56 2019-10-18 17:24:41.256  INFO 6452 --- [nio-8080-exec-2] c.s.s.service.util.RootService           : 交易:userService耗时:167 

返回为:

{   "user": {     "user_id": "1",     "password": "",     "user_name": "张三"   } }

以上为我的一些拙见

我抄袭这位的:一个controller调用根据不同业务分发不同service

完整代码见:https://download.csdn.net/download/_/

我自己通过注解实现的比上面这位作者简单一个controller调用根据不同业务分发不同service

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/158600.html

(0)
上一篇 2025-01-19 15:05
下一篇 2025-01-19 15:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信