首页 文章 精选 留言 我的

精选列表

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

声明式 API 编程框架 Mars-java 发布 3.0.9

本次更新如下: 分布式锁只需一行注解 新增文件下载功能封装 多个文件上传可以一次性接收 文件上传可以配置大小限制 分布式锁 @RedisLock(key = "自己定义一个key") public int insert(){ return 1; } 这个锁会在事务开启之前获取,在事务提交以后解锁,并且只对MarsBean有效,对API和DAO无效 如果你不需要锁住整个方法,只需要锁一小段代码,那么可以去我的官网查看相应资料 文件下载 在service实现类的方法里传入HttpMarsResponse对象,然后一行代码搞定 public void downLoad(HttpMarsResponse response) { try { File file = new File("/Users/yuye/Desktop/demo.mov"); InputStream inputStream = new FileInputStream(file); response.downLoad("文件名称",inputStream); } catch (Exception e){ } } 文件上传接收 在接收参数的实体类里面 添加如下属性 public class UserInfoDTO { //单个文件 private MarsFileUpLoad file; //多个文件 private MarsFileUpLoad[] files; } 配置文件大小限制 在配置文件里加入 以下配置 #上传文件大小(默认 1M,10M),单位k fileUpload: fileSizeMax: 100 sizeMax: 1000 同时,Mars-cloud 3.0.6也发布了 官网:http://mars-framework.com/

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

Java设计模式之原型模式(创建型模式)

定义:原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 ​ 在应用程序中,有些对象比较复杂,其创建过程过于复杂,而且我们又需要频繁的利用该对象,如果这个时候我们按照常规思维new该对象,那么务必会造成资源浪费,这个时候我们就希望可以利用一个已有的对象来不断对他进行复制就好了,这就是编程中的“克隆”。原型模式直接操作底层二进制流,在创建复杂对象是效率提升明显。 ​ UML类图: ​ ​ ​ 浅克隆与深克隆: ​ 浅克隆:当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制。 深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将被复制。 浅克隆: public class Person implements Cloneable { private String name; private boolean gender; private Interest interest; public Person(String name, boolean gender, Interest interest) { this.name = name; this.gender = gender; this.interest = interest; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isGender() { return gender; } public void setGender(boolean gender) { this.gender = gender; } public Interest getInterest() { return interest; } public void setInterest(Interest interest) { this.interest = interest; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", gender=" + gender + ", interest=" + interest + '}'; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } public static void main(String[] args) throws CloneNotSupportedException { Interest interest = new Interest("摄影"); Person gg = new Person("gg",false,interest); System.out.println(gg); Person dxy = (Person)gg.clone(); dxy.setName("dxy"); dxy.setGender(true); dxy.interest.setName("咖啡"); System.out.println(dxy); System.out.println(gg); } } class Interest{ private String name; public Interest(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Interest{" + "name='" + name + '\'' + '}'; } } 运行结果: Person{name='gg', gender=false, interest=Interest{name='摄影'}} Person{name='dxy', gender=true, interest=Interest{name='咖啡'}} Person{name='gg', gender=false, interest=Interest{name='咖啡'}} 浅克隆对于引用类型,只克隆了引用,因此两个对象的interest公共同一个内存地址,一个对象变化,会引起另一个对象响应的变化。 深克隆: public class Person implements Cloneable { private String name; private boolean gender; private Interest interest; public Person(String name, boolean gender, Interest interest) { this.name = name; this.gender = gender; this.interest = interest; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isGender() { return gender; } public void setGender(boolean gender) { this.gender = gender; } public Interest getInterest() { return interest; } public void setInterest(Interest interest) { this.interest = interest; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", gender=" + gender + ", interest=" + interest + '}'; } @Override protected Object clone() throws CloneNotSupportedException { Object obj = super.clone(); //直接调用object对象的clone()方法! //添加如下代码实现深复制(deep Clone) Person person = (Person) obj; person.interest = (Interest)this.interest.clone(); //把属性也进行克隆! return obj; } public static void main(String[] args) throws CloneNotSupportedException { Interest interest = new Interest("摄影"); Person gg = new Person("gg",false,interest); System.out.println(gg); Person dxy = (Person)gg.clone(); dxy.setName("dxy"); dxy.setGender(true); dxy.interest.setName("咖啡"); System.out.println(dxy); System.out.println(gg); } } class Interest implements Cloneable { private String name; public Interest(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return "Interest{" + "name='" + name + '\'' + '}'; } } 运行结果: Person{name='gg', gender=false, interest=Interest{name='摄影'}} Person{name='dxy', gender=true, interest=Interest{name='咖啡'}} Person{name='gg', gender=false, interest=Interest{name='摄影'}} 通过对引用类型值Interest添加clone方法,并且对Person对象的clone方法改造,实现深克隆。 此外还可以通过序列化和反序列化的方式实现深复制。 public class Person implements Serializable { private String name; private boolean gender; private Interest interest; public Person(String name, boolean gender, Interest interest) { this.name = name; this.gender = gender; this.interest = interest; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isGender() { return gender; } public void setGender(boolean gender) { this.gender = gender; } public Interest getInterest() { return interest; } public void setInterest(Interest interest) { this.interest = interest; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", gender=" + gender + ", interest=" + interest + '}'; } public static void main(String[] args) throws CloneNotSupportedException,ClassNotFoundException,IOException { Interest interest = new Interest("摄影"); Person gg = new Person("gg",false,interest); System.out.println(gg); //使用序列化和反序列化实现深复制 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(gg); byte[] bytes = bos.toByteArray(); ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bis); Person dxy = (Person) ois.readObject(); //克隆好的对象! dxy.interest.setName("咖啡"); System.out.println(dxy); System.out.println(gg); } } class Interest implements Serializable{ private String name; public Interest(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Interest{" + "name='" + name + '\'' + '}'; } } 运行结果: Person{name='gg', gender=false, interest=Interest{name='摄影'}} Person{name='gg', gender=false, interest=Interest{name='咖啡'}} Person{name='gg', gender=false, interest=Interest{name='摄影'}} 优点: ​ 当创建对象的实例较为复杂的时候,使用原型模式可以简化对象的创建过程。 直接操作二进制流,可以提高实例的创建效率。 缺点: ​ 需要为每一个类配置一个克隆方法,而且该克隆方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违反了开闭原则。 在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重签到引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。 此外clone对象时,不调用构造方法,无视构造方法的权限。 ​

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

JAVA设计模式之建造者模式(创建型模式)

《2019年阿里云双11活动拼团》:https://www.aliyun.com/1111/2019/group-buying-share【限时】1年86元,3年229元,用来建站和编程学习【附WordPress建站教程】 1 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 类型:创建类模式。 四个要素: 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。 导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。 2 代码实现 class Product { private String name; private String type; public void showProduct(){ System.out.println(“名称:”+name); System.out.println(“型号:”+type); } public void setName(String name) { this.name = name; } public void setType(String type) { this.type = type; } } abstract class Builder { public abstract void setPart(String arg1, String arg2); public abstract Product getProduct(); } class ConcreteBuilder extends Builder { private Product product = new Product(); public Product getProduct() { return product; } public void setPart(String arg1, String arg2) { product.setName(arg1); product.setType(arg2); } } public class Director { private Builder builder = new ConcreteBuilder(); public Product getAProduct(){ builder.setPart(“宝马汽车”,“X7”); return builder.getProduct(); } public Product getBProduct(){ builder.setPart(“奥迪汽车”,“Q5”); return builder.getProduct(); } } public class Client { public static void main(String[] args){ Director director = new Director(); Product product1 = director.getAProduct(); product1.showProduct(); Product product2 = director.getBProduct(); product2.showProduct(); } } 3 比较及总结 建造者模式的优点: 首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。 其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。 建造者模式与工厂模式的区别: 建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。 与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。 总结: 建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式

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

Java设计模式(1)适配器模式(结构型)

2019年阿里云双11活动拼团:https://www.aliyun.com/1111/2019/group-buying-share 适配器模式属于结构型模式的一种,它可以理解为现实生活中的电源适配器、网络适配器等。首先要搞清楚什么是结构型模式。 ​ 结构型模式是将系统中的多个类或对象组合在一起,相互协作来完成更复杂的任务或功能。就好比搭积木,许多简单积木可以搭建成更复杂、功能更强大的结构。它分为两种形式:类结构型模式和对象结构型模式。类结构型模式由多个类组合,存在继承和实现关系;对象结构型模式由类和对象组合,存在关联关系(比如车和轮胎的关系)。 ​ 下面我们再介绍适配器模式: ​ 1、定义:将一个类的接口转化成多个类可以兼容的接口,使其协同工作而无需修改现有类的内部结构。 ​ 2、模式结构: ​ (1)Target(目标抽象类):定义了特定的工作接口。 ​ (2)Adapter(适配器类):模式的核心类,作为转换器对Target和Adaptee进行适配。 ​ (3)Adaptee(适配者类):定义了需要适配的接口。 ​ (4)Client(客户类):针对目标抽象类编程,调用其定义的方法。 ​ 3、类适配器和对象适配器的比较: ​ 类适配器中,适配器类通过实现Target接口并继承Adaptee类,实现适配目的。 ​ public class Adapter extends Adaptee implements Target { //request()方法为Target接口里所定义的方法 public void request() { specificRequest();//该方法为Adaptee类里定义的方法 } } 对象适配器中,适配器类通过继承Target类并关联一个Adaptee对象,实现适配目的。 ​ public class Adapter extends Target { private Adaptee adaptee;//所关联的适配者类的对象 public Adapter(Adaptee adaptee) { this.adaptee=adaptee; } public void request() { adaptee.specificRequest(); } } 4、案例分析:(机器人)使用的是类适配器模式 ​ (1)目标抽象类 Robot ​ public interface Robot { public void cry(); public void move(); } (2)适配者类 Dog ​ public class Dog { public void shout() { System.out.println("狗可以汪汪叫!"); } public void run() { System.out.println("狗可以跑!"); } } (3)适配器类 DogAdapte ​ public class DogAdapter extends Dog implements Robot { public void cry(){ System.out.print("机器人模仿:"); super.shout(); } public void move(){ System.out.print("机器人模仿:"); super.run(); } } 5、模式优缺点: ​ (1)优点:将目标类和适配者类解耦,更换添加适配器方便简单,增加了类的复用性。 ​ (2)缺点:类适配器模式一次只能适配一个适配者类,目标抽象类只能为接口,具有一定的局限性;对象适配器模式很难置换适配者类的方法。 ​ 6、模式应用: ​ (1)通过 JDBC 连接数据库时加载数据库驱动利用了适配器模式。不同数据库的驱动都是介于 JDBC 接口和数据库引擎接口(如Oracle)之间的适配器软件。 ​ (2)框架 Spring 的组成之一 Spring AOP 中,BeforeAdvice、AfterAdvice、ThrowsAdvice 三种通知类型是借助适配器模式实现的,AdvisorAdapter 是一个适配器接口,源码如下: ​ public interface AdvisorAdapte { //将一个 Advisor 适配成 MethodIntercepto MethodInterceptor getInterceptor(Advisor advisor); //判断此适配器是否支持特定的 Advice boolean supportsAdvice(Advice advice); } (3)JDK类库中n的一些适配器类,如 InputStreamAdapter 类用于包装 ImageInputStream 接口及其子类对象,使用对象适配器模式。 ​

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

Java结构型模式(1)适配器模式

2019年阿里云双11活动拼团:https://www.aliyun.com/1111/2019/group-buying-share 适配器模式属于结构型模式的一种,它可以理解为现实生活中的电源适配器、网络适配器等。首先要搞清楚什么是结构型模式。 ​ 结构型模式是将系统中的多个类或对象组合在一起,相互协作来完成更复杂的任务或功能。就好比搭积木,许多简单积木可以搭建成更复杂、功能更强大的结构。它分为两种形式:类结构型模式和对象结构型模式。类结构型模式由多个类组合,存在继承和实现关系;对象结构型模式由类和对象组合,存在关联关系(比如车和轮胎的关系)。 ​ 下面我们再介绍适配器模式: ​ 1、定义:将一个类的接口转化成多个类可以兼容的接口,使其协同工作而无需修改现有类的内部结构。 ​ 2、模式结构: ​ (1)Target(目标抽象类):定义了特定的工作接口。 ​ (2)Adapter(适配器类):模式的核心类,作为转换器对Target和Adaptee进行适配。 ​ (3)Adaptee(适配者类):定义了需要适配的接口。 ​ (4)Client(客户类):针对目标抽象类编程,调用其定义的方法。 ​ 3、类适配器和对象适配器的比较: ​ 类适配器中,适配器类通过实现Target接口并继承Adaptee类,实现适配目的。 ​ public class Adapter extends Adaptee implements Target { //request()方法为Target接口里所定义的方法 public void request() { specificRequest();//该方法为Adaptee类里定义的方法 } } 对象适配器中,适配器类通过继承Target类并关联一个Adaptee对象,实现适配目的。 ​ public class Adapter extends Target { private Adaptee adaptee;//所关联的适配者类的对象 public Adapter(Adaptee adaptee) { this.adaptee=adaptee; } public void request() { adaptee.specificRequest(); } } 4、案例分析:(机器人)使用的是类适配器模式 ​ (1)目标抽象类 Robot ​ public interface Robot { public void cry(); public void move(); } (2)适配者类 Dog ​ public class Dog { public void shout() { System.out.println("狗可以汪汪叫!"); } public void run() { System.out.println("狗可以跑!"); } } (3)适配器类 DogAdapte ​ public class DogAdapter extends Dog implements Robot { public void cry(){ System.out.print("机器人模仿:"); super.shout(); } public void move(){ System.out.print("机器人模仿:"); super.run(); } } 5、模式优缺点: ​ (1)优点:将目标类和适配者类解耦,更换添加适配器方便简单,增加了类的复用性。 ​ (2)缺点:类适配器模式一次只能适配一个适配者类,目标抽象类只能为接口,具有一定的局限性;对象适配器模式很难置换适配者类的方法。 ​ 6、模式应用: ​ (1)通过 JDBC 连接数据库时加载数据库驱动利用了适配器模式。不同数据库的驱动都是介于 JDBC 接口和数据库引擎接口(如Oracle)之间的适配器软件。 ​ (2)框架 Spring 的组成之一 Spring AOP 中,BeforeAdvice、AfterAdvice、ThrowsAdvice 三种通知类型是借助适配器模式实现的,AdvisorAdapter 是一个适配器接口,源码如下: ​ public interface AdvisorAdapte { //将一个 Advisor 适配成 MethodIntercepto MethodInterceptor getInterceptor(Advisor advisor); //判断此适配器是否支持特定的 Advice boolean supportsAdvice(Advice advice); } (3)JDK类库中n的一些适配器类,如 InputStreamAdapter 类用于包装 ImageInputStream 接口及其子类对象,使用对象适配器模式。 ​

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

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部分的功能。

用户登录
用户注册