成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Boot 深藏的利器:BeanWrapper 解鎖對象屬性操作的終極姿勢!

開發 前端
當你的代碼中出現大量 ?obj.setXXX?、?obj.getXXX? 時,不妨試試 ?BeanWrapper?,你會發現它不僅節省代碼,更提升了架構的可維護性。?

在日常 Java 項目開發中,我們經常面對以下需求:

  • 給對象設置屬性;
  • 從對象中讀取值;
  • 對嵌套對象進行快速訪問或綁定;
  • 將表單或 Map 中的數據批量注入到 POJO。

傳統的 getter/setter 寫法雖然直觀,但當對象結構變復雜,比如嵌套屬性或集合字段時,代碼變得異常繁瑣。而 Spring 框架早就為開發者準備了一把“藏在角落里的瑞士軍刀”——BeanWrapper。

這是一個用于 JavaBeans 操作的低層接口,封裝了對象屬性訪問邏輯,支持嵌套屬性訪問、集合屬性賦值、類型轉換等功能。在數據綁定、動態表單構建、反射分析等場景中都可大展拳腳。

核心應用場景與 API 結構

在 com.icoderoad.beanwrapper 包下,我們通過以下幾個典型場景來全方位掌握 BeanWrapper:

  • 動態賦值:setPropertyValue 或 setPropertyValues
  •  Map/請求參數快速綁定
  • 嵌套屬性與集合賦值
  • 類型轉換支持
  • 屬性元信息訪問

示例類定義(POJO 模型)

路徑:/com/icoderoad/beanwrapper/model

public class User {
    private Long id;
    private String name;
    private Date birthday;
    private GenderEnum gender;
    private Address address = new Address();
    private List<String> hobby = new ArrayList<>();


    // 構造器、getter、setter 省略
}


public class Address {
    private String province;
    private String city;


    // getter/setter
}


public enum GenderEnum {
    MALE(1, "男"),
    FEMALE(2, "女"),
    UNKNOWN(0, "未知");


    // fromCode方法 + 構造器
}

實戰操作詳解

實例化與基礎屬性賦值

BeanWrapper wrapper = new BeanWrapperImpl(User.class);
wrapper.setPropertyValue("id", 666L);
wrapper.setPropertyValue("name", "Pack");
System.out.println(wrapper.getWrappedInstance());

輸出:

User[id=666, name=Pack, birthday=null, gender=null]

使用 Map 快速批量綁定

Map<String, Object> map = Map.of("id", "8888", "name", "Pack");
wrapper.setPropertyValues(map);
System.out.println(wrapper.getWrappedInstance());

使用 PropertyValue 封裝屬性數據

MutablePropertyValues pvs = new MutablePropertyValues();
pvs.addPropertyValue(new PropertyValue("id", "8888"));
wrapper.setPropertyValues(pvs);

嵌套屬性綁定(如 address.province)

Map<String, Object> map = new HashMap<>();
map.put("address.province", "新疆");
wrapper.setPropertyValues(map);
System.out.println(wrapper.getWrappedInstance());

輸出:

User[address=Address[province=新疆, city=null]]

集合屬性設置(如 List)

修改 User 類:

private List<String> hobby = new ArrayList<>();

設置方式如下:

Map<String, Object> map = new HashMap<>();
map.put("hobby[0]", "足球");
map.put("hobby[1]", "籃球");
wrapper.setPropertyValues(map);

輸出:

User[hobby=[足球, 籃球]]

類型轉換(字符串轉枚舉)

定義轉換器類:

public class GenderConverter implements Converter<String, GenderEnum> {
    public GenderEnum convert(String source) {
        if (source == null) return null;
        try {
            return GenderEnum.fromCode(Integer.parseInt(source));
        } catch (Exception e) {
            return null;
        }
    }
}

注冊轉換器:

DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
conversionService.addConverter(new GenderConverter());


wrapper.setConversionService(conversionService);
Map<String, Object> map = Map.of("gender", "1");
wrapper.setPropertyValues(map);

輸出:

User[gender=MALE]

與 HTTP 請求參數綁定集成

MockHttpServletRequest request = new MockHttpServletRequest();
request.setParameter("id", "888");
request.setParameter("name", "Spring Boot3實戰案例200講");
request.setParameter("hobby[0]", "足球");
request.setParameter("hobby[1]", "籃球");


PropertyValues pvs = new ServletRequestParameterPropertyValues(request);
wrapper.setPropertyValues(pvs);
System.out.println(wrapper.getWrappedInstance());

輸出:

User[id=888, name=Spring Boot3實戰案例200講, hobby=[足球, 籃球]]

獲取對象屬性值(支持嵌套、集合、Map)

User user = new User();
user.setName("Pack");
user.getHobby().addAll(List.of("籃球", "橄欖球"));
user.setAddress(new Address("新疆", null));


BeanWrapper wrapper = new BeanWrapperImpl(user);
System.out.printf("name: %s, hobby: %s, province: %s%n",
    wrapper.getPropertyValue("name"),
    wrapper.getPropertyValue("hobby[1]"),
    wrapper.getPropertyValue("address.province")
);

輸出:

name: Pack, hobby: 橄欖球, province: 新疆

獲取屬性元信息(用于構建動態表單等)

BeanWrapper wrapper = new BeanWrapperImpl(User.class);
Arrays.stream(wrapper.getPropertyDescriptors()).forEach(pd -> {
    System.out.printf("name: %s, type: %s%n", pd.getName(), pd.getPropertyType());
});

結語:BeanWrapper —— 面向對象操作的反射利器

相比于傳統手動寫 getter/setter 的方式,BeanWrapper 提供了更高層次的封裝,讓我們能夠以聲明式、批量化、靈活性強的方式處理對象屬性,尤其適用于:

  • Web 數據綁定
  • 后臺對象構建
  • 統一參數注入
  • 元數據驅動開發

當你的代碼中出現大量 obj.setXXX、obj.getXXX 時,不妨試試 BeanWrapper,你會發現它不僅節省代碼,更提升了架構的可維護性。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2025-02-19 12:00:00

SpringBootDeepSeekAI

2025-02-07 10:52:00

2021-09-15 16:20:02

Spring BootFilterJava

2023-04-28 15:15:39

數據庫JPA

2025-04-21 03:30:00

2024-08-02 09:15:22

Spring捕捉格式

2025-03-11 00:55:00

Spring停機安全

2020-08-05 08:30:25

Spring BootJavaSE代碼

2020-06-18 08:18:35

密碼加密安全

2024-08-01 09:10:03

2024-08-12 10:13:01

2021-05-28 23:04:23

Python利器執行

2025-01-17 09:11:51

2025-04-09 00:55:00

List類型Redis

2022-03-01 15:14:36

圖數據庫知識圖譜

2024-03-14 08:19:14

PythonXmltodict第三方庫

2025-02-12 08:07:40

2015-07-08 14:56:26

2025-06-11 03:22:00

JavaScript開發前端

2025-02-17 11:41:14

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区 | 岛国精品 | 综合久久久 | 欧美精品一区二区三区蜜桃视频 | 色免费在线视频 | 久久999| 国产精品日韩 | 亚洲精品久久久久久久久久吃药 | 97碰碰碰| 亚洲精品黑人 | 国产精品综合 | 亚洲欧美日韩一区二区 | 亚洲国产成人久久久 | 亚洲综合成人网 | 男女下面一进一出网站 | h视频在线播放 | 91视视频在线观看入口直接观看 | 国产999精品久久久久久 | 国产高清视频 | 青青草综合网 | 免费成人在线网站 | 国产日韩欧美激情 | 亚洲精品二区 | 久久久www成人免费无遮挡大片 | 久久久久久成人 | 极品一区 | 久久久国产一区二区三区 | 久久网站黄 | 久久国产精品-久久精品 | 久久久久久久99 | 九九99精品 | 99久久久久久久 | 天天综合久久 | 精品日本久久久久久久久久 | 特级做a爰片毛片免费看108 | 精品视频网 | 亚洲视频www | 国产精品高清一区二区三区 | 欧美黑人狂野猛交老妇 | 亚洲国产在 | 精品福利在线 |