zoukankan      html  css  js  c++  java
  • Spring中的BeanUtils与apache commons中的BeanUtils用法[1]

    1. 前言

    在开发过程中,经常遇到把要给一个bean的属性赋给另外一个bean。最笨的方法是每个属性都单独写一个,聪明的方法是应用反射写一个工具方法。考虑到这个需求基本每个程序员都会遇到,那么一定已经有人完成了类似的代码。搜一下,发现了Spring和apache commons都提供了这个方法,并且二者之间有点不同。在这里记录一下这个两个类的基本用法以及二者的区别。不过,除了这两个类,应该还有很多类似的类都提供了此功能。

    BeanUtils默认有好多方法,这篇主要描述copyProperties这个方法。

    2. bean的定义

    首先定义两个bean。

    public class BeanA {
        private String name1;
        private String name2;
        private List<String> nameList;
       
        public String getName1() {
            return name1;
        }
        public void setName1(String name1) {
            this.name1 = name1;
        }
        public String getName2() {
            return name2;
        }
        public void setName2(String name2) {
            this.name2 = name2;
        }
        public List<String> getNameList() {
            return nameList;
        }
        public void setNameList(List<String> nameList) {
            this.nameList = nameList;
        }
    }
    
    public class BeanB {
        private String name1;
        private String name2;
        private List<String> nameList;
        public String getName1() {
            return name1;
        }
        public void setName1(String name1) {
            this.name1 = name1;
        }
        public String getName2() {
            return name2;
        }
        public void setName2(String name2) {
            this.name2 = name2;
        }
        public List<String> getNameList() {
            return nameList;
        }
        public void setNameList(List<String> nameList) {
            this.nameList = nameList;
        }
    }
    

    3. 基本的赋值

    两个工具类都提供了copyProperties的方法,满足对象复制的需求,其用法如下所示。

        public static void springTest1() {
            BeanA ba = new BeanA();
            BeanB bb = new BeanB();
            ba.setName1("ba-name1");
            ba.setName2("ba-name2");
            org.springframework.beans.BeanUtils.copyProperties(ba, bb);
            System.out.println(bb.getName1());
            System.out.println(bb.getName2());
        }
    
        public static void apacheTest1() {
            BeanA ba = new BeanA();
            BeanB bb = new BeanB();
            ba.setName1("ba-name1");
            ba.setName2("ba-name2");
            try {
                org.apache.commons.beanutils.BeanUtils.copyProperties(bb, ba);
            } catch (Throwable t) {
            }
            System.out.println(bb.getName1());
            System.out.println(bb.getName2());
        }
    

    需要注意的地方是,二者调用参数的顺序是相反的。

    4. 只部分赋值

    在对象间相互复制的时候,经常有只给部分字段赋值的需求。spring和apache commons用两种方式实现了这个需求。
    spring的方式是可以设置ignore的property,可以有多个property;apache commons的做法是可以给某一个属性赋值。

        public static void springTest2() {
            BeanA ba = new BeanA();
            BeanB bb = new BeanB();
            ba.setName1("ba-name1");
            ba.setName2("ba-name2");
            bb.setName1("bb-name1");
            org.springframework.beans.BeanUtils.copyProperties(ba, bb, "name1");
            System.out.println(bb.getName1());
            System.out.println(bb.getName2());
        }
    
        public static void apacheTest2() {
            BeanA ba = new BeanA();
            BeanB bb = new BeanB();
            ba.setName1("ba-name1");
            ba.setName2("ba-name2");
            bb.setName1("bb-name1");
            bb.setName2("bb-name2");
            try {
                org.apache.commons.beanutils.BeanUtils.copyProperty(bb, "name1", ba);
            } catch (Throwable t) {
            }
            System.out.println(bb.getName1());
            System.out.println(bb.getName2());
        }
    

    5. 关于引用类型

    对于引用类型,二者都是修改引用地址。也就是说,如果修改了源对象里面的引用,则目标对象也会相应进行修改。

        public static void springTest3() {
            BeanA ba = new BeanA();
            BeanB bb = new BeanB();
            List<String> list = new ArrayList<String>();
            list.add("list-a-1");
            ba.setNameList(list);
            org.springframework.beans.BeanUtils.copyProperties(ba, bb);
            list.add("list-a-2");
            System.out.println(bb.getNameList().size());
        }
    
        public static void apacheTest3() {
            BeanA ba = new BeanA();
            BeanB bb = new BeanB();
            List<String> list = new ArrayList<String>();
            list.add("list-a-1");
            ba.setNameList(list);
            try {
                org.apache.commons.beanutils.BeanUtils.copyProperties(bb, ba);
            } catch (Throwable t) {
            }
            list.add("list-a-2");
            System.out.println(bb.getNameList().size());
        }
    

    输出

    2
    2
    

    6.需要注意的地方

    使用BeanUtils的成本惊人地昂贵。人做了一个简单的测试,BeanUtils所花费的时间要超过取数 据、将其复制到对应的 value对象(通过手动调用get和set方法),以及通过串行化将其返回到远程的客户机的时间总和。

    [这条我没有测试过]
    

    7.参考

    Spring 中的BeanUtils与apache中的BeanUtils用法与比较
    spring的BeanUtils.copyProperties用法

  • 相关阅读:
    C#入门分享(三)——C#常量与变量
    C#入门分享(二)——Visual Studio的应用与C#基本语法
    使用Axure设计基于中继器的左侧导航菜单
    关于C#调用非托管DLL,报“内存已损坏的”坑,坑,坑
    SQLserver 查询某个表的字段及字段属性
    关于数据库新建用户提示“用户、组或角色‘’XXX‘’在当前数据库中已已存在”的解决办法
    (转载)sqlserver2008”备份集中的数据库备份与现有的XX数据库不同”解决办法
    sql server 查询表字段的说明备注信息
    (转)软件产品化,对客户意味着什么?
    (转)软件产品化,国内IT人之痛
  • 原文地址:https://www.cnblogs.com/wardensky/p/4716981.html
Copyright © 2011-2022 走看看