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

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

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

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

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

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

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

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

1. 有关注解

比如@RestController

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Controller
  5. @ResponseBody
  6. public @interface RestController {
  7.  
  8. /**
  9. * The value may indicate a suggestion for a logical component name,
  10. * to be turned into a Spring bean in case of an autodetected component.
  11. * @return the suggested component name, if any
  12. * @since 4.0.1
  13. */
  14. String value() default "";
  15.  
  16. }

回顾下这些常用的注解

1)元注解

  1. @Document:是否编入Javadoc
  2. @Target:使用范围(TYPEFIELDMETHODPARAMETERCONSTRUCTORPACKAGE等)
  3. @Retention:保留范围(SOURCECLASSRUNTIME
  4. @Inherited:子类继承父类的注解

2)常用注解

  1. 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,实现的是如下接口

  1. public interface PlatformTransactionManager {
  2.  
  3. TransactionStatus getTransaction(
  4. TransactionDefinition definition) throws TransactionException;
  5.  
  6. void commit(TransactionStatus status) throws TransactionException;
  7.  
  8. void rollback(TransactionStatus status) throws TransactionException;
  9. }

具体底层处理依赖于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

简介如下

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

静态代理

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

动态代理

  1. 动态代理则在运行时借助于 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. day 68 Django基础四之模板系统

      Django基础四之模板系统   本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法   模板渲染的官方文档 关 ...

  2. PAT甲级——A1114 Family Property【25】

    This time, you are supposed to help us collect the data for family-owned property. Given each person ...

  3. JDK1.8中文CHM下载 -- java开发搬运工

    网上一番查找后,发现csdn有,但是要收费,之后从某地找到热心网友的分享,现贡献给大家! 不啰嗦,直接上货! 链接:https://pan.baidu.com/s/1b6Wg7LiUZsFSYGsvR ...

  4. mac系统升级导致无法在iOS设备中运行Safari Web 调试器

    macOS系统升级之后,可能会导致Safari开发选项中没有iOS设备,进而无法运行Safari Web 调试器. 此问题的解决办法: 请转到设置>常规>重置>重置位置和隐私.现在, ...

  5. matlab-使用技巧

    sel(1:100); 1 2 3 4 5 ...100 X(sel, :); 1.......2.......3.......4.......5..........100...... nn_para ...

  6. Mapped Statements collection does not contain value for xxx.xxx 错误原因&解决方案

    先贴出详细的报错信息 2019-11-05 10:10:00 [executor-1] ERROR [org.quartz.core.JobRunShell:225] - Job DEFAULT.ef ...

  7. U-BOOT 命令的介绍

    U­BOOT 常用命令 通常使用 help(或者只使用问号?),来查看所有的 U­BOOT 命令.将会列出在当前配置下所有支持的命令. 但是我们要注意,尽管 U­BOOT 提供了很多配置选项,并不是所 ...

  8. CNN网络中的不变性理解

    神经网络中的不变性 原文:https://blog.csdn.net/voxel_grid/article/details/79275637     个人认为cnn中conv层对应的是“等变性”(Eq ...

  9. layui实现批量导入excal表

    layui实现多文件上传,并直接选中需要上传文件的类型 //拖拽上传 upload.render({ elem : '#import', size: , //限制文件大小,单位 KB accept: ...

  10. signed main()

    主函数由int main()改成signed main() 好处:把int改成long long 的时候不用单独把它改成int了,懂的人都懂(滑稽