首页 文章 精选 留言 我的

精选列表

搜索[java],共10014篇文章
优秀的个人博客,低调大师

Java Validation校验

前言 在日常的开发中,经常需要对参数进行校验,如果采用代码硬编码去校验,不但代码可扩展性差、复用率低,并且新增字段时可能会漏掉校验,维护成本比较高。简述JSR303/JSR-349,hibernate validation,spring validation之间的关系。 JSR303是一项标准,JSR-349是其的升级版本,添加了一些新特性,他们规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,他们位于javax.validation.constraints包下,只提供规范不提供实现。 hibernate validation是对这个规范的实践(不要将hibernate和数据库orm框架联系在一起),他提供了相应的实现,并增加了一些其他校验注解,如@Email,@Length,@Range等等,他们位于org.hibernate.validator.constraints包下。 spring validation 给开发者提供便捷,对hibernate validation进行了二次封装,显示校验validated bean时,你可以使用spring validation或者hibernate validation,而spring validation另一个特性,便是其在springmvc模块中添加了自动校验,并将校验信息封装进了特定的类中。这无疑便捷了我们的web开发。 注意:通常情况下hibernate validation 和 Spring validation结合使用 @validated和@valid使用说明 @validated和@valid区别 在检验 Controller 的入参是否符合规范时,使用 @Validated 或者 @Valid 在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同: 分组。@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,这个网上也有资料,不详述。@Valid:作为标准JSR-303规范,还没有吸收分组的功能。 注解地方。@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上。@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上。两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能。 嵌套验证。@Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上,来配合方法参数上@Validated或@Valid来进行嵌套验证。 @validated的使用注意点 @validated和@valid都可以用在controller层的参数前面,但这只能在controller层生效。 @validated如果要开启方法验证。注解应该打在类上,而不是方法参数上。 方法验证模式下,被jsr303标准的注解修饰的可以是方法参数也可以是返回值,类似如下 public @NotNull Object myValidMethod(@NotNull String arg1, @Max(10) int arg2) @validated不支持嵌套验证。所以jsr303标准的注解修饰的对象只能基本类型和包装类型。其他类型只能做到检测是否为空,对于对象里面的jsr303标准的注解修饰的属性,不支持验证。 依赖引入 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.1.1.Final</version> </dependency> 参考文章 @Validated和@Valid的区别

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

java策略模式

如果都使用if-else的话,就会使用代码变的臃肿,而且难以复用。那我们就可以根据不同的情况,将不同的方式封装成不同的策略,将策略与它的使用对象分离开来。 案例: 定义注解,标注范围 /** * @author Gjing * 价格范围注解 **/ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface PriceRegion { int min() default 0; int max() default Integer.MAX_VALUE; } 具体策略 /** * @author Gjing * 抽象策略 **/ public interface Price { BigDecimal getPri

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

java代理模式

前言: 看有关于技术的文章需要带着问题去看,我上周在公司做了一场设计模式的技术分享,在会上又不同的小伙伴提出了很多疑问,那么今天我就来解决一下这一些疑问,非常感谢参与会议的小伙伴。 问题: 一、什么是设计模式? 二、为什么JDK动态代理与CGLIB动态代理生成的源代码是差不多的? 三、代理模式相比直接使用接口有什么好处吗? 四、如果接口被多个类实现会怎样? 问题1:什么是设计模式 设计模式是一种经验能够使新手更加简单的使用前人的经验和方案。 可以避免重复劳动,就像一句在这个行业流行的话不要重复造轮子。 设计模式是针对特定上下文的特定问题的解决方案,解决方案被抽象化、模版化、就是设计模式,学习设计模式的关键是理解,理解方法理解思想理解观念。 不是为了使用设计模式而,设计的根本是为了可复用、可拓展、高性能,不要为了使用设计模式而使用,一定要结合实际环境的去考虑整个问题。 每一种模式有四个基本元素:模式名称、问题描述、应用场景、应用后效果。 设计模式在应用中遵循六大原则: 开闭原则:对扩展开放,对修改关闭。 里氏代换原则:任何基类可以出现的地方,子类一定可以出现。 依赖倒转原则:针对接口编程,依赖于抽象而不依赖于具体。 接口隔离原则:使用多个隔离的接口,比使用单个接口要好。 迪米特法则:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。 合成复用原则:原则是尽量使用合成/聚合的方式,而不是使用继承。 代理模式分为两种:静态代理、动态代理,这两者有什么区别呢?往下看就明白了。 什么是代理模式:为其他对象提供一种代理以控制对这个对象的访问(例:AOP、拦截器)。 代理模式的角色:被代理者与代理者实现的接口、代理类、被代理类。 一、静态代理模式: 静态代理由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class就已经存在了。 UML图: 图中含有接口(person)、代理类(proxy)、被代理类(target),带代理者与代理者都实现了person的接口,client在调用时是直接访问的被代理类(proxy),代理类在buy方法中引用了targer类中的buy方法,可以在代理前、代理后做一些其他的业务逻辑处理,控制targer的访问。 下面直接上代码,一步步引出静态代理的优点与缺点: 接口: package proxyblogs; /** * 人的行为接口. */ public interface person { /** * 买东西. * * @param name 商品名称. * @return int * @author null */ int buy(String name); Target类(被代理者): package proxyblogs; /** * @ClassName Target. * Create by Null on 2019/2/26/19:29 **/ public class Target implements person { /** * 买东西. * * @param name 商品名称. * @return int 价格 * @author null */ @Override public int buy(String name) { if (name.equals("apple")) { return 5; } else { return 3; } } } proxy类(代理者): package proxyblogs; /** * @ClassName proxy. * Create by Null on 2019/2/26/19:30 **/ public class proxy implements person { /** * 买东西. * * @param name 商品名称. * @return int * @author null */ @Override public int buy(String name) { int buy = new Target().buy(name); //运费 int freight = 2; return buy + freight; } } test测试类 package proxyblogs; /** * @ClassName Test. * Create by Null on 2019/2/26/19:39 **/ public class Test { public static void main(String[] args) { int money = new proxy().buy("apple"); System.out.println(money); } } 执行结果: 7 Process finished with exit code 0 优点: 一、相对于动态代理来说,程序比较简易、性能比动态代理要高。 缺点: 一、静态代理类和被代理类实现了相同的接口,代理类通过被代理类实现了相同的方法。这样就出现了大量的代码重复,增加了代码维护的复杂度。 二、静态代理只服务于一种类型的对象, 如果要服务 多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模 稍大时就无法胜任了。

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

Java总结 - PriorityQueue

新年第一篇, 如果有错误请及时指正哈!! 祝大家新年快乐 嘻嘻 今天说一下PriorityQueue,这是一个有顺序的队列,此顺序并不是加入顺序,而是元素的按一定规则排列的顺序,我们看一下他的类图关系 相对于Deque,此实现就只是实现了关于Queue的相关接口,所以它就只能作为队列使用了.我们来稍微看一下用法Comparator<Integer> comparator = Comparator.comparingInt(x -> x); PriorityQueue<Integer> queue = new PriorityQueue<>(comparator); queue.add(7); queue.add(1); queue.add(10); queue.add(6); System.

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

Java总结 - ArrayDeque

这次来说一下ArrayDeque,我们先看一下他的类关系图,其中忽略掉了一些标记性接口 我们看一下类的定义public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Cloneable, Serializable {...} 从中我们可以看到他实现了Deque接口,那么Deque是实现了Queue<E>接口,如下是两个接口中的部分方法Queue: boolean add(E e); boolean offer(E e); E remove(); E poll(); E element(); E peek(); Deq

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

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