property标签支持value(字面量,触发类型转换)、ref(引用已声明bean)、嵌套bean、null标签四种赋值方式;name匹配setter方法名而非字段名,大小写敏感,不支持下划线转驼峰;集合配置需注意类型声明与闭合标签。

property 标签到底支持哪几种赋值方式
不是所有写法都等价,value 和 ref 混用是高频翻车点。前者注入字面量(字符串、数字、布尔),后者注入容器里另一个 <bean> 的实例引用。
-
value会触发类型转换:比如value="123"注入到int字段,Spring 会自动转;但注入到LocalDateTime就失败,除非配了PropertyEditor或Converter -
ref必须指向已声明的id或name,拼错名不会报错,而是抛BeanCreationException: No bean named 'xxx' is defined - 嵌套对象用
<bean>子标签:比如给dataSource的driverClassName赋值,不能写value="<bean class=...>",得用<property name="driver"><bean class="..."></bean></property>
name 属性必须和 Java 字段名完全一致吗
必须匹配 setter 方法名,不是字段名。Spring 是靠反射调用 setXxx(),所以 name="userName" 对应的是 setUserName(String),哪怕字段叫 user_name 也没关系。
- 大小写敏感:写成
name="username"(小写 u)而方法是setUserName(),直接报Invalid property 'username' of bean class - 不支持下划线转驼峰:
user_name字段 +setUser_name()方法?不行。JavaBean 规范要求是setUserName(),Spring 不做额外推导 - 布尔值注意 isXxx():
isActive()对应name="active",不是"isActive"
为什么 value 注入 null 或空字符串总出问题
value="" 默认被当空字符串注入,不是 null;想注入真正的 null,得用 <null/> 标签。
-
value=""→""(空字符串),对String字段没问题,但对Integer会转成0(取决于转换器),不是你想要的null - 要注入
null:写成<property name="port"><null/></property>,否则 Spring 会尝试把空字符串转成数字,抛NumberFormatException - XML 解析时空白符会被 trim:换行缩进里的空格、tab 全丢掉,所以
value=" \n"和value=""效果一样
用 property 配置集合类时容易漏掉什么
数组、List、Set、Map 都支持,但每种写法细节不同,尤其 Map 的 key 类型没显式声明时,默认是 String。
- List/Array:用
<list>或<array>,子项用<value>(字面量)或<ref>(引用),别漏闭合标签 - Map:
<map><entry key="timeout" value="3000"/></map>——key和value都是字符串;如果 key 是Integer,得写成<entry><key><value type="java.lang.Integer">1</value></key><value>abc</value></entry> - Set 和 List 行为一致,但 Set 会去重;如果元素是复杂对象,
<ref>比<bean>更省资源(避免重复创建)
XML 配置越深,启动时解析越慢,且改一处常要重启整个容器。现在多数项目早切注解了,但维护老系统时,这些细节卡住半天很常见。










