引入高级系统架构师JohnGao的一个开源成果------MiniBean
MiniBean的基本使用方式
1、使用MiniBean来构建自动赋值应用场景
在开始在你的代码中使用MinBean之前,我们首先应该下载MiniBean所需的构件。值得庆幸的是,MiniBean并没有依赖除了Java API之外的其他构件,也就是说使用MiniBean你将完全不必下载其他的第三方构件。MiniBean目前的最新版本是2.0.1,该版本目前较为稳定,单元测试覆盖率已经达到85%以上,完全可以满足RC版本的要求。 当成功下载好MiniBean的主要构件后,我们需要将它引入至项目中。然后我们接下来看看如何在程序中使用MiniBean来实现Beans属性元素之间的自动赋值。我们首先应该预先定义好2个Bean(分别为目标对象与源对象)。
定义源对象Bean:
publicclassTestBeanA{ privateint id; privateString name =null; privateString pwd =null; /* 此处省略set和get方法 */}
定义目标对象Bean:
@AssignmentpublicclassTestBeanB{ @Paramater privateint id; @Paramater privateString name; @Paramater privateString pwd; /* 此处省略set和get方法 */}
当成功定义好目标对象Bean与源对象Bean以后,我们首先来看看目标对象的类型的上方,标记了一个注解叫做@Assignment。该注解用于标记目标对象Bean,其作用域为类型,只有标记了该注解的Bean才能实现后续的自动赋值操作。而@Paramater注解则用于标记在赋值过程中需要被源对象赋值的目标对象中的指定字段,只有在字段的上方标记有@Paramater注解时,MiniBean才会对其进行赋值注入。@Paramater除了允许标记在字段上,还允许标记在方法上,也就是说@Paramater注解的作用域是字段与方法。
接下来我们使用MiniBean提供的BeanContext组件实现Beans之间的自动赋值操作:
@Testpublicvoid test1(){ TestBeanA sourceObject =newTestBeanA(); sourceObject.setId(1); sourceObject.setName("JohnGao"); sourceObject.setPwd("123456"); TestBeanB goalObject =newTestBeanB(); /* 实现自动赋值操作 */ BeanContext.setParam(goalObject, sourceObject); /* 单元测试预期值与实际值是否匹配 */ Assert.assertEquals(goalObject.getId(), sourceObject.getId()); Assert.assertEquals(goalObject.getName(), sourceObject.getName()); Assert.assertEquals(goalObject.getPwd(), sourceObject.getPwd());}
上述程序示例我们可以看出,BeanContext类型是作为整个Beans赋值操作的入口容器,由该类型负责将目标对象与实际对象之间数据进行共享牵引。该方法对外包含一个公共方法setParam(goalObject, sourceObject),该方法的第一个参数用于传递目标对象,而后一个用于传递源对象。所以大家在使用时一定要注意参数传递的顺序,切勿将顺序反转,以免发生一些不必要的错误。
2、使用@Paramater定义目标对象字段的备用名称与备用名称组
在实际的开发过程中,我们不可能要求Beans均保持相同的字段名称,因为这需要根据实际的业务需求而定。所以MiniBean考虑到了这一点,为开发人员提供有字段的备用及备用名称组功能供其使用。如果我们需要在目标对象的字段定义备用名称,则需要使用@Paramater注解的value、name或names属性。value属性用于定义目标对象字段的备用名称,而name属性同样也用于备用名称定义,只不过value属性是缺省的,而name属性则是显式定义的,除此之外没有其他区别。也就是说在程序中如果显示定义有name属性则重写value属性的定义。而names属性则用于定义字段的备用名称组,也就是说一个字段可以拥有N个备用名称,在运行时,MiniBean会根据源对象字段的名称匹配备用名称组中对应的名称。
定义目标对象字段的备用名称:
@AssignmentpublicclassTestBeanD{ @Paramater("id") privateint userId; @Paramater(name ="name") privateString userName; @Paramater(names ={"pwd","pwd2","pwd3"}) privateString passWord; /* 此处省略set和get方法 */}
从上述程序示例中,我们使用了@Paramater中包含的3种有效属性来定义目标对象字段的备用名称和备用名称组。值得注意的是,value属性和name属性的类型都是String类型,只有names属性是String类型,所以大家在定义属性名称的时候一定要注意。
3、使用@AutoParameters实现目标对象所有字段的赋值注入
任何事情都没有万一的,如果Beans之间的字段名称都是相同的时候,还采取@Paramater的方式进行定义则显得过于繁琐。所以MiniBean提供有@AutoParameters注解用于标记目标对象中所有的字段都允许被源对象赋值注入。@AutoParameters注解的作用域仅限于类型,所以千万不要将该注解标记与字段或者方法上,否则编译时将会出现错误。并且一旦在程序中使用了@AutoParameters注解,我们完全可以去除掉字段上的@Paramater注解,当然@Paramater和@AutoParameters注解也可以混合使用,以此满足一些特定的应用场景。
使用@AutoParameters和@Paramater混合字段注入:
@Assignment@AutoParameterspublicclassTestBeanF{ privateint id; @Paramater("name") privateString userName; @Paramater(names ={"pwd1","pwd2","pw3"}) privateString passWord; /* 此处省略set和get方法 */}
在@AutoParameters注解内部,定义有一个缺省的value属性。该属性缺省值为“true”,也就是说@AutoParameters可以生效,一旦value属性为“false”的时候,@AutoParameters则失效。一点@AutoParameters失效后,目标对象中如果没有标记@Paramater的字段MiniBean将不再为其提供赋值注入。
@AutoParameters失效:
@AutoParameters(false)
4、使用ignore属性定义字段名称的大小写兼容
或许在某些应用环境下,我们往往要考虑相同的字段名称,但大小写却不一致的情况下的自动赋值操作。Java是一门强类型的语言,不仅仅会检查类型的兼容,同样变量名称的大小写也是区分的。所以这个时候,如果使用MiniBean进行Bean之间的自动赋值操作,我们就需要考虑有什么办法可以做到相同的字段名,但大小写不一致的情况,仍然能够实现自动赋值操作。MiniBean在@Paramater和@AutoParameters注解内部提供有ignore属性供开发人员选择,该属性的作用就是用于定义是否兼容字段的大小写,缺省情况下ignore的值为“false”,即不开启大小写兼容,反之则为开启。
使用ignore属性开启字段名称的大小写兼容:
@Assignment@AutoParameters(ignore =true)publicclassTestBeanK{ privateintId; @Paramater privateString name; @Paramater(ignore =true) privateStringPwd; /* 此处省略set和get方法 */}
5、一对多的自动赋值操作
在前面几个章节中,我们更多演示的是如果使用MiniBean进行目标对象和源对象之间的一对一自动赋值操作。那么如果我们有多个目标对象都需要与源对象之间进行自动赋值操作的时候,MiniBean是否提供有良好的支持呢?值得庆幸的是MiniBean提供有高效、便捷的一对多赋值策略实现一个源对象与多个目标对象之间的自动赋值操作。 我们可以使用BeanContext抽象类的setParams(Set goalObjects, K sourceObjects)方法实现一对多的自动赋值操作。和setParam方法不同的是,setParams方法的第一个参数为目标对象集合,也就是说开发人员只需要将需要实现自动赋值的目标对象集合存储进一个Set列表中即可完成一对多的自动赋值操作。
使用一对多的赋值策略:
@Testpublicvoid test11(){ TestBeanA sourceObject =newTestBeanA(); sourceObject.setId(1); sourceObject.setName("JohnGao"); sourceObject.setPwd("123456"); Set goalObjects =newHashSet(); TestBeanK testBeanK =newTestBeanK(); TestBeanL testBeanL =newTestBeanL(); goalObjects.add(newTestBeanK); goalObjects.add(newTestBeanL); BeanContext.setParams(goalObjects, sourceObject); }
相关推荐
Java CopyUtil工具类,可以进行对象的深copy,比如:对象里面包含对象,对象里面包含Map,List,Set...等复杂类型的属性都可以copy,copy后的对象与原有对象没有联系,即改变原有对象内容,不会改变copy后的对象里面的...
Java中的对象复制与克隆是程序开发中常见的需求,主要用于创建一个对象的副本,而不会影响原始对象的状态。这里主要讨论两种类型的对象拷贝:浅拷贝和深拷贝。 浅拷贝,也称为表面拷贝,是创建一个新的对象,然后将...
标题中的"java_copy.rar_ java_copy"提示我们这是一个与Java编程相关的学习资源,可能是学生代码示例或练习项目。描述中的"this is a student code"进一步证实了这一点,表明这是一份学生编写的Java代码。 在Java...
在Java编程中,对象复制是一项常见的任务,特别是在处理模型(Model)和视图对象(VO)时。模型对象通常用于封装业务数据,而视图对象则用于展示这些数据。值复制,即对象属性值的复制,是保持数据一致性和简化代码...
标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到原始对象。 **浅拷贝**:在浅拷贝中...
本篇文章将深入探讨Java中的对象、基础类型以及数据处理相关的工具类。 首先,让我们关注Java中的基础类型。Java有八种原始数据类型:byte、short、int、long、float、double、char和boolean。为了方便处理这些类型...
4. **集合复制**: 当需要复制一个集合到另一个集合时,Java提供了`Collection#copy`方法和`Arrays#copyOf`方法进行基本的复制,但这仅限于元素是不可变对象的情况。对于可变对象,需要进行深复制,可以使用`Stream` ...
而深复制(Deep Copy)则是不仅复制对象本身,还递归地复制它引用的对象,确保新对象与原对象及引用的对象完全独立。 在Android中,我们常常需要复制Parcelable或Serializable类型的对象,因为它们是Android系统...
下面是对给定代码片段的详细分析,该代码展示了如何使用反射来复制一个Java对象: ```java public static Object copy(Object object) throws Exception { Class<?> classType = object.getClass(); Object ...
在标题“编程语言java对象复制.pdf”和描述“编程语言java对象复制.pdf”中,明确指出了文档的主题是关于Java编程语言中对象复制的技术知识。在给出的内容部分中,通过具体的Java代码示例,讨论了在Java中实现对象...
在Java编程中,数据结构是程序设计的基础,而List接口作为集合框架的重要组成部分,常常用于存储有序的元素序列。当我们需要复制一个List时,可能会遇到浅复制和深复制的概念。浅复制只复制对象本身,而不复制它引用...
在Java编程中,深拷贝和浅拷贝是两种常见的对象复制方式,它们涉及到对象的内存管理和内存层次的复制。本文将深入探讨这两个概念,并通过一个具体的示例——`CopyTest`来阐述它们的区别。 首先,浅拷贝(Shallow ...
实现了两个对象之间属性值的拷贝,只要具有相同的属性名就可以拷贝,还有两个file对象的拷贝,实现文件的复制功能
Java对象复制主要分为浅复制(Shallow Copy)和深复制(Deep Copy)。本文将深入探讨Java对象复制,特别是通过`clone()`方法实现的复制。 首先,我们来理解什么是对象复制。对象复制是指创建一个新对象,这个新对象...
本资源"java-fileCopy.zip_JavaFiles.copy_java_java File 复制_java copyfiel"提供了一个关于如何使用Java语言实现文件及目录复制功能的示例。下面将详细解释相关知识点。 1. **Java File类**: Java中的`File`...
Java对象的复制主要有两种方式:浅复制(Shallow Copy)和深复制(Deep Copy)。标题中的"java对象复制"主要涉及到Java中对象复制的基本概念、实现方法以及相关的注意事项。 首先,Java中的对象复制问题源于其默认...
本主题主要关注如何使用Java来读取和写入Excel文件,特别是通过标题"JAVA-write-EXCEL.rar_copy excel java_java write_java读取_java读取Excel"所暗示的知识点。我们将探讨两个主要的API库:Apache POI和JExcelAPI...
在Java中,对象的默认复制是浅复制(shallow copy),这意味着只复制对象本身,而不复制它引用的对象。要实现深复制(deep copy),需要自定义`clone()`方法。下面我们将详细探讨Java中的克隆以及提供的实例代码。 ...
在 Java 中创建对象是面向对象编程语言的核心,类是创建对象的模板,类、对象和接口等构成了 Java 语言不可或缺的概念。创建对象是 Java 编程的基础,掌握对象的声明和实例化是必不可少的。 Java 语言提供了三种...