Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring/LDAP-在bean配置中调用setter方法_Java_Spring_Javabeans_Spring Ldap - Fatal编程技术网

Java Spring/LDAP-在bean配置中调用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

我正在编写一个SpringLDAP应用程序,我必须为我的ContextSource设置身份验证策略。我想在我的beans XML文件中这样做。声明它有一个setter方法,名为

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”,必须存在getter
Bar-getFoo()
(或
isFoo()
用于布尔属性)或setter
setFoo(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>