На самом деле, вы неправильно поняли значение слова "свойство" в контексте JavaBean.
Свойства компонента и поля
Стандарт JavaBeans (за которым Spring внимательно следит) определяет свойство Bean как что-то, что имеет метод Getter и/или метод Setter, который следует определенному соглашению об именах:
для свойства «Bar foo» должен присутствовать либо геттер Bar getFoo()
(или isFoo()
для логических свойств), либо сеттер setFoo(Bar)
(или оба), но не обязательно должно быть поле с именем «foo». По соглашению обычно есть поле с тем же именем, что и у свойства, но это ни в коем случае не обязательно.
Например. следующий класс (соответствующий стандарту JavaBeans) имеет свойство bean-компонента "foo" типа Integer, хотя базовое поле называется iAmNotFoo
и имеет тип String.
public class Dummy {
private String iAmNotFoo;
public Integer getFoo() {
return Integer.valueOf(this.iAmNotFoo);
}
public void setFoo(final Integer foo) {
this.iAmNotFoo = foo.toString();
}
}
Мы можем проверить это предположение с помощью следующего кода:
public static void main(final String[] args) throws Exception {
for (final PropertyDescriptor descriptor :
Introspector
.getBeanInfo(Dummy.class, Object.class)
.getPropertyDescriptors()) {
System.out.println(
"Property: "
+ descriptor.getName()
+ ", type: "
+ descriptor.getPropertyType()
);
}
for (final Field field : Dummy.class.getDeclaredFields()) {
System.out.println(
"Field: "
+ field.getName()
+ ", type: "
+ field.getType());
}
}
Вывод:
Свойство: foo, тип: class java.lang.Integer
Поле: iAmNotFoo, тип: class java.lang.String
Недвижимость весной
Как я сказал выше, Spring использует именно этот механизм для установки свойств. Итак, когда вы настраиваете bean-компонент следующим образом
<bean class="Dummy">
<property name="foo" value="123" />
</bean>
"foo" относится к свойству bean-компонента "foo" и, следовательно, к установщику setFoo()
Что делает возможными конструкции, подобные следующим:
public class Dummy2 {
private List<String> foos;
public void setFoos(List<String> foos) {
this.foos = foos;
}
public void setFoo(String foo){
this.foos = Collections.singletonList(foo);
}
}
Вы можете подключить это следующим образом
<bean class="Dummy2">
<!-- either set a single value -->
<property name="foo" value="123" />
<!-- or a list of values -->
<property name="foos">
<util:list>
<value>Abc</value>
<value>Xyz</value>
<value>123</value>
<value>789</value>
</util:list>
</property>
</bean>
Как видите, методы установки относятся к Spring, а не к фактическим полям.
Итак, в JavaBeans говорят: Поле != Свойство, хотя в большинстве случаев существует поле того же типа и имени, что и свойство.
person
Sean Patrick Floyd
schedule
21.01.2011