Spring MVC Servlet 3.0+ 异步方法实现服务端的消息推送
Servlet 3.0+ 异步方法实现服务端消息推送是通过使用定时任务,定时的让控制器从另外一个线程返回一个DeferedResult
并推送给客户端。而更新DeferedResult
是在使用@Scheduled
定时任务注解的方法里执行的。
Spring MVC Servlet 3.0+ 异步方法实现服务端的消息推送
Servlet 3.0+ 异步方法实现服务端消息推送是通过使用定时任务,定时的让控制器从另外一个线程返回一个DeferedResult
并推送给客户端。而更新DeferedResult
是在使用@Scheduled
定时任务注解的方法里执行的。
Web 项目中,浏览器与服务器是通过请求和响应来实现功能功能交互的,当服务端出现新的信息需要让前端知道时,就需要用到服务器推送技术。
服务端推送技术有基于SSE
(Server Send Event 服务端发送事件)的服务器端推送,该方式需要浏览器支持,而目前主流浏览器最近版本基本都支持;基于Servlet 3.0+
的异步方法特性;WebSocket
双向通信技术。
Spring MVC 注解之 @ControllerAdvice 实现全局异常处理
通常会在 @Controller
注解作用的类的方法上使用@ExceptionHandler,@ModelAttribute,@InitBinder
来处理异常或初始化绑定,这三个注解对所用使用了 @RequestMapping
注解的控制器内的方法有效。
如果希望此类方法在全局范围内(跨控制器)应用,则可以在带有 @ControllerAdvice
或 @RestControllerAdvice
注解的类中声明它们这三个注解。
@ControllerAdvice
用于声明一个 控制器 建言,作用在类上,可以将控制器的全局配置统一放置在该注解作用的类里,结合在方法上使用 @ExceptionHandler
注解,就能实现全局的异常控制。
Maven 管理的项目,在src/main/resources
下新建logback.xml
文件。
Log4j2配置:log4j2.xml
文件示例配置; Log4j2 官方文档,
将日志请求插入应用程序代码需要相当大的计划和精力。观察表明,大约4%的代码用于日志记录。因此,即使是中等规模的应用程序,它们的代码中也会嵌入数千个日志语句。考虑到它们的数量,必须管理这些日志语句,而无需手动修改它们。
Log4j 2的配置可以通过以下四种方式之一完成:
错误:java.lang.ClassNotFoundException-javax.el.ELManager
Maven 项目,pom.xml
文件装配的是 tomcat7-maven-plugin
插件,但项目中使用了Servlet 3.0
的特性。此情况下如果项目使用Maven跑,则会报错:java.lang.ClassNotFoundException: javax.el.ELManager
。
而javax.el.ELManager
这个包在Tomcat的lib
库里是存在的,真实的报错原因是Tomcat 7里的该包的版本低了,满足不了项目里对Servlet 3.0
特性的支持。而Servlet 3.0 +
至少需要Tomcat 8
或更高的版本才能支持。
解决:因到目前为止没有Tomcat 8的Maven插件,所在需要在pom.xml
里添加更高版本的依赖:
1 | <dependency> |
JSR 303是 Java 为Bean数据合法性校验提供的一个标准规范,叫做Bean Validation
,随JavaEE 6
发布。官方参考实现是Hibernate Validator
。
Bean Validation为Java Bean定义了相应的数据类型和API,在应用中通过在Bean
属性上标注类似于@NotNull, @Max
等标准的注解指定校验规则,并通过验证接口对 Bean 进行验证。
该校验框架是一个运行时框架,在验证之后验证的错误信息被马上返回;核心接口是javax.validation.Validator
,该接口根据目标对象类中所标注的校验注解进和地数据校验,并得到校验结果。
该标准目标有两个实现:Hibernate Validator
和Apache bval
,使用较多的是前者。
JSR 303官方标准:https://jcp.org/en/jsr/detail?id=303
反射(Reflection
)是 Java 中的一种工具,即运行态的 Java
程序可获取任意一个对象的信息,并且可以操作类或对象的内部属性(类型、属性、方法)。
程序中一般的对象的类型都是在编译期就确定下来的,而Java反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。
反射的核心是JVM
在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。反射是相对常规的通过new
来创建对象方式的反操作的称呼。
实际上,只有当程序需要动态创建某个类的对象时才会考虑使用反射,通常在开发通用性比较广的框架、基础平台时可能会大量使用反射。
使用 Spring 框架,在定义 Bean 时,通常不指定其作用范围而使用默认的配置,可能会对 Spring Bean 的作用范围不甚了解。Spring 给 Bean 定义的作用范围提供了灵活的配置,开箱即用,Spring Framework 支持 六个作用范围,其中四个范围只有在使用支持 Web 的 ApplicationContext时才能使用,还提供了自定义作用范围。
查看了下 Spring 5.0.9 Release 版本关于 Spring Bean scopes章节内容,在此做个记录,至于是否和其它版本有区别暂未对比。
链式编程可以点点点出属性,通过返回对象本身(this
)可以调用本身的属性。
一般在创建对象并给属性赋值时使用。
这种方式使用会越来越多,很多Apache工具如HttpClient里给RequestConfig
赋值,JDK里面有些类或方法也使用,如:StringBuffer
的 append()
方法。