最近项目中发现一个好玩的事情:本地调试时,返回的date是日期格式yyyy-MM-dd HH:mm:ss,但发布到服务器后就变为Long型的时间戳了

最后查到的原因很简单,因为发布服务器启动时的脚本加下如下的参数,而本地没有加

java -Djava.security.egd=file:/dev/urandom -Dspring.jackson.serialization.write-dates-as-timestamps=true -jar -Xms2048m -Xmx2048m xxx.jar

就是因为加了这个spring参数,才会使date类型都转变为Long型(除了代码中加如下注解的Date型)

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public Date getCreateDate() {
  return createDate;
}

当然,本地如果也想返回Long型时间戳,可以在yml中加上如下配置

spring.jackson.serialization.write-dates-as-timestamps: true

但在调查过程中顺便把Spring的一些地方给了解了一遍,总结如下几点

1. 有关注解

比如@RestController

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController { /**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any
* @since 4.0.1
*/
String value() default ""; }

回顾下这些常用的注解

1)元注解

@Document:是否编入Javadoc
@Target:使用范围(TYPE、FIELD、METHOD、PARAMETER、CONSTRUCTOR、PACKAGE等)
@Retention:保留范围(SOURCE、CLASS、RUNTIME)
@Inherited:子类继承父类的注解

2)常用注解

1. @Autowired和@Qualifier:后者可以根据名称寻找依赖(常用于对同class的多个bean)
2. 别称:类似@Controller、@Service实质都是Component
3. @RestController = Controller + ResponseBody
4. @Transactional(事务控制的注解,很重要)

于是因为@Transactional想顺便研究下Spring的事务机制...

2. Spring事务

比如@Transactional,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,根据@Transactional 的属性配置信息,这个代理对象决定该声明@Transactional 的目标方法是否由拦截器 TransactionInterceptor 来使用拦截,在 TransactionInterceptor 拦截时,会在在目标方法开始执行之前创建并加入事务,并执行目标方法的逻辑, 最后根据执行情况是否出现异常,利用抽象事务管理器(图 2 有相关介绍)AbstractPlatformTransactionManager 操作数据源 DataSource 提交或回滚事务, 如下图所示。

这里涉及到的Spring抽象事务管理器AbstractPlatformTransactionManager,实现的是如下接口

public interface PlatformTransactionManager {

    TransactionStatus getTransaction(
TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException;
}

具体底层处理依赖于AbstractPlatformTransactionManager的实现,比如DataSourceTransactionManager管理JDBC的Connection,这些类的关系如下

@Transactional的使用

  • 属性propagation的使用(通常被称为事务的传播,我认为叫做嵌套事务管理更好) 需要注意下面三种 propagation 可以不启动事务。本来期望目标方法进行事务管理,但若是错误的配置这三种 propagation,事务将不会发生回滚。
    TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

    TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。

    TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

    其他选项:
    TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
    TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
    TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

  • 属性rollbackFor
    默认情况出现RuntimeException或者Error才回滚,如果需要定制,则使用rollbackFor(这种情况,如果是自定义异常的父类也会回滚)
  • 属性timeout:如果超过时间未提交成功,则回滚
  • 属性readonly:只读事务(读取期间不会看到中途中其它事务的提交-可重复读)
  • 只有在public方法才有用
  • 自调用问题可以用AspectJ配置解决

当然,因为这么好用的注解实现又依赖于Spring的AOP,继续...

3. Spring 的AOP

简介如下

AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。
AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类,

静态代理

静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强
实现方法:AspectJ框架
示例

动态代理

动态代理则在运行时借助于 JDK 动态代理、CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。
运行时生成目标类的代理类,该代理类要么与目标类实现相同的接口,要么是目标类的子类
方法
1. AspectJ Annotation,但底层依然是Spring AOP,比如@Aspect
2. 使用CGLIB生成代理类 Enhancer
3. JDK的动态代理(InvocationHandler)

Spring AOP 代理有 CglibAopProxy 和 JdkDynamicAopProxy 两种

参考:

https://www.jianshu.com/p/e9329c8a59c2

Spring事务:

https://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html

https://www.ibm.com/developerworks/cn/java/j-master-spring-transactional-use/index.html

Spring的AOP

https://www.ibm.com/developerworks/cn/java/j-lo-springaopcglib/index.html

JDK的动态代理

https://www.jianshu.com/p/269afd0a52e6

为什么@RestController返回的Date类型是Long型的更多相关文章

  1. 使用js处理后台返回的Date类型的数据

    从后台返回的日期类型的数据,如果直接在前端进行显示的话,显示的就是一个从 1970-01-01 00:00:00到现在所经过的毫秒数,而在大多数业务中都不可能显示这个毫秒数,大多数都是显示一个正常的日 ...

  2. springMVC返回json数据时date类型数据被转成long类型

    在项目的过程中肯定会遇到ajax请求,但是再用的过程中会发现,在数据库中好好的时间类型数据:2017-05-04 17:52:24 在转json的时候,得到的就不是时间格式了 而是145245121这 ...

  3. SpringMVC返回Json,自定义Json中Date类型格式

    http://www.cnblogs.com/jsczljh/p/3654636.html —————————————————————————————————————————————————————— ...

  4. 后台date类型转换为json字符串时,返回前台页面的是long类型的时间戳问题解决

    学习springboot框架,写个博客系统,在后台管理的日志管理中,遇到了后台查询的日期格式的结果返回到页面变成了日期的时间戳了.然后摸索了三种方法来解决.页面的显示问题如下图. 问题页面回顾: 本案 ...

  5. java 中的SimpleDateFormat、Date函数以及字符串和Date类型互转

    SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类.它允许进行格式化(日期 -> 文本).解析(文本 -> 日期)和规范化. SimpleDateFor ...

  6. Date类型,Boolean类型,Number类型

    1.Date类型:  1)创建Date对象:    var date=new Date();  //Date对象会把当前日期和时间保存为其初始值 2)Date对象的方法:    --这些得到的都是数字 ...

  7. JS中String类型转换Date类型 并 计算时间差

    JS中String类型转换Date类型 1.比较常用的方法,但繁琐,参考如下:主要使用Date的构造方法:Date(int year , int month , int day)<script& ...

  8. Oracle 日期类型timestamp(时间戳)和date类型使用

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  9. ORACLE中date类型字段的处理

    (1)在英文版本的ORACLE中默认日期格式为'DD-MON-YY',例如'01-JAN-98' 在汉化的中文版本中ORACLE默认日期格式为'日-月-年',例如'21-8月-2003'或'21-8月 ...

随机推荐

  1. 现金贷平台下载量TOP100 涉逾30家P2P

    一.什么是现金贷,现状如何 那么什么是现金贷呢?在笔者看来,狭义的现金贷主要是指基于互联网等技术手段的小额现金贷款,广义的现金贷可以包括任何以小额现金和存款为标的进行借贷的行为,是一种无担保.无抵押. ...

  2. Astyle 快速入门,常用指令

    --style=java -n -p -c !E astyle是一个命令行工具,命令语法很简单:          astyle [options] < original > Beauti ...

  3. selenium基础(窗口截图)

    窗口截图 目的:当脚本执行出错时对当前窗口进行截图 方法:get_screenshot_as_file() #打开百度首页,搜索“selenium",完成后进行截图,并将结果保存至D:/te ...

  4. wpf 获取image控件的图片并保存

    XMAL代码如下: <Image Name="ImageToSave" Source="Images/pic_bg.png" Grid.RowSpan=& ...

  5. Hadoop2.7.1配置NameNode+ResourceManager高可用原理分析

    关于NameNode高可靠需要配置的文件有core-site.xml和hdfs-site.xml 关于ResourceManager高可靠需要配置的文件有yarn-site.xml 逻辑结构: Nam ...

  6. 分析Hive表和分区的统计信息(Statistics)

    类似于Oracle的分析表,Hive中也提供了分析表和分区的功能,通过自动和手动分析Hive表,将Hive表的一些统计信息存储到元数据中. 表和分区的统计信息主要包括:行数.文件数.原始数据大小.所占 ...

  7. 用星星画菱形--Java

    用星星画菱形 public class Hello{ public static void main(String[] args) { char star = '\u2605'; System.out ...

  8. HNOI2018思记

    4-13 顺顺利利到了湖南.晚上认真研读cf毒瘤题题解,未果. 发现这里含铁丰富的高温多雨式红土地.以及窗户特别深,总有一圈小阳台的房子,门楣深邃如瞳. 看了一波miaom的ZJOI游记,思考了一下解 ...

  9. ODOO/OPENERP的网页模块QWEB简述

    1.web 模块 注意,OpenERP 模块中 web 部分用到的所有文件必须被放置在模块内的 static 文件夹里.这是强制性的,出于安全考虑. 事实上,我们创建的文件夹 CSS,JS 和 XML ...

  10. Django 操作Cookie与Session

    目录 Cookie Session Django中操作Cookie 基本操作 基于cookie的登录装饰器 Django中操作Session 基本操作 Session流程解析 基于session的登录 ...