前言
笔者在前几篇博客中对MiniBus做了一些简单的介绍,包括MiniBus的目的、应用场景、使用方式等。那么从本章开始,笔者将会对MiniBus进行更为细致的讲解。如果感兴趣的朋友,或者正在寻找Bean自动赋值组件的朋友请耐心听笔者讲解。
目录
一、MiniBus简介;
二、下载与安装MiniBus;
三、逐行标记实现字段的自动赋值;
四、定义字段备用名称与备用名称组;
五、所有字段的自动赋值;
六、MiniBus性能测试;
一、MiniBus简介
MiniBus是一个体系结构中立、简单灵活、性能高效,且无需依赖于任何Web容器运行的Bean自动赋值组件。那么什么是自动赋值呢?大家思考下,在实际的开发过程中,开发人员经常需要将一个POJO中的字段赋值到另外一个POJO中的字段中,一般来说我们都是直接采用Set的方式手动赋值,不过一旦字段多达几十个的时候,这就纯粹成了“体力活”,并且伴随着一定的风险。
并且这种应用场景时常出现在数据库实体Bean与POJO之间。当我们在使用ORM框架后,实体Bean无疑对应的就是数据库表,那么表的查询记录必然就会存储在实体Bean中,但往往我们需要将存储在实体Bean中的值重新存储于POJO字段中进行传递,不可能直接将实体Bean用作返回。那么这个时候我们就需要一种机制,自动帮我们实现这些繁琐的赋值操作。
MiniBus诞生的目的已经很明显了,你无需再关心这些基础作业层,尽可能的关注业务即可。MiniBus在使用上相当方便,你可能只需要花上几分钟便能掌握该组件的使用,并且你完全不用担心MiniBus是否稳定,因为MiniBus最新版本的单元测试覆盖率已经达到86%以上,所以你完全抛开后顾之忧。
MiniBus1.0.3版本核心代码单元测试覆盖率:
二、下载与安装MiniBus
大家可以登录http://code.google.com/p/sapphire-cache/downloads/detail?name=minibus-1.0.3-RC1.jar&can=2&q=#makechanges下载MiniBus的最新版本,目前MiniBus的最新版本为1.0.3-RC1稳定版。
当大家成功下载好MiniBus后,便可以引入至项目中。目前MiniBus暂时没有开源,不过在后续版本中,MiniBus将会实现开源,希望大家谅解。
三、逐行标记实现字段的自动赋值
一般来说我们将字段需要被赋值的POJO称之为目标对象,而赋值对象我们则称之为源对象。在使用MiniBus进行源对象与目标对象赋值过程中,我们需要明确几个非常重要的概念:
1、目标对象必须标记@Assignment注解;
2、MiniBus支持部分字段与所有字段的自动赋值操作;
3、部分字段赋值必须为字段标记@Paramater注解,所有字段赋值必须对目标对象标记@AutoParameters注解;
4、目标对象字段“无需”与源对象字段名称保持一致;
咱们首先来看看,如何使用MiniBus实现部分字段的自动赋值操作。
定义源对象:
public class UserInfoBean {
private int id;
private String name;
/* 此处省略set和get方法 */
}
接着我们为目标对象标记好@Assignment注解,并且在需要被赋值的字段上标记@Paramater注解。如果你希望目标对象中的某些字段不被自动赋值,则无需标记@Paramater注解。
定义目标对象:
@Assignment
public class UserInfoBean2 {
@Paramater
private int id;
@Paramater
private String name;
/* 此处省略set和get方法 */
}
当定义好目标对象与源对象后,我们接着只需要使用MiniBus提供的AnnotationContext抽象类的setParam(T goalObject, K sourceObject)方法即可实现POJO之间的自动赋值操作。
setParam(T goalObject, K sourceObject)方法包含2个参数,第一个为目标对象,第二个则为源对象,所以大家在传递参数的时候,务必保持先后顺序,否则将无法实现字段的自动赋值。
使用AnnotationContext实现POJO之间的自动赋值:
/**
* @param args
*/
public static void main(String[] args) {
UserInfoBean userInfoBean = new UserInfoBean();
userInfoBean.setId(1);
userInfoBean.setName("MiniBus");
UserInfoBean2 userInfoBean2 = new UserInfoBean2();
/* 执行自动赋值操作 */
AnnotationContext.setParam(userInfoBean2, userInfoBean);
System.out.println(userInfoBean2.getId());
System.out.println(userInfoBean2.getName());
}
四、定义字段备用名称与备用名称组
上述程序示例,笔者演示了如何使用@Paramater注解标注字段实现部分字段的自动赋值操作。不知大家有没有发现一个问题,笔者在上一章节中提及过,目标对象的字段名称无需与源对象字段名称保持一致。POJO之间字段名称真的不需要保持一致吗?答案是否定的。因为MiniBus实现自动赋值的前提就是相同的字段名称。别着急,笔者明白在实际开发过程中,POJO之间的字段名称可能由于业务的不同,不可能保持一致,但又需要实现自动赋值,那么该怎么办呢?其实开发人员可以使用@Paramater的value属性进行字段名称的二次定义。
使用@Paramater的value属性:
@Paramater("id")
private int infoId;
这是又有开发人员会问,有没有办法可以为目标对象的字段多定义几个名称备用,因为目标对象的字段可能还需要N个源对象的自动赋值,值得庆幸的是,MiniBus仍然支持。这便是使用@Paramater的beanNames属性定义一组字段名称。
使用@Paramater的beanNames属性:
@Paramater(beanNames = { "id1", "id2", "id3" })
private int infoId;
beanNames属性允许传递的参数为字符序列,该序列中允许开发人员为目标对象字段定义一组字段名称,无论N个源对象的字段名称为何,我们只需要在目标对象中定义好对应的即可,这样既可以在不改变业务字段的前提下,又可以达到实现自动赋值的效果。
五、所有字段的自动赋值
上述程序示例,笔者演示了如何使用@Paramater注解标注字段实现部分字段的自动赋值操作。但如果需要被自动赋值的字段较多时,我们任然使用@Paramater注解的方式逐行标记,则太过于痛苦。所以当需要为目标对象的所有字段进行自动赋值是,便可以为目标对象标记@AutoParameters即可。
使用@AutoParameters实现自动赋值:
@Assignment
@AutoParameters
public class UserInfoBean2 {
private int id;
private String name;
/* 此处省略set和get方法 */
}
当为目标对象标记@AutoParameters注解后,则意味着目标对象的所有字段都需要实现自动赋值。那么我们需要在使用@AutoParameters注解后就舍弃@Paramater注解吗?答案是否定的,因为@Paramater注解作用于目标对象字段,我们可以进行字段名称的二次定义,也就是说如果希望目标对象的所有字段都被自动赋值,但POJO之间的字段名称又不一致的时候,则可以在不一致的字段上标记@Paramater进行字段名称的二次定义或者定义一组字段名。
使用@Paramater与@AutoParameters注解联用:
@Assignment
@AutoParameters
public class UserInfoBean2 {
@Paramater("id2")
private int id;
private String name;
/* 此处省略set和get方法 */
}
@AutoParameters可以失效吗?答案是肯定的,@AutoParameters注解的value属性缺省为true时则意味着目标对象的所有字段均可以自动赋值,如果为false时,则失效。
让@AutoParameters失效:
@AutoParameters(false)
七、MiniBus性能测试
MiniBus的是一个具备灵活高性能的Bean自动赋值组件,笔者在测试过程中,100个字段的自动赋值操作,且字段数据容量大约在100MB左右,其时间消耗周期仅为<=25MS,所以完全能够轻松胜任大数量的POJO之间的自动赋值操作。