Spring/LDAP — вызов методов установки в конфигурации bean-компонентов

Я пишу приложение Spring LDAP, и мне нужно установить стратегию аутентификации для моего ContextSource. Я хотел бы сделать это в XML-файле bean-компонентов. JavaDoc для ContextSource говорит, что у него есть метод установки, называемый

setAuthenticationStrategy(
    DirContextAuthenticationStrategy authenticationStrategy
)

Достаточно ли для вызова этого установщика из моего файла bean-компонентов следующего 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 имена свойств автоматически в соответствующий метод установки?


person ktm5124    schedule 21.01.2011    source источник


Ответы (2)


Ваше подозрение верно: Spring переводит имена свойств в методы установки.

Компонент, который вы используете в качестве аргумента, имеет тип DefaultTlsDirContextAuthenticationStrategy, а метод принимает объект типа DirContextAuthenticationStrategy, поэтому DefaultTlsDirContextAuthenticationStrategy должен быть подклассом реализации класса DirContextAuthenticationStrategy.

person Ray    schedule 21.01.2011
comment
@ ktm5124: Этот ответ совершенно неверен. Spring не нужно ничего переводить. Имя свойства происходит только от имени сеттера, поле не имеет к нему никакого отношения. В 99% случаев вывод один и тот же, потому что обычно есть базовое поле, но механизм JavaBeans (который использует Spring) полностью игнорирует поля. - person Sean Patrick Floyd; 21.01.2011
comment
@SeanPatrickFloyd: я полагаю, что ответ означает, что имя свойства, указанное в XML, переводится в имя установщика (перевод заключается в добавлении префикса set). Вот так было бы на самом деле правильно. - person sleske; 08.02.2012

На самом деле, вы неправильно поняли значение слова "свойство" в контексте 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
comment
Спасибо за сказочный ответ! - person Gob00st; 06.05.2016