Java Spring/LDAP-在bean配置中调用setter方法
我正在编写一个SpringLDAP应用程序,我必须为我的ContextSource设置身份验证策略。我想在我的beans XML文件中这样做。声明它有一个setter方法,名为Java Spring/LDAP-在bean配置中调用setter方法,java,spring,javabeans,spring-ldap,Java,Spring,Javabeans,Spring Ldap,我正在编写一个SpringLDAP应用程序,我必须为我的ContextSource设置身份验证策略。我想在我的beans XML文件中这样做。声明它有一个setter方法,名为 setAuthenticationStrategy( DirContextAuthenticationStrategy authenticationStrategy ) 要从我的bean文件中调用此setter,以下XML是否足够 <bean id="authStrategy" class="or
setAuthenticationStrategy(
DirContextAuthenticationStrategy authenticationStrategy
)
要从我的bean文件中调用此setter,以下XML是否足够
<bean id="authStrategy"
class="org.springframework...DefaultTlsDirContextAuthenticationStrategy">
...
</bean>
<bean id="contextSource"
class="org.springframework.ldap.core.support.LdapContextSource">
<property name="url" ... />
<property name="base" ... />
...
<property name="authenticationStrategy" ref="authStrategy" />
</bean>
...
...
也就是说,究竟是什么决定了方法的调用
setAuthenticationStrategy
?是不是我的财产名称是authenticationStrategy
?Spring是否自动将属性名称转换为适当的setter方法 您的怀疑是正确的:Spring将属性名称转换为setter方法
您用作参数的bean的类型为
DefaultTlsDirContextAuthenticationStrategy
,并且该方法接受类型为DirContextAuthenticationStrategy
的对象,因此DefaultTlsDirContextAuthenticationStrategy
必须是DirContextAuthenticationStrategy
的实现者的子类实际上,您误解了JavaBean上下文中“属性”一词的含义
Bean属性与字段
JavaBeans标准(Spring紧随其后)将Bean属性定义为具有遵循特定命名约定的Getter方法和/或Setter方法的对象:
对于属性“Bar-foo”,必须存在getterBar-getFoo()
(或isFoo()
用于布尔属性)或settersetFoo(Bar)
,但不必存在名为“foo”的字段。按照约定,通常会有一个字段与属性同名,但这绝不是必需的
例如,下面的类(符合JavaBeans标准)具有Integer类型的bean属性“foo”,尽管底层字段名为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>
您可以按如下方式将其连接
<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>
Abc
Xyz
123
789
如您所见,setter方法与Spring相关,而与实际字段无关
所以,在JavaBeans中说:Field!=属性,但在大多数情况下,存在与属性类型和名称相同的字段。@ktm5124:这个答案完全错误。Spring不需要翻译任何东西。属性名称仅从setter名称派生,字段与它无关。在99%的情况下,输出是相同的,因为通常有一个底层字段,但是JavaBeans机制(Spring使用的)完全忽略了字段。@SeanPatrickFloyd:我相信答案的意思是“XML中给定的属性名称被翻译成setter名称”(翻译是添加“set”前缀)。就像这样,它实际上是正确的。谢谢你的精彩回答!
<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>