浅析Java中Apache BeanUtils和Spring BeanUtils的用法

浅析Java中Apache BeanUtils和Spring BeanUtils的用法

在Java中,BeanUtils是常用的一个实用工具类库,提供了对JavaBean属性的快速读写、类型转换等操作,而在Spring框架中,也有BeanUtils提供了一些符合Spring容器特性的扩展功能,下面将会对Apache BeanUtils和Spring BeanUtils进行详细的介绍。

Apache BeanUtils

Apache BeanUtils是Apache Commons项目的一部分,是一个Java的开源库,在Java中的主要功能是为JavaBean提供属性的拷贝、值的获取、值的设置、属性值的复制等操作。Apache BeanUtils提供了许多方法用于获取、设置和拷贝属性,同时还提供了类型转换等功能。

基本使用

首先需要导入BeanUtils的maven依赖

<dependency>
  <groupId>commons-beanutils</groupId>
  <artifactId>commons-beanutils</artifactId>
  <version>1.9.4</version>
</dependency>

然后在代码中可以通过如下方式进行使用:

public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException {
    if (dest == null) {
        throw new IllegalArgumentException("No destination bean specified");
    }
    if (orig == null) {
        throw new IllegalArgumentException("No origin bean specified");
    }
    if (dest.getClass().isAssignableFrom(orig.getClass())) {
        return;
    }
    PropertyDescriptor[] origDescriptors = getPropertyDescriptors(orig.getClass());
    for (PropertyDescriptor origDescriptor : origDescriptors) {
        String name = origDescriptor.getName();

        if ("class".equals(name)) {
            continue;
        }
        if (isReadable(origDescriptor)) {
            PropertyDescriptor destDescriptor = getPropertyDescriptor(dest.getClass(), name);
            if (destDescriptor != null && isWriteable(destDescriptor)) {
                Object value = getSimpleProperty(orig, name);
                copyProperty(dest, name, value);
            }
        }
    }
}

在上述代码中,copyProperties方法对于目标对象(dest)和原始对象(orig)的属性进行复制,若两个对象类型不同则会进行类型转换。需要注意的是,在调用方法时需要处理 IllegalAccessException 和 InvocationTargetException 异常。

类型转换

Apache BeanUtils 还提供了类型转换的方法,其定义如下:

public static Object convert(Object value, Class<?> type)

其中value为需要转换的对象,type为转换类型,使用方法如下:

Integer integer = (Integer)BeanUtils.convert("10", Integer.class);
System.out.println(integer);//输出10

示例

下面为一个使用示例:

public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
    User user = new User("John", "Doe", 25);
    Map<String, Object> map = new HashMap<>();
    BeanUtils.describe(user, map);

    for (Map.Entry<String,Object> entry : map.entrySet()){
        System.out.println(entry.getKey() + " : " + entry.getValue());
    }
}

class User {
    private String firstName;
    private String lastName;
    private int age;

    public User(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    // getter and setter
}

在上述代码中,我们定义了一个User类,并对该类的属性进行了get、set方法的定义。在main函数中,通过BeanUtils.describe方法对于一个User对象进行属性值的获取,并将其存储到了一个HashMap中,然后在for循环中遍历HashMap并输出。

输出结果如下:

lastName : Doe
firstName : John
class : class com.example.User
age : 25

Spring BeanUtils

除了Apache BeanUtils之外,在Spring框架中也提供了BeanUtils,其提供了一些符合Spring框架特性的扩展功能,常见的用法如下:

基本使用

Spring BeanUtils提供了BeanUtils.copyProperties方法用于属性的复制,可以通过如下方式进行使用:

BeanUtils.copyProperties(source, target);

在上述代码中,source是原始对象,target是目标对象,Spring BeansUtils 会将原始对象的所有属性值复制到目标对象中。

支持忽略null值和空值

在属性复制过程中,有时候需要忽略null值和空值,此时可以通过设置BeanUtils中copyProperties的ignoreNullProperties和ignoreEmptyProperties参数来实现,在参数设置为true的情况下,BeanUtils会自动过滤掉源对象中null或者空值的属性。

BeanUtils.copyProperties(source, target, "id", "name", "age");

在上述代码中,我们传递了一个参数数组,用于忽略某些属性的复制。

示例

下面为一个使用示例:

public static void main(String[] args) {
    User user = new User("John", "Doe", 25);
    UserInfo userInfo = new UserInfo();
    BeanUtils.copyProperties(user, userInfo);
    System.out.println(userInfo);
}

class User {
    private String firstName;
    private String lastName;
    private int age;

    public User(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    // getter and setter
}

class UserInfo {
    private String name;
    private int age;

    // getter and setter
}

在上述代码中,我们定义了一个User类和一个UserInfo类,创建了一个User对象,并使用 BeanUtils.copyProperties 将其属性值复制到了 UserInfo 对象中,最后输出 UserInfo 对象,输出结果如下:

UserInfo{name='John Doe', age=25}

结论

总之,无论是Apache BeanUtils还是Spring BeansUtils都是对于JavaBean属性值复制的一种工具,使用方法十分简单,同时还支持类型转换、忽略null值和空值等功能,方便应用在不同的场景中,开发人员可根据具体的需求选择合适的方法进行操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析Java中Apache BeanUtils和Spring BeanUtils的用法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 使用JWT作为Spring Security OAuth2的token存储问题

    使用JWT(JSON Web Token)作为 Spring Security OAuth2 的 token 存储方案,可以避免服务器端存储 token 所带来的开销和管理复杂度,并且具有无状态、分布式、可扩展、自包含等优点,在实际开发中非常实用。下面是一份完整攻略: 1. 引入相关依赖 在 pom.xml 中添加 spring-security-jwt 依…

    Java 2023年6月3日
    00
  • hackathon 复盘:niche 海外软件工具正确的方法 6 个步骤

    上周末,去参加了北京思否 hackathon,两天时间内从脑暴 & 挖掘软件 IDEA -> Demo 研发路演,这次经历让我难忘。这里我的看法是每个开发者圈友,都应该去参加一次 hackathon ~ 做 niche 软件正确的方法 这边先说结论,如图。我认为 做 niche 软件正确的方法 或 6 个步骤 是: 发现用户的问题或痛点 明确问…

    Java 2023年4月22日
    00
  • 实例讲解java定时任务

    实例讲解Java定时任务的攻略如下: 1. 什么是Java定时任务? Java定时任务是指在预定的时间或间隔时间自动执行任务的一种机制,通常用于需要周期性执行的操作。Java常见的定时任务框架有Timer、ScheduledExecutorService和Quartz等。 2. Java定时任务的实现方式 2.1 Timer Timer是Java自带的定时任…

    Java 2023年6月1日
    00
  • Java Runtime Environment怎么安装 JRE安装详细图文教程

    Java Runtime Environment怎么安装 JRE安装详细图文教程 什么是Java Runtime Environment Java Runtime Environment (JRE)是一个程序开发环境,它由包含Java运行时所需的库和系统组件的集合组成。JRE允许用户在电脑上运行Java编写的程序和Applet。 安装Java Runtime…

    Java 2023年5月26日
    00
  • JVM调优的方法有哪些?

    JVM调优是保障应用性能的重中之重。它可以通过不同的方法来优化JVM,提升应用的性能。下面是JVM调优的方法。 JVM调优方法 优化JVM的参数设置 JVM的性能与调优参数密不可分。参数的设置可以通过启动时传递参数、修改配置文件、通过代码调用等方式。常用的参数设置包括: -Xms和-Xmx: 设置Java堆的最小和最大值 -XX:MaxPermSize: 设…

    Java 2023年5月10日
    00
  • Spring Native项目实战(体验79毫秒启动springboot应用)

    Spring Native是Spring Boot的一个扩展,它可以将Spring Boot应用程序编译成本地可执行文件,从而提高应用程序的启动速度和性能。在本攻略中,我们将详细介绍如何使用Spring Native,并提供两个示例来说明其用法。 以下是两个示例,介绍如何使用Spring Native: 示例一:使用Spring Native编译Spring…

    Java 2023年5月15日
    00
  • jsp使用cookie存储中文示例分享

    使用Cookie存储中文字符是Java Web开发常见的一个问题,本攻略主要介绍使用JSP存储中文字符到Cookie中的方法。具体操作如下: 1. 添加Cookie 使用JSP的Cookie类的setValue()函数,可以在Cookie中存储中文字符。示例代码如下: <% //新建一个中文Cookie Cookie cookie = new Cook…

    Java 2023年6月15日
    00
  • 简单易懂的MyBatis分库分表方案分享

    关于“简单易懂的MyBatis分库分表方案分享”的完整攻略,我将分为以下几个方面进行讲解。 一、MyBatis分库分表的优劣势 首先,我们要明确 MyBatis 分库分表的优劣势,以便能够更好地理解 MyBatis 分库分表的方案。 优势 可以扩展数据库的存储容量:因为数据量越来越大,单表可能会存储不下,分库分表可以将数据分散存储,从而扩展数据库的存储容量。…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部