Bean-Mapping
In daily development, it is often necessary to assign the properties of one object to another.
There are many common tools, but they are not concise or powerful enough.
Spring bean utils, which we often use, has good performance, but not enough features.
Bean-Mapping It provides many rich features for daily development.
If you are looking for more extreme performance, you can consider the module implemented by asm, which is about 35% better than spring bean utils.
Characteristic
-
Support shallow copy of object properties
-
Support the assignment of different name fields
-
It supports the conditions of user-defined field property assignment. For example, the assignment can only be performed when the target field is not null
-
Support custom field value conversion, which can be converted to other types or the same type
-
It supports the assignment of attribute fields to object, set and array, which is more convenient.
- Support high performance replication based on asm
Quick start
get ready
JDK 1.7 and above
Maven 3.X and above
maven project dependency
<dependency> <groupId>com.github.houbb</groupId> <artifactId>bean-mapping-core</artifactId> <version>0.2.5</version> </dependency>
Core class description
BeanUtil
Provides a simple static method copyProperties.
/** * Copy properties * Assign the value in source to the type with the same name in target that can be assigned. BeanUtils similar to spring. * @param source Original object * @param target Target object */ public static void copyProperties(final Object source, Object target)
Test code reference
See the test code under bean mapping test module for details.
Sample code
Object definition
- BaseSource.java & BaseTarget.java
The properties of the BaseSource object and the BaseTarget object are the same.
public class BaseSource { /** * name */ private String name; /** * Age */ private int age; /** * Birthday */ private Date birthday; /** * String list */ private List<String> stringList; //getter & setter }
Property assignment test case
We build the properties of BaseSource and call
BeanUtil.copyProperties(baseSource, baseTarget);
Similar to spring beanautils and Apache beanautils, and verify the results meet our expectations.
/** * Basic test */ @Test public void baseTest() { BaseSource baseSource = buildBaseSource(); BaseTarget baseTarget = new BaseTarget(); BeanUtil.copyProperties(baseSource, baseTarget); // The property after assertion assignment is the same as the original Assertions.assertEquals(baseSource.getAge(), baseTarget.getAge()); Assertions.assertEquals(baseSource.getName(), baseTarget.getName()); Assertions.assertEquals(baseSource.getBirthday(), baseTarget.getBirthday()); Assertions.assertEquals(baseSource.getStringList(), baseTarget.getStringList()); } /** * Build user information * @return user */ private BaseSource buildBaseSource() { BaseSource baseSource = new BaseSource(); baseSource.setAge(10); baseSource.setName("Mapping test"); baseSource.setBirthday(new Date()); baseSource.setStringList(Arrays.asList("1", "2")); return baseSource; }
asm replication
brief introduction
Sometimes we have higher performance requirements than convenience requirements.
This framework also provides a replication method based on asm, and its performance is about 35% better than that of spring.
See the benchmark at the end of the article.
maven introduction
<dependency> <groupId>com.github.houbb</groupId> <artifactId>bean-mapping-asm</artifactId> <version>0.2.5</version> </dependency>
Test code
It is similar to beanutil ා copyproperties (object, object), but it does not support annotation and other more rich functions temporarily.
BaseSource baseSource = buildBaseSource(); BaseTarget baseTarget = new BaseTarget(); AsmBeanUtil.copyProperties(baseSource, baseTarget);
Expanding reading
In practice, the situation we encounter will be more complicated than this.
For example, if the names of the two fields are different, we also want to assign values, which is worth dealing with conversion, etc.
Deep learning
Documents related to bean mapping:
01 project module introduction and expected functions
Introduction of 02 bean mapping annotation
03 assignment of different name fields
04 - conditions for validity of custom assignment
05 implementation of custom field conversion
06 support the assignment of attribute fields to object, set and array
07 beanutil - copyproperties (object, class) method
performance
Comparison chart
It can be seen that the performance of the default bean mapping implementation of the framework is general, involving too many features, resulting in slightly lower replication performance than spring.
be based on reflectasm The performance of ASM bean mapping is better than that of spring.
For code examples, see BeanUtilBeanchmarkTest.java
expectation
Compared with the implementation of bean copier, the performance of our implementation still has a lot of room for improvement.
Later, you can consider the implementation of a bean copier like approach.
Open source address
The source code of this framework is all open source, which is also convenient for us to learn.