利用Spring扫描机制,实现服务的注册(二)

git仓库地址:服务注册

前言

上一篇文章利用Spring扫描机制,实现服务的注册(一)完成主要类的介绍,那么这一篇博客用于介绍该注册方式的具体使用和一些其他相关知识的补充。

使用方法

  1. 业务成和持久层还是按照我们正常的开发流程走即可。
  2. 在需要注册的业务类进行注册到对应的Controller类即可完成。

代码实例

我这里使用了RealAuthController和RealAuthService进行模拟开发中对应的实例,而且为了考虑项目的扩展性,也将业务开始前环境的判断和业务处理后对业务处理结果进行了打印,可以满足不同项目的其他需求。

  • RealAuthController
@RestController
@AutoDispatch(serviceInterface= {RealAuthService.class})
@RequestMapping("demo")
public class RealAuthController extends WelcomeController {

    @RequestMapping(value="/{functionName:[a-zA-Z-]+}Auto", method= RequestMethod.POST)
    public @ResponseBody
    Object dipatch(HttpServletRequest request, HttpServletResponse response, @PathVariable("functionName") String name, @RequestBody Map<String, Object> model) {
        return autoDispatch(request, response, name, model);
    }
    @RequestMapping(value="/{functionName:[a-zA-Z-]+}Auto", method=RequestMethod.GET)
    public @ResponseBody Object dipatch2(HttpServletRequest request, HttpServletResponse response, @PathVariable("functionName") String name, @RequestParam Map<String, Object> model) {
        return autoDispatch(request, response, name, model);
    }

}
  • RealAuthService
@Service
public class RealAuthService {

    // 测试方法
    public List getList() {
        return Arrays.asList(1, 2, 3, 4);
    }

    // 测试方法前
    public ResultVo pregetList() {
        System.err.println("准备开始-----");
        return new ResultVo("准备好了");
    }

    // 测试方法后
    public ResultVo postgetList(List list) {
        System.err.println(list);
        System.err.println("打扫现场-----");
        return new ResultVo("执行完毕");
    }

}
  • ApplicationConfig类,要在启动类里面声明metaDataManager扫描的包是controller包
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class,args);
    }

    @Bean
    MetaDataManager metaDataManager() {
        return new MetaDataManager(new String[] {"com.aaa.demo.controller"});
    }
}
  • 上文漏掉了一个获取Spring管理的bean对象的工具类
@Component
public class ServiceLocator implements ApplicationContextAware {

    private static ApplicationContext applicationContext = null;

    @Override
    // 获取ApplicationContext对象
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ServiceLocator.applicationContext = applicationContext;
    }

    /**
     * @Title: getBeanByName
     * @Description: 通过bean的名字来获取Spring容器中的bean
     * @param beanName
     * @return: Object
     */
    public static Object getBeanByName(String beanName) {
        if (applicationContext == null){
            return null;
        }
        return applicationContext.getBean(beanName);
    }

    public static <T> T getBean(Class<T> type) {
        return applicationContext.getBean(type);
    }
}

流程和注意点

  • 流程
    根据自己配的端口:访问/demo/getListAuto即可获取到返回的json对象:
    [1,2,3,4]
    控制台会打印出,业务开始前的检查和业务结束后的操作:
准备开始-----
[1, 2, 3, 4]
打扫现场-----
  • 注意点
    1.get请求的问题,下面三行代码多余
    WelcomeController里面的方法有这么一行代码:
if(request.getMethod().equalsIgnoreCase("GET")) {
        //model = request.getParameterMap();
 }

这是之前公司项目上线的的代码,后来我发现get请求跑不通,后来认识学习了@RequestParam 注解后,知道该注解是将get请求和正常的表单请求的数据自动封装成了map对象,所以会出问题,而被我注释掉的代码,他会将参数封装成数组,所以会一直报错,最终我反而一不小心帮忙优化了一下,之前由于公司的请求都是post请求,开发人员用postman也是用post进行测试,所以一直也没有人发现这个问题。
2.随着项目一步一步变得庞大,内存可能会不够,只需要修改一下jvm的参数即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,977评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,067评论 19 139
  • 喜悦之旅基础意识工作坊中的语录 ——魏君学习非暴力沟通心得 如果我们对“对方”有一个“理想的形象”(多半会有),并...
    魏君NVC阅读 488评论 0 1
  • 今天是这个栏目的第一天。以后的每一天我都会跟大家分享一个小幸福。繁重的生活,脆弱的你可以感受到一点温暖和舒心。 #...
    Amy_dandan阅读 256评论 0 0
  • (弘玥)小云向大家拜年了~
    弘玥阅读 169评论 4 2