首页 文章 精选 留言 我的

精选列表

搜索[非自回归核心技术],共10007篇文章
优秀的个人博客,低调大师

银行大数据:非hadoop的架构证明

为啥写这文章呢?很多人都认为,银行在大数据方面应用落后,如何跟不上时代,说是支付宝都去“IOE”了,都推出余额宝了,银行是否除了雇人出来说余额宝的坏话就没啥能耐了等等巴拉巴拉巴拉。但是,笔者真的不是这样的认为的。 首先,银行的IT系统非常跟的上时代。如果论国内的信息化水平,银行的绝对算是数一数二,甚至直接就是数一。哪个公司敢站出来说自己的信息化比银行这个行业好?单独看看那些提供IT技术服务的公司(俗称“外包”,卖人头)就能知道,这个行业吸收了太多的IT从业人员。如果农行不买外协服务,就如同联通拿掉省级精分数据仓库一样,不知道要死多少家IT公司。 先看看工行。不久前,前工行杨凯生先生弄了一篇大论,深刻见底。足见银行IT之威武雄壮。 现在工行有17000余家营业机构,但目前通过网上银行、电话银行、手机银行、自助银行等渠道处理的业务量已

优秀的个人博客,低调大师

Java开发必须掌握的 21 个 Java 核心技术!

写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,希望可以给大家一些经验,能让大家更好学习和使用Java。 这次介绍的主要内容是和J2SE相关的部分,另外,会在以后再介绍些J2EE相关的、和Java中各个框架相关的内容。 经过这么多年的Java开发,以及结合平时面试Java开发者的一些经验,我觉得对于J2SE方面主要就是要掌握以下的一些内容。 1. JVM相关 对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很深,对此里面的概念有一些简单的了解即可。 不过对于一个有着3年以上Java经验的资深开发者来说,不会JVM几乎是不可接受的。 JVM作为java运行的基础,很难相信对于JVM一点都不了解的人可以把java语言吃得很透。 我在面试有超过3年Java经验的开发者的时候, JVM几乎就是一个必问的问题了。 当然JVM不是唯一决定技术能力好坏的面试问题,但是可以佐证java开发能力的高低。 在JVM这个大类中,我认为需要掌握的知识有: JVM内存模型和结构 GC原理,性能调优 调优:Thread Dump, 分析内存结构 class 二进制字节码结构, class loader 体系 , class加载过程 , 实例创建过程 方法执行过程 Java各个大版本更新提供的新特性(需要简单了解) 2. Java的运行 这条可能出看很简单,java程序的运行谁不会呢? 不过很多时候, 我们只是单纯通过IDE去执行java程序,底层IDE又是如何执行java程序呢?很多人并不了解。 这个知识点是最最基本的java开发者需要掌握的,第一个肯定是教你如何在命令行中执行java程序,但是很多人一旦把java学完了,IDE用上了,就把这个都忘了。 为什么强调要知道这个呢,知道了java最纯粹的启动方式之后,你才能在启动出问题的时候,去分析当时启动的目录多少,执行命名如何,参数如何,是否有缺失等。 这样有利于你真正开发中去解决那些奇奇怪怪的可能和环境相关的问题。 在这里需要掌握的知识有: javac 编译java文件为 class 文件 java 命令的使用, 带package的java类如何在命令行中启动 java程序涉及到的各个路径(classpath, java。library。path, java运行的主目录等) 3. 数据类型 这条没有什么好多说的,无非就是Java中的基本类型和对象类型的掌握。 可以再了解一些JDK如何自动转换方面的知识,包括装箱拆箱等,还要注意避免装箱之后的类型相等的判断。 主要知识点: 基本类型: int, long, float, double, boolean 。。。 对应的对象类型: Integer 等类型到基本类型的转换, 装箱和拆箱 Object类型: equals, hashcode String 类型的特点 4. 对象和实例 在这方面,开发者需要了解class和instance的概念以及之间的差别, 这是java面向对象特性的一个基础。 主要知识点有: Class和 Instance 的概念 Instance 创建的过程: 无继承:分配内存空间, 初始化变量, 调用构造函数 有继承:处理静态动作, 分配内存空间, 变量定义为初始值 , 从基类->子类, 处理定义处的初始化, 执行构造方法 需要注意的点: 静态属性等从基类->子类进行初始化 默认无参构造方法相关的特性 5. 访问控制 这也是java封装特性的一个基础,需要掌握的有:public protected default private 对于class, method, field 的修饰作用。 6. 流程控制 Java 流程控制的基础, 虽然有些语法不一定很常用,但是都需要了解,并且在合适的地方使用它们。 需要掌握的有:if, switch, loop, for, while 等流程控制的语法。 7. 面向对象编程的概念 这是一个java的核心概念,对于任何java开发者都需要熟练掌握。 Java中很多特性或者说知识点都是和java面向对象编程概念相关的。 在我的理解,一个好的开发者不仅仅需要了解这些特性(知识点)本身。 也更需要知道这些对象在java的面向对象编程概念中是如何体现出来的,这样更有利于开发者掌握java这门开发语言,以及其他面向对象编程的语言。 在这里只是简单罗列了一下,主要的知识点包括有: 面向对象三大特性:封装,继承,多态; 各自的定义概念,有哪些特性体现出来,各自的使用场景 静态多分派,动态单分派的概念 重载的概念和使用 继承:接口多实现,基类单继承 抽象,抽象类,接口 多态:方法覆盖的概念和使用 接口回调 8. static 静态属性在java日常开发中也是经常使用,需要了解和 static 关键字相关的用法,还有和其他关键字的配合使用, 如是否可以和 abstract, final 等关键字联合使用。 主要需要掌握的有: 静态属性的定义,使用,以及类加载时如何初始化 静态方法的定义和使用 静态类的定义和使用 静态代码块的定义和初始化时机 9.基础知识点 这里主要罗列一些散落的,没有系统归类的一些java知识点。 在日常的开发中用到也不少。 这块内容其实还有很多,目前只是暂时归纳了这几个在这里: 包括有: equals hashcode tring/stringbuffer final finally finalize 10.集合框架 这个是一个需要多加掌握的部分,做java开发,可以说没有不用到集合框架的,这很重要,这里整理的Java集合面试题及答案你必须都要清楚。 但是这里的知识点并不难,但是对于集合最好要了解内部的实现方式,因为这样有助于你在各个不同的场景选择适合的框架来解决问题,比如有1W个元素的集合,经常要进行contains判断操作,知道了集合的特性或者内部实现,就很容易做出正确的选择。 这里包括了如下内容(并发相关不包含在内): 集合框架的体系: 基础Collection ,Map 具体集合实现的内容, List ,Set ,Map 具体的实现,内部结构, 特殊的方法, 适用场景等 集合相关的工具类 Collections 等的用法 11.异常框架 异常在java的开发中可能没有那么被重视,异常处理的最佳实战详细说明了。 一般遇到异常,直接上抛,或者随便catch一下处理之后对于程序整体运行也没有什么大的影响。不过在企业级设计开发中, 异常的设计与处理的好坏,往往就关系着这个系统整体的健壮性。 一个好的系统的异常对于开发者来说,处理应该统一,避免各处散落很多异常处理逻辑;对于系统来说,异常应该是可控的,并且是易于运维的,某些异常出现后,应该有应对的方法,知道如何运维处理,所以虽然异常框架很简单,但是对于整个企业级应用开发来说,异常处理是很重要的,处理好异常就需要了解Java中的异常体系。 这部分需要掌握的知识点不多,主要就是: 异常的体系: Throwable Exception RuntimeException Error RuntimeException 和 一般 Exception 的区别, 具体处理方法等 12. Java IO IO 在java中不仅仅是文件读写那么简单,也包括了 socket 网络的读写等等一切的输入输出操作。比如说 标准HTTP请求中Post的内容的读取也是一个输出的过程,等等… 对于IO,Java不仅提供了基本Input、Output相关的api,也提供了一些简化操作的Reader、Writer等api,在某些开发(涉及大量IO操作的项目)中也很重要,一般日常的开发中也会涉及(日志,临时文件的读写等)。 在这中的知识点主要有: 基本IO的体系包括有InputStream , OutputStream, Reader/Writer, 文件读取,各种流读取等,NIO 的概念, 具体使用方式和使用场景。 13.多线程并发 多线程是Java中普遍认为比较难的一块。 多线程用好了可以有效提高cpu使用率, 提升整体系统效率, 特别是在有大量IO操作阻塞的情况下;这里整理的Java多线程面试题及答案你必须都要清楚。 但是它也是一柄双刃剑, 如果用不好,系统非但提升不大,或者没有提升,而且还会带来多线程之间的调试时等问题。 在多线程中内容有很多,只是简单说明一下Java中初步使用多线程需要掌握的知识点,以后有机会单独再详细介绍一些高级特性的使用场景。在Java技术栈公众号回复"多线程"可获取多线程系列教程。 多线程的实现和启动 callable 与 runable 区别 syncrhoized ,reentrantLock 各自特点和比对 线程池 future 异步方式获取执行结果 concurrent 包 lock 14.网络 Java中也是提供了可以直接操作 TCP协议、UDP协议的API。 在需要强调网络性能的情况下,可以直接使用TCP/UDP 进行通讯。 在查看Tomcat等的源码中,就可以看到这些相关API的使用情况。 不过一般也比较少会直接使用TCP,会使用诸如MINA、Netty这样的框架来进行处理,因为这个方面的开发涉及不多,所以就不再详细罗列了。 15.时间日期处理 几乎对于每个应用来说,时间日期的处理也是绕不过去的,但是JDK8 之前的时间相关API用法并不友好。 在那个时代,可以选择Joda等时间框架。到了JDK8 发布之后,全新的时间API基本融合了其他框架的优点,已经可以很好的直接使用了。 对于Java开发者来说,需要熟练地使用API来对时间和日期做相关的处理。 具体知识点不再罗列,会在以后再写个专门的文章来总结一下JDK8中时间日期API的用法。 16. XML解析/JSON解析 其实这两块内容都不是J2SE里面的内容,但是在日常开发中,和其他程序交互,和配置文件交互,越来越离不开这两种格式的解析。 不过对于一个开发者来说,能够了解一些XML/JSON具体解析的原理和方法,有助于你在各个具体的场景中更好的选择合适你的方式来使得你的程序更有效率和更加健壮。 XML: 需要了解 DOM解析和 SAX解析的基本原理和各自的适用场景 JSON: 需要了解一些常用JSON框架的用法, 如 Jackson, FastJson, Gson 等。 17. Maven使用 Maven也不是Java里面的内容,但是maven是革命性的,给java开发带来了巨大的便利,这30个Maven命令你必须熟悉。 从依赖的引入和管理,开发流程的更新和发布产出,乃至版本的更新,使用maven可以大大简化开发过程中的复杂度,从而节省大量时间。 可以说,maven已经成为java开发者的标配了。所以我把maven也作为一个java开发者对于基础必备的知识点。 在Java技术栈公众号回复"Maven"可获取Maven系列教程,以后会再放上一些我的一些对于maven使用的经验和技巧等,这里就不再细说了。 18.泛型 这是JDK5开始引入的新概念,其实是个语法糖。 在编写java代码时会有些许便利, 一般的应用或者是业务的开发,只需要简单使用,不一定会用到定义泛型这样的操作。 但是开发一些基础公共组件会使用到,可以在需要的时候再细看这个部分,一般情况下只要会简单使用即可。 19.注解 也是jdk5 之后引入的,元注解你必须了解。 spring是个优秀的框架,最开始就以xml作为标准的配置文件。 不过到了Spring3 之后,尤其是 spring-boot 兴起之后,越来越推崇使用标注来简化xml配置文件了,对于开发者来说,可以节省不少xml配置的时间。 但是劣势是在于标注散落在各个类中,不像xml,可以对所有配置有个全局性的理解和管理,所以还没有办法说完全就取代所有的xml。 对于一般开发者,会使用标注即可,一些公共组建的开发者可能会需要了解标注的定义和实现,可以在具体需要的时候再细看。 20. RMI RemoteMethodInvocation ,Java语言特有的远程调用接口,使用还是比较简单方便,点击这里了解RMI与RPC的区别详情。 不过需要跨语言的情况下,就需要使用 webservice 等其他方式来支持。 一般来说,程序都不需要使用RMI,不过可以在特定的情况下使用,我就在一个项目中,使用RMI来进行程序远程启动停止的控制。 21. JNI Java Native Interface,可以允许Java中调用本地接口方法,一般用于C/C++代码的调用。 需要注意的是在java中加载so/dll文件的路径问题,本身调用接口并不复杂,但是经常在是否加载了所需的本地接口库中花费较多时间。 以上也只是简单介绍了下我对于这些java基本知识点和技术点的一些看法和介绍。 这些内容都源自于我这些年来使用java的一些总结 。这当中还有些内容不够完善的地方,会通过以后的文章再添加上。 欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

优秀的个人博客,低调大师

阿里云语音识别模型端核心技术选讲

鄢志杰,阿里云资深算法专家,人机交互首席科学家。研究领域主要包括语音识别、语音合成、说话人识别验证、OCR/手写识别、机器学习算法等。长期担任语音领域顶级学术会议及期刊的专家评审,并拥有多项美国及PCT专利。 以下为内容全文: 语音识别技术作为人工智能技术中的重要组成部分,也作为影响人机交互的核心组件之一,从各种智能家用IoT设备的语音交互能力,到公共服务、智慧政务等场合的应用,语音识别技术正在影响着人们生活的方方面面。本文将挑选阿里云语音识别技术中的一些模型端技术进行简要介绍。 声学模型、语言模型和解码器可以看作是现代语音识别系统最核心的三个组成部分。虽然最近有一些研究者尝试构建End2end的语音识别系统,但包含声学模型、语言模型和解码器的现代语音识别系统依然是当前最主流和使用最广泛的系统。在这其中,声学模型主要用来构建输入语音和输

优秀的个人博客,低调大师

SpringFramework核心技术五:面向切面编程(AOP)和Spring

面向对象和面向切面两种编程方式的比较 面向方面编程(AOP)通过提供关于程序结构的另一种思考方式来补充面向对象编程(OOP)。OOP中模块化的关键单元是类,而在AOP中,模块化的单元是方面。方面可以实现关注的模块化,例如跨越多种类型和对象的事务管理。(这种担忧在AOP文献中常常被称为横切关注点。) AOP的介绍 1.基本的介绍 AOP框架是Spring的关键组件之一。虽然Spring IoC容器不依赖AOP,也就是说如果你不想使用AOP那么就不用AOP,AOP可以为Spring IoC提供功能非常强大的中间件解决方案。 Spring 2.0+ AOP Spring 2.0引入了一种使用基于模式的方法或@AspectJ注释样式编写自定义方面的更简单,更强大的方法。这两种风格都提供完全类型化的建议和AspectJ切入点语言的使用,同时仍然使用Spring AOP进行编织。 本章将讨论基于Spring 2.0+模式和@AspectJ的AOP支持。下一章将讨论较低级别的AOP支持,如Spring 1.2应用程序中常见的那样。 AOP在Spring框架中用于…… …提供声明式企业服务,特别是作为EJB声明式服务的替代品。最重要的这种服务是 声明式事务管理。 …允许用户实现自定义方面,补充他们与AOP一起使用OOP。 2.AOP概念 AOP的概念 3.Spring框架的核心 Spring框架的核心原则之一是非侵入性 ; 这是因为您不应该被迫在您的业务/域模型中引入特定于框架的类和接口。但是,在某些地方,Spring Framework确实为您提供了将Spring Framework特定的依赖项引入代码库的选项:为您提供此类选项的基本原理是因为在某些情况下,它可能更容易阅读或编写某些特定的部分功能以这种方式。Spring Framework(几乎)总是为您提供选择:您可以自由决定哪种选项最适合您的特定用例或场景。 与本章相关的一个选择是选择哪种AOP框架(以及哪种AOP样式)。您可以选择AspectJ和/或Spring AOP,并且您还可以选择@AspectJ批注样式方法或Spring XML配置样式方法。本章选择首先引入@AspectJ风格方法的事实不应视为Spring团队赞成Spring XML配置风格的@AspectJ注释风格方法。 4.AOP代理 Spring AOP默认使用AOP代理的标准JDK 动态代理。这使得任何接口(或接口集)都可以被代理。 Spring AOP也可以使用CGLIB代理。这是代理类而不是接口所必需的。如果业务对象不实现接口,则缺省使用CGLIB。因为优良的做法是编程接口而不是类; 业务类通常会实现一个或多个业务接口。在需要通知未在接口中声明的方法的情况下,或者需要将代理对象作为具体类型传递给方法的情况下(希望很少),可以 强制使用CGLIB。 掌握Spring AOP是基于代理的事实是很重要的。请参阅 了解AOP代理以彻底检查此实现细节的实际含义。 二、@AspectJ支持 5.2。@AspectJ支持 @AspectJ引用了一种将方面声明为常规Java类的注释类型。AspectJ项目引入了@AspectJ风格, 作为AspectJ 5版本的一部分。Spring使用AspectJ提供的用于切入点解析和匹配的库来解释与AspectJ 5相同的注释。AOP运行时仍然是纯粹的Spring AOP,并且不依赖于AspectJ编译器或编织器。 1.启用@AspectJ支持 要在Spring配置需要启用配置基于@AspectJ方面的Spring AOP和Spring支持使用@AspectJ切面,自动代理基于它们是否被那些方面建议豆。通过autoproxying我们的意思是,如果Spring确定一个或多个方面的bean被建议,它会自动生成该bean的代理来拦截方法调用并确保根据需要执行通知。 可以使用XML或Java风格配置启用@AspectJ支持。无论哪种情况,您还需要确保AspectJ的aspectjweaver.jar库位于应用程序的类路径中(版本1.8或更高版本)。该库可在’lib’AspectJ发行版的 目录中或通过Maven Central存储库获得。 2.启用@AspectJ支持 要使用Java启用@AspectJ支持,请@Configuration添加@EnableAspectJAutoProxy 注释: @Configuration @EnableAspectJAutoProxy public class AppConfig { } 使用XML配置启用@AspectJ支持 要使用基于XML的配置启用@AspectJ支持,请使用以下aop:aspectj-autoproxy 元素: <aop:aspectj-autoproxy/> 3.Declaring(宣布) an aspect(切面) 启用@AspectJ支持后,任何在应用程序上下文中定义的,具有@AspectJ方面(具有@Aspect注解)的类的bean 都将被Spring自动检测并用于配置Spring AOP。以下示例显示了一个不太有用的方面所需的最小定义: 应用程序上下文中的常规bean定义,指向具有@Aspect注释的bean类: <bean id="myAspect" class="org.xyz.NotVeryUsefulAspect"> <!-- configure properties of aspect here as normal --> </bean> 而NotVeryUsefulAspect类的定义,与注解 org.aspectj.lang.annotation.Aspect注释; package org.xyz; import org.aspectj.lang.annotation.Aspect; @Aspect public class NotVeryUsefulAspect { } 方面(带有注释的类@Aspect)可能具有与任何其他类一样的方法和字段。它们也可能包含切入点,建议和介绍(类型间)声明。 通过组件扫描自动检测方面 您可以在Spring XML配置中将方面类注册为常规bean,或者通过类路径扫描自动检测它们 - 就像任何其他Spring管理的bean一样。但是,请注意,@Aspect注解是不足够的classpath中自动检测:为了这个目的,你需要添加一个单独的@Component注释(或可选择地有资格,按照Spring的组件扫描仪的规则自定义构造型注解)。 与其他方面的方面建议? 在Spring AOP,它是不是可以有自己的方面从其他方面意见的目标。类上的@Aspect注释将其标记为方面,因此将其从自动代理中排除。 4.Declaring a pointcut(切入点) 回想一下,切入点确定了感兴趣的连接点,从而使我们能够控制建议何时执行。Spring AOP仅支持Spring bean的方法执行连接点,因此您可以将切入点视为匹配Spring Bean上方法的执行。切入点声明包含两部分:包含名称和任何参数的签名以及确切地确定我们感兴趣的方法执行的切入点表达式。在AOP的@AspectJ注释样式中,切入点签名由常规方法提供定义,并且使用@Pointcut注释来指示切入点表达式(用作切入点签名的方法 必须具有void返回类型)。 一个例子将帮助区分切入点签名和切入点表达式之间的区别。以下示例定义了一个名为的切入点’anyOldTransfer’,它将匹配任何名为的方法的执行’transfer’: @Pointcut("execution(* transfer(..))")// the pointcut expression private void anyOldTransfer() {}// the pointcut signature …… 三、Spring AOP还是完整的AspectJ? 使用最简单的方法。Spring AOP比使用完整的AspectJ更简单,因为不需要将AspectJ编译器/编织器引入到开发和构建过程中。如果您只需要建议Spring bean执行操作,那么Spring AOP就是正确的选择。如果您需要建议不是由Spring容器管理的对象(通常是域对象),那么您将需要使用AspectJ。如果您希望建议除简单方法执行之外的连接点(例如,字段获取或设置连接点等),则还需要使用AspectJ。 使用AspectJ时,您可以选择AspectJ语言语法(也称为“代码样式”)或@AspectJ注释样式。很显然,如果你不使用Java 5+,那么你已经选择了…使用代码风格。如果方面在您的设计中扮演重要角色,并且您可以使用针对Eclipse 的AspectJ开发工具(AJDT)插件,那么AspectJ语言语法是首选选项:它更干净更简单,因为语言是专门为写方面。如果您没有使用Eclipse,或者只有少数几个方面在应用程序中不起主要作用,那么您可能需要考虑使用@AspectJ风格,并在IDE中使用常规的Java编译,并添加一个方面编织阶段到您的构建脚本。 这个面向切面编程讲的较为抽象! 具体的下一次咱们在研究下!

优秀的个人博客,低调大师

SpringFramework核心技术三:Spring时间处理和类型转换

使用 在(1)中,我们学习了蛮多的基本概念,在(2)中咱们看一下如何使用的问题。 一、以编程方式使用ConversionService 要以编程方式使用ConversionService实例,只需为其他bean注入一个引用即可: @Service public class MyService { @Autowired public MyService(ConversionService conversionService) { this.conversionService = conversionService; } public void doIt() { this.conversionService.convert(...) } } 对于大多数用例,可以使用convert指定targetType的方法,但它不适用于更复杂的类型,如参数化元素的集合。如果你想转换List的Integer到List的String程序,例如,你需要提供的源和目标类型的正式定义。 幸运的是,TypeDescriptor提供了各种选项来简单明了: DefaultConversionService cs = new DefaultConversionService(); List<Integer> input = .... cs.convert(input, TypeDescriptor.forObject(input), // List<Integer> type descriptor TypeDescriptor.collection(List.class, TypeDescriptor.valueOf(String.class))); 请注意,DefaultConversionService自动注册转换器适用于大多数环境。这包括收集器,标转换器,也基本Object到String转换器。相同的转换器可以ConverterRegistry使用该类 上的静态 addDefaultConverters方法进行注册DefaultConversionService。 值类型转换器将被重新用于数组和集合,所以没有必要创建一个特定的转换器从转换Collection的S到 Collection的T,假设标准收集处理是适当的。 二、Spring字段格式 正如前一节所讨论的,core.convert是一种通用型转换系统。它提供统一的ConversionService API以及用于实现从一种类型到另一种类型的转换逻辑的强类型转换器SPI。Spring容器使用这个系统绑定bean属性值。另外,Spring表达式语言(SpEL)和DataBinder都使用这个系统来绑定字段值。例如,当使用SpEL需要强迫一个Short到一个Long完成的expression.setValue(Object bean, Object value)尝试,core.convert系统执行强制。 现在考虑典型客户端环境(如Web或桌面应用程序)的类型转换要求。在这样的环境中,您通常从String转换 为支持客户端回发过程,并返回String以支持视图呈现过程。另外,您经常需要本地化字符串值。更一般的core.convert Converter SPI没有直接解决这种格式化要求。为了直接解决它们,Spring 3引入了一个方便的Formatter SPI,为客户端环境提供了PropertyEditor的一个简单而强大的替代方案。 通常,在需要实现通用类型转换逻辑时使用Converter SPI; 例如,用于在java.util.Date和java.lang.Long之间进行转换。在客户端环境(如Web应用程序)中工作时需要使用Formatter SPI,并且需要解析和打印本地化的字段值。ConversionService为两个SPI提供统一的类型转换API。 1.格式化器SPI 格式化器SPI实现字段格式化逻辑很简单并且强类型化: package org.springframework.format; public interface Formatter<T> extends Printer<T>, Parser<T> { } Formatter从打印机和解析器构建块接口扩展而来: public interface Printer<T> { String print(T fieldValue, Locale locale); } import java.text.ParseException; public interface Parser<T> { T parse(String clientValue, Locale locale) throws ParseException; } 要创建自己的格式化程序,只需实现上面的格式化接口即可。例如,将T指定为要格式化的对象的类型 java.util.Date。实施print()操作以打印T的实例以在客户端区域设置中显示。实现parse()操作以从客户机语言环境返回的格式化表示中解析T的实例。如果解析尝试失败,则格式化程序应该抛出ParseException或IllegalArgumentException。注意确保您的Formatter实现是线程安全的。 format为方便起见,在子包中提供了几个格式化器实现。该number包提供了一个NumberFormatter,CurrencyFormatter并 使用a PercentFormatter来格式化java.lang.Number对象java.text.NumberFormat。该datetime包提供了一个用a DateFormatter来格式化java.util.Date对象java.text.DateFormat。该datetime.joda软件包提供基于Joda-Time库的综合日期时间格式化支持。 考虑DateFormatter作为一个示例Formatter实现: package org.springframework.format.datetime; public final class DateFormatter implements Formatter<Date> { private String pattern; public DateFormatter(String pattern) { this.pattern = pattern; } public String print(Date date, Locale locale) { if (date == null) { return ""; } return getDateFormat(locale).format(date); } public Date parse(String formatted, Locale locale) throws ParseException { if (formatted.length() == 0) { return null; } return getDateFormat(locale).parse(formatted); } protected DateFormat getDateFormat(Locale locale) { DateFormat dateFormat = new SimpleDateFormat(this.pattern, locale); dateFormat.setLenient(false); return dateFormat; } } 2.注释驱动的格式 您将会看到,字段格式可以通过字段类型或注释进行配置。要将注释绑定到格式化程序,请实现AnnotationFormatterFactory: package org.springframework.format; public interface AnnotationFormatterFactory<A extends Annotation> { Set<Class<?>> getFieldTypes(); Printer<?> getPrinter(A annotation, Class<?> fieldType); Parser<?> getParser(A annotation, Class<?> fieldType); } 例如,参数化A是您希望将格式逻辑与之关联的字段批注类型org.springframework.format.annotation.DateTimeFormat。已经 getFieldTypes()返回类型字段中的注释,可以使用上。已经 getPrinter()返回打印机打印的注释字段的值。已经 getParser()返回解析器解析一个clientValue一个注释字段。 下面的示例AnnotationFormatterFactory实现将@NumberFormat注释绑定到格式化程序。此注释允许指定数字样式或模式: public final class NumberFormatAnnotationFormatterFactory implements AnnotationFormatterFactory<NumberFormat> { public Set<Class<?>> getFieldTypes() { return new HashSet<Class<?>>(asList(new Class<?>[] { Short.class, Integer.class, Long.class, Float.class, Double.class, BigDecimal.class, BigInteger.class })); } public Printer<Number> getPrinter(NumberFormat annotation, Class<?> fieldType) { return configureFormatterFrom(annotation, fieldType); } public Parser<Number> getParser(NumberFormat annotation, Class<?> fieldType) { return configureFormatterFrom(annotation, fieldType); } private Formatter<Number> configureFormatterFrom(NumberFormat annotation, Class<?> fieldType) { if (!annotation.pattern().isEmpty()) { return new NumberFormatter(annotation.pattern()); } else { Style style = annotation.style(); if (style == Style.PERCENT) { return new PercentFormatter(); } else if (style == Style.CURRENCY) { return new CurrencyFormatter(); } else { return new NumberFormatter(); } } } } 要触发格式化,只需使用@NumberFormat注释字段即可: public class MyModel { @NumberFormat(style=Style.CURRENCY) private BigDecimal decimal; } 格式注释API org.springframework.format.annotation 包中存在可移植的格式注释API 。使用@NumberFormat格式化java.lang.Number字段。使用@DateTimeFormat格式化java.util.Date,java.util.Calendar,java.util.Long或Joda-Time字段。 以下示例使用@DateTimeFormat将java.util.Date格式化为ISO日期(yyyy-MM-dd): public class MyModel { @DateTimeFormat(iso=ISO.DATE) private Date date; } 3.FormatterRegistry SPI FormatterRegistry是用于注册格式化程序和转换程序的SPI。 FormattingConversionService是适用于大多数环境的FormatterRegistry的实现。这个实现可以通过编程或声明方式配置为Spring bean FormattingConversionServiceFactoryBean。因为这个实现也实现了ConversionService,所以它可以直接配置用于Spring的DataBinder和Spring表达式语言(SpEL)。 查看下面的FormatterRegistry SPI: package org.springframework.format; public interface FormatterRegistry extends ConverterRegistry { void addFormatterForFieldType(Class<?> fieldType, Printer<?> printer, Parser<?> parser); void addFormatterForFieldType(Class<?> fieldType, Formatter<?> formatter); void addFormatterForFieldType(Formatter<?> formatter); void addFormatterForAnnotation(AnnotationFormatterFactory<?, ?> factory); } 如上所示,格式化程序可以通过fieldType或注释进行注册。 FormatterRegistry SPI允许您集中配置格式化规则,而不是在控制器中复制这种配置。例如,您可能希望强制所有日期字段以特定方式格式化,或者使用特定批注的字段以特定方式格式化。通过共享的FormatterRegistry,您可以定义这些规则一次,并在需要格式化时应用这些规则。 4.FormatterRegistrar SPI FormatterRegistrar是一个用于通过FormatterRegistry注册格式化器和转换器的SPI: package org.springframework.format; public interface FormatterRegistrar { void registerFormatters(FormatterRegistry registry); } FormatterRegistrar在为给定格式类别(例如日期格式)注册多个相关转换器和格式化程序时非常有用。在声明性注册不足的情况下,它也很有用。例如,格式化程序需要在与其自己的不同的特定字段类型下或在注册打印机/解析器对时进行索引。下一节提供了有关转换器和格式化程序注册的更多信息。 三、配置全球日期和时间格式 默认情况下,不使用注释的日期和时间字段@DateTimeFormat使用DateFormat.SHORT样式从字符串转换。如果你愿意,你可以通过定义你自己的全局格式来改变它。 您需要确保Spring不会注册默认格式化程序,而应该手动注册所有格式化程序。根据您是否使用Joda-Time库,使用 org.springframework.format.datetime.joda.JodaTimeFormatterRegistraror或 org.springframework.format.datetime.DateFormatterRegistrarclass。 例如,以下Java配置将注册全局“yyyyMMdd”格式。这个例子不依赖于Joda-Time库: @Configuration public class AppConfig { @Bean public FormattingConversionService conversionService() { // Use the DefaultFormattingConversionService but do not register defaults DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false); // Ensure @NumberFormat is still supported conversionService.addFormatterForFieldAnnotation(new NumberFormatAnnotationFormatterFactory()); // Register date conversion with a specific global format DateFormatterRegistrar registrar = new DateFormatterRegistrar(); registrar.setFormatter(new DateFormatter("yyyyMMdd")); registrar.registerFormatters(conversionService); return conversionService; } } 如果你更喜欢基于XML的配置,你可以使用a FormattingConversionServiceFactoryBean。这是同一个例子,这次使用乔达时间: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="registerDefaultFormatters" value="false" /> <property name="formatters"> <set> <bean class="org.springframework.format.number.NumberFormatAnnotationFormatterFactory" /> </set> </property> <property name="formatterRegistrars"> <set> <bean class="org.springframework.format.datetime.joda.JodaTimeFormatterRegistrar"> <property name="dateFormatter"> <bean class="org.springframework.format.datetime.joda.DateTimeFormatterFactoryBean"> <property name="pattern" value="yyyyMMdd"/> </bean> </property> </bean> </set> </property> </bean> </beans> 乔达时提供单独的不同类型来表示date,time和date-time 的值。的dateFormatter,timeFormatter和dateTimeFormatter的性质 JodaTimeFormatterRegistrar,应使用来配置不同的格式为每种类型。在DateTimeFormatterFactoryBean提供了一个方便的方法来创建格式化。 如果您使用Spring MVC,请记住明确配置使用的转换服务。对于基于Java的@Configuration这意味着扩展 WebMvcConfigurationSupport类和重写mvcConversionService()方法。对于XML,您应该使用元素的’conversion-service’属性 mvc:annotation-driven。有关详细信息,请参阅转换和格式。

优秀的个人博客,低调大师

SpringFramework核心技术一(IOC:注册一个LoadTimeWeaver)

一、什么是LoadTimeWeaver 在LoadTimeWeaver用于由Spring动态变换的类,因为它们被装载到Java虚拟机(JVM)。 要启用加载时织入,请将其添加@EnableLoadTimeWeaving到您的某个 @Configuration类中: @Configuration @EnableLoadTimeWeaving public class AppConfig { } 或者对于XML配置,请使用以下context:load-time-weaver元素: <beans> <context:load-time-weaver/> </beans> 一旦配置为ApplicationContext。它内部的任何bean都ApplicationContext 可以实现LoadTimeWeaverAware,从而接收对加载时织机实例的引用。这与Spring的JPA支持相结合特别有用, 因为JPA类转换可能需要加载时织入。有关LocalContainerEntityManagerFactoryBean更多详细信息,请参阅javadocs。有关AspectJ加载时织入的更多信息,请参阅Spring框架中使用AspectJ进行加载时织入。 好了,注册一个LoadTimeWeaver就到这里啦。

优秀的个人博客,低调大师

阿里开源了14个核心技术,你了解哪些?

在开源中国举行的“2017年度最受欢迎中国开源软件Top20”的评选中,阿里巴巴占据五席位。 其实,阿里巴巴并没有开源项目的KPI考核,各个团队都是发自内心地将踩过的坑和总结的经验融入到开源项目中,供业界所有人使用,希望帮助他人解决问题。这正是社区一致的开源精神,大家都可以站在巨人的肩膀上,每个人都可以既是老师又是学生,这或许可以解释为什么IT技术的发展能如此充满活力。 本文总结整理了2017年阿里巴巴九个重要的新开源项目和在开源中国评选中五个备受欢迎的项目,希望能对大家有所帮助。 构建高性能的分布式系统 我们见证了从大型机到分布式系统的趋势转变。大型机部署简单,无需多个节点配置,但是售价高、维护困难、单点依赖较高;而小型机组建的分布式系统则在降低成本的同时提高整体的并发量、扩展性和可靠性。相信不少人都听说过数据库连接池 Druid,js

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册