Spring 作为一个轻量级的开发框架就不用我做过多的介绍了吧.如果再仔细去研究一下 Spring ,可以发现Spring的代码中作为支持Spring运行的很多工具类也是很优秀的,不要再添加额外的工具类甚至就可以完成一些优秀的功能可谓是方便至极,这里介绍一下 BeanUtils.copyProperties(Object source,Object target)
这个方法,并且连带它的一些应用场景.
介绍
定义一个 User 对象:
@Data
public class User{
private String name;
private String age;
private String gender;
private String address;
public User(String name,String age){
this.name = name;
this.age = age;
}
}
首先,这个方法可以将一个对象的属性拷贝到另外一个对象上.在一些场景下,对象有上百个属性需要拷贝时,用这个方法就很方便了.这里不去对浅拷贝,深拷贝去做介绍(况且我也不太明白那些是什么意思)
User1 user1 = new User1("zhangsan",23);
// User2具有和User1相同的属性,但是为不同的类
User2 user2 = new User2();
BeanUtils.copyProperties(user1,user2);
System.out.println(user2);
//{"name":"zhangsan","age":23}
下面介绍一下 BeanUtils.copyProperites(source,target)
这个方法的一些特性:
- 被拷贝的两个对象 不要求 类相同
- 被拷贝的属性要求有
getter
和setter
方法,并且类型保持一致,否则 Spring 会认为属性不同,不会Copy
关于 BeanUtils.copyProperties
的一些高级特性
除了上面的使用方式以外, BeanUtils.copyProperties
还有一些其他使用方法,下面对这些方法做一些简单的介绍:
public static void copyProperties(Object source, Object target, Class<?> editable)
// 通过 editable 属性可以指定要拷贝的属性,如下:
public interface IUser1{
String getName();
String getAge();
}
// 通过指定 IUser1 可以指定只拷贝 name 和 age 这两个属性
BeanUtils.copyProperties(user1,user2,IUser1.class);
public static void copyProperties(Object source, Object target, String... ignoreProperties)
// 通过 ignoreProperties 可变参数用于指定不拷贝哪些属性
// 通过指定忽略 name 和 address 两个属性可以避免这两个属性被拷贝
BeanUtils.copyProperties(user1,user2,"name","address");
注意事项
除了 Spring 本身实现了一个 BeanUtils 之外,Apache 也有一个通用的工具类 BeanUtils,在使用的时候避免导包错误:
import org.springframework.beans.BeanUtils;