皮皮网

【祭拜程序源码】【自助发卡源码大全】【农场系统app源码】springapi源码

2024-12-29 00:51:19 来源:网站自媒体源码

1.TDengine 资深研发整理:基于 SpringBoot 多语言实现 API 返回消息国际化
2.编程中为什么用spring?
3.spring的编写流程(spring流程编排)
4.spring api 返回后还能继续运行代码
5.API管理工具Swagger介绍及Springfox原理分析
6.求shop++的源代码

springapi源码

TDengine 资深研发整理:基于 SpringBoot 多语言实现 API 返回消息国际化

       SpringBoot,作为Java开发领域广受欢迎的技术框架,在构建Web应用程序和微服务方面发挥着重要作用。它通过简化开发流程、提供约定大于配置的原则以及集成常用库和组件,助力开发者高效构建应用程序。祭拜程序源码

       为了帮助开发者更好地掌握SpringBoot,我们整理了TDengine资深研发的内部分享——《SpringBoot 多语言支持方案》,供开发者参考。

       在项目依赖中引入spring-boot-starter和spring-boot-autoconfigure两个包,即可使用SpringBoot提供的多语言定义和解析工具。在spring-boot-autoconfigure的源码中,可以看到MessageSourceAutoConfiguration类已自动装配了MessageSource对象。

       在IDEA中,在resources资源包上右键新建资源包,填写资源包名如:messages,选择区域设置,包括en、zh_CN、zh_TC等选项。在resources包内即可看到绑定的自助发卡源码大全多语言文件。

       在配置文件中添加message,格式为:{ code}={ message}。在业务模块中使用多语言消息,首先分析API服务请求响应流程,包括身份认证、API接口鉴权认证、权限识别等,验证通过后进入业务逻辑,最后通过接口返回。

       异常国际化配置可以通过定义多语言message和获取LocaleMessageProvider实现。SpringBoot框架通过LocaleContextHolder.getLocale()获取Locale,并在RequestContextFilter中设置LocaleContext。

       客户端在请求中添加Accept-Language=zh-CN头,即可验证返回的结果。例如,登录出错时,客户端接收到的信息为国际化后的错误信息。

       以上就是基于SpringBoot多语言支持方案的完整分享,希望对开发者有所帮助。如有其他技术问题或时序数据处理难题,农场系统app源码可联系TDengine的技术研发人员进行沟通。

       TDengine是一款高性能、集群开源、云原生的时序数据库,专为物联网、工业互联网、电力、IT运维等场景设计。它具有内建的缓存、流式计算、数据订阅等系统功能,降低系统设计复杂度和研发运营成本。TDengine提供TDengine Enterprise和TDengine Cloud两个版本,用户可根据需求选择。

编程中为什么用spring?

       1、Spring能有效地组织你的中间层对象;

       2、Spring能消除在许多工程中常见的对Singleton的过多使用;

       3、 通过一种在不同应用程序和项目间一致的方法来处理配置文件,消除各种自定义格式的属性文件的需要,仅仅需要看看类的语音软件源码搭建JavaBean属性。Inversion of Control的使用帮助完成了这种简化;(使用的是type2的IoC)

       4、 能够很容易培养你面向接口而不是面向类的编程习惯。

       5、 Spring的设计会让使用它创建的应用尽可能少的依赖于它的APIs,在Spring应用中的大多数业务对象没有依赖于Spring。

       6、 使用Spring构建的应用程序易于单元测试;

       7、 Spring使EJB成为一个实现选择,而不是必需的选择。你可以用POJOs或local EJBs来实现业务接口,却不会影响到调用代码。

       8、 Spring提供一些web应用上的EJB的替代方案,比如用AOP提供声明性事务管理;

       9、 Spring为数据存取提供了一个一致的框架,不论是使用JDBC还是O/R mapping的产品(Hibernate,JDO)。

       、 也是个人体会最深的一点,它可以替代部分配置文件,java编辑视频源码甚至有效减少源代码的编写量。

       1)方便解耦,简化开发(高内聚、低耦合);

       Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理。

       2)AOP编程的支持;

       Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能,声明式事务的支持,只需要通过配置就可以完成对事务的管理,而无需手动编程。

       3)方便集成各种优秀框架;

       Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis等)的直接支持。

       4)降低JavaEE API的使用难度;

       Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。

spring的编写流程(spring流程编排)

       springmvc工作流程

       springmvc工作流程:

       1、用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。

       2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)。

       3、DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller。

       4、HandlerAdapter处理器适配器去执行Controller并得到ModelAndView(数据和视图),并层层返回给DispatcherServlet。

       5、DispatcherServlet将ModelAndView交给ViewReslover视图解析器解析,然后返回真正的视图。

       6、DispatcherServlet将模型数据填充到视图中。

       7、DispatcherServlet将结果响应给用户。

       组件说明:

       DispatcherServlet:前端控制器,也称为中央控制器,它是整个请求响应的控制中心,组件的调用由它统一调度。

       HandlerMapping:处理器映射器,它根据用户访问的URL映射到对应的后端处理器Handler。也就是说它知道处理用户请求的后端处理器,但是它并不执行后端处理器,而是将处理器告诉给中央处理器。

       HandlerAdapter:处理器适配器,它调用后端处理器中的方法,返回逻辑视图ModelAndView对象。

       ViewResolver:视图解析器,将ModelAndView逻辑视图解析为具体的视图(如JSP)。

       Handler:后端处理器,对用户具体请求进行处理,也就是我们编写的Controller类。

       spring工作流程

       写得太笼统了,不过,spring+hibernate得基本工作流是分层得.

       也许是:

       reg页面是前台表单录入视图,提交后到RegController控制器,然后其中又封装了User和Reg得vo对象,在RegController中调用UserDAOImpl和RegImpl执行数据得保存,UserDAO是接口,UserDAOImpl实现了此接口.UserDAOImpl和RegImpl使用hibernate能力进行ROM映射,保存对象到数据库.regsuccess是保存数据成功后得返回视图.

       spirngmvc需要配置控制器映射,将访问映射到控制器上,控制器调用dao或是services层得api执行业务逻辑,然后返回视图和模型对象给前置控制器,前置控制器根据返回得信息派发视图.

Spring启动流程(一)

       以java-config形式编写一个测试demo,新建一个AnnotationConfigApplicationContext,如果是XML形式使用ClassPathXmlApplicationContext;

       两者都继承了AbstractApplicationContext类,详细看下面的层次图。

       注意:在newAnnotationConfigApplicationContext()时如果未指定参数,会报运行时异常:org.springframework.context.annotation.AnnotationConfigApplicationContext@6ebca6hasnotbeenrefreshedyet

       AnnotationConfigApplicationContext的有参构造执行了3个方法,分别是自己的无参构造、register()、refresh();

       在描述前先从网上找了一个总体流程图方便了解一下大致流程,理清思路。

       在执行AnnotationConfigApplicationContext的无参构造方法前会调用父类GenericApplicationContext的无参构造方法;

       GenericApplicationContext中实例化一个DefaultListableBeanFactory,也就是说bean工厂实际上是应用上下文的一个属性;

       从上面的类层次图可以看到:应用上下文和bean工厂又同时实现了BeanFactory接口。

       前面讲到我们为了解IOC使用了Spring提供的AnnotationConfigApplicationContext作为入口展开,那Spring怎么对加了特定注解(如@Service、@Repository)的类进行读取转化成BeanDefinition对象呢?

       又如何对指定的包目录进行扫描查找bean对象呢?

       所以我们需要new一个注解配置读取器和一个路径扫描器。

       AnnotatedBeanDefinitionReader中执行了AnnotationConfigUtils中的registerAnnotationConfigProcessors(this.registry)方法,会向容器注册Sprign内置的处理器。

       registerAnnotationConfigProcessors方法中通过newRootBeanDefinition(XX.class)新建一个RootBeanDefinition(BeanDefinition的一个实现),然后调用registerPostProcessor将内置bean对应的BeanDefinition保存到bean工厂中;

       这里需要说明的是:我们刚刚一直在谈到注册bean,实际上就是将内置bean对应的beanDefinition保存到bean工厂中。那为什么要保存beanDefinition呢?因为Spring是跟据beanDefinition中对bean的描述,来实例化对象的,就算自己定义的bean也是要被解析成一个beanDefinition并注册的。

       其中最主要的组件便是ConfigurationClassPostProcessor和AutowiredAnnotationBeanPostProcessor,前者是一个beanFactory后置处理器,用来完成bean的扫描与注入工作,后者是一个bean后置处理器,用来完成@AutoWired自动注入。

       这个步骤主要是用来解析用户传入的Spring配置类,解析成一个BeanDefinition然后注册到容器中,主要源码如下:

       通过生成AnnotatedGenericBeanDefinition,然后解析给BeanDefinition的其他属性赋值,然后将BeanDefinition和beanName封装成一个BeanDefinitionHolder对象注册到bean工厂中(就是将beanName与baenDefinition封装到Map中,将beanName放到list中。Map与list都是bean工厂DefaultListableBeanFactory所维护的属性),和前面内置bean的注册相同。

       执行到这一步,register方法到此就结束了,通过断点观察BeanFactory中的beanDefinitionMap属性可以看出:this()和this.register(componentClasses)方法中就是将内置bean和我们传的配置bean的beanDefinition进行了注册,还没处理标记了@Component等注解的自定义bean。

spring api 返回后还能继续运行代码

可以通过nohup来实现关掉ssh连接后项目还是会在服务器上运行。

       è¾“入命令nohupjava-jar项目名.jar回车之后会显示进程号,这个进程号就是你的项目后台运行的进程号。nohup:不挂断的执行命令,忽略所有的挂断信号。运行后台命令最后加&在jar目录下会生成一个nohup.out文件,默认的log输出到这里了。下面的命令表示不挂断的后台启动demo.jar。

API管理工具Swagger介绍及Springfox原理分析

       Swagger,作为全球最受欢迎的API管理工具,提供了一整套全面的API管理解决方案,包括在线编辑器、UI展示界面和代码生成器等实用功能。

       在选择API管理工具时,Springfox是一个优秀的选择,它能自动解析Spring容器中Controller暴露的接口,并通过界面展示或调用。以下是一个使用Springfox的简单API展示界面示例。

       Springfox起源于swagger-springmvc,专为SpringMVC和Swagger的集成而设计。在SpringBoot项目中应用Springfox,通常需要以下步骤:配置完成后,通过访问'mons-lang-2.6

       commons-beanutils-1.9.2

       commons-collections-3.2.1

       commons-io-2.4

       commons-net-3.3

       commons-fileupload-1.3.1

       commons-codec-1.

       commons-email-1.3.3

       commons-compress-1.9

       junit-4.

       .biboheart.demos.api,这个包里放置API接口的RestController

       åœ¨com.biboheart.demos.api包中创建一个class:ParamController。这章的示例都在这个类中进行。

       è·¯å¾„中包含参数,这种情况适合与传递一个不能为空值的参数。比如有些应用中,查询某个企业的数据,必须包含企业的编号,就可以在地址里接收这个编号。

       åœ¨ParamController中增加一个函数PathParam

       è·¯å¾„中的参数通过{ sn}接收值。

       ä½¿ç”¨åç§°æŽ¥æ”¶å‚数比较直观,我用得比较多。不用注解。跟客户端传的参数同名就可以接收到。如下例子中的reqParam

       ä¹Ÿå¯ä»¥ç”¨get传参

       ä¸Šé¢ç”¨å‚数名称接收值,只要与请求时的名称一致就能接收到参数值。如果需要传递的参数比较多的时候,就不适合一个一个参数写在函数里了,那样很不方便,也容易出错。可以把这些参数写到一个对象里接收。如下例子

       åˆ›å»ºä¸€ä¸ªpackage:com.biboheart.demos.model,创建一个类Person

       ç”¨Person对象接收参数

       è™½ç„¶è¿™æ ·çš„方式也能接收get传参,但是因为需要传的参数多了,用get显得不太方便。这里就不测试GET方式请求了。

       æœ‰çš„时候,需要接收JSON传参。比如某些服务的调用需要开发一个回调函数接收对方的回调并获得参数值为结果,对方回调回来的值是JSON格式的值,这时候就需要接收JSON传参数了。用RequestBody可以接收到JSON传值。

       éœ€è¦JSON请求才能正确接到值

       SpringBoot实例:医院统一信息平台(apigateway)

       å‰é¢å·²ç»åœ¨å¹³å°ä¸­ä½¿ç”¨äº†springcloud。每个小的服务中各自实现相关业务,提供API。这些服务的访问地址都可能不一样。这样给使用都造成困扰,而且服务器接口管理也复杂了。

       api-gateway就是把这些api通过一个服务提供出去。在这个服务中代理其它服务的API。对于服务的使用都就像是访问一台服务器。

       è¿™é‡Œç”¨springzuul实现api-gateway。

       åˆ›å»ºä¸€ä¸ªé¡¹ç›®ï¼ˆæœåŠ¡ï¼‰ï¼Œä¸“门做api代理。服务名称huip-router。

       pom

       RouterApplication

       ä¸ºäº†æ”¯æŒè·¨åŸŸï¼Œå¢žåŠ ä¸€ä¸ªFilter

       é…ç½®

       åœ¨API请求开头为/huipuser/时访问的是user服务的API,如果开头/huippatient/时访问的是patient服务的API。比如请求相当于

       è¯·æ±‚测试。

       SpringBoot实例:医院统一信息平台(服务间通讯)的访问流程改成用代理。

基于SpringBoot的API测试

       äº’联网产品的测试策略现在很多都会存在API测试、轻量级GUI测试、轻量级单元测试等。API测试其实我们一开始想得最多的图形化工具应该是postman、jmeter等。如果使用最简单的get方法,还可以直接通过使用CURL命令(即命令行工具cURL)。

       ä¸ç®¡ä½¿ç”¨ä»€ä¹ˆAPI测试工具,API测试的基本步骤大体一致:

       1.准备测试数据

       2.通过API测试工具,发起对被测API的request

       3.验证返回结果的response

       æˆ‘们平时在工作中,接触得最多的是用JAVA框架Springboot框架开发的简单的RestfulAPI。

       Springboot建议的目录结果如下:rootpackage结构-com.example.myproject

瞧瞧人家用SpringBoot写的后端API接口,那叫一个优雅

       å‡è®¾å®žçŽ°ä¸€ä¸ªæ³¨å†Œç”¨æˆ·çš„功能,在controller层,他会先进行校验参数,如下:

       ä»¥ä¸Šä»£ç æœ‰ä»€ä¹ˆé—®é¢˜å˜›ï¼Ÿå…¶å®žæ²¡ä»€ä¹ˆé—®é¢˜ï¼Œå°±æ˜¯æ ¡éªŒæœ‰ç‚¹è¾£çœ¼ç›ã€‚正常的添加用户业务还没写,参数校验就一大堆啦。假设后来,又接了一个需求:编辑用户信息。实现编辑用户信息前,也是先校验信息,如下:

       æˆ‘们可以使用注解的方式,来进行参数校验,这样代码更加简洁,也方便统一管理。实际上,springboot有个validation的组件,我们可以拿来即用。引入这个包即可:

       å¼•å…¥åŒ…后,参数校验就非常简洁啦,如下:

       ç„¶åŽåœ¨UserParam参数对象中,加入@Validated注解哈,把错误信息接收到BindingResult对象,代码如下:

       å¦‚果你在你们项目代码中,看到controller层报文返回结果,有这样的:

       ä¹Ÿæœ‰è¿™æ ·çš„:

       æ˜¾ç„¶ï¼Œå¦‚果接口返回结果不统一,前端处理就不方便,我们代码也不好维护。再比如有的人喜欢用Result处理结果,有点人喜欢用Response处理结果,可以想象一下,这些代码有多乱。

       æ‰€ä»¥ä½œä¸ºåŽç«¯å¼€å‘,我们项目的响应结果,需要统一标准的返回格式。一般一个标准的响应报文对象,都有哪些属性呢?

       å“åº”状态码一般用枚举表示哈:

       å› ä¸ºè¿”回的数据类型不是确定的,我们可以使用泛型,如下:

       æœ‰äº†ç»Ÿä¸€çš„响应体,我们就可以优化一下controller层的代码啦:

       æ—¥å¸¸å¼€å‘中,我们一般都是自定义统一的异常类,如下:

       åœ¨controller层,很可能会有类似代码:

       è¿™å—代码,没什么问题哈,但是如果try...catch太多,不是很优雅。

       å¯ä»¥å€ŸåŠ©æ³¨è§£@RestControllerAdvice,让代码更优雅。@RestControllerAdvice是一个应用于Controller层的切面注解,它一般配合@ExceptionHandler注解一起使用,作为项目的全局异常处理。我们来看下demo代码哈。

       è¿˜æ˜¯åŽŸæ¥çš„UserController,和一个会抛出异常的userService的方法,如下:

       æˆ‘们再定义一个全局异常处理器,用@RestControllerAdvice注解,如下:

       æˆ‘们有想要拦截的异常类型,比如想拦截BizException类型,就新增一个方法,使用@ExceptionHandler注解修饰,如下:

SpringBoot2基于Swagger2生成离线Api文档

       Github:

       Gitee:

       ä¸ªäººè§‰å¾—旧版的配置简单许多,新版的配置按照官方demo的配置来做还是复杂了很多

       é…ç½®åˆ°Springboot项目中以后,在项目打包的时候便会通过单元测试在指定的目录生成被官方称为staticdocs的离线文档

       è¯¥ç¯‡åšæ–‡å¼•ç”¨çš„依赖都要引入,SpringRestDocs的依赖spring-restdocs-mockmvc,离线文档的依赖springfox-staticdocs,因为要在单元测试的时候生成文档,所以需要再加测试相关的spring-boot-starter-test。

       asciidoctor-maven-plugin插件会把Asciidoc格式文件转成HTML5格式输出。

       è¿™ä¸ªç±»åŒ…含两个方法,TestApi()是用来生成例子,test()用来生成Asciidoc的文档。生成例子用到了spring-restdocs-mockmvc,每一个API都要进行单元测试才能生成相应的文档片段(snippets),生成的结果如图:

       ç”Ÿæˆå®Œæ•´çš„Asciidoc文档用到了Swagger2MarkupConverter,第一步先获取在线版本的文档并保存到文件swagger.json中,第二步把swagger.json和之前的例子snippets整合并保存为Asciidoc格式的完整文档。生成结果如图:

       é€šè¿‡é…ç½®ç±»å®šä¹‰ä¸€äº›æ–‡æ¡£ç›¸å…³çš„信息

       è·¯å¾„:项目名/docs/asciidoc/index.adoc

       åˆ©ç”¨å‰é¢é…ç½®çš„maven插件,只需要执行打包就可以生成相应的文档,如图:

       è¯¥ç¯‡åšæ–‡å¼•ç”¨çš„依赖都要引入,SpringRestDocs的依赖spring-restdocs-mockmvc,离线文档的依赖springfox-staticdocs,因为要在单元测试的时候生成文档,所以需要再加测试相关的spring-boot-starter-test。

       asciidoctor-maven-plugin插件会把Asciidoc格式文件转成HTML5格式输出。

       è¿™ä¸ªç±»åŒ…含两个方法,TestApi()是用来生成例子,createSpringfoxSwaggerJson()用来生成Asciidoc的文档。生成例子用到了spring-restdocs-mockmvc,每一个API都要进行单元测试才能生成相应的文档片段(snippets),生成的结果如图:

       ç”Ÿæˆå®Œæ•´çš„Asciidoc文档用到了Swagger2MarkupConverter,第一步先获取在线版本的文档并保存到文件swagger.json中,第二步把swagger.json和之前的例子snippets整合并保存为Asciidoc格式的完整文档。生成结果如图:

       é€šè¿‡é…ç½®ç±»å®šä¹‰ä¸€äº›æ–‡æ¡£ç›¸å…³çš„信息

       åœ¨resources目录下创建一个名为logback.xml的配置文件,使用LogstashEncoder作为DefaultLogEncoder

       è·¯å¾„:项目名src/docs/asciidoc/index.adoc

       åˆ©ç”¨å‰é¢é…ç½®çš„maven插件,只需要执行打包就可以生成相应的文档,如图: