Spring / LDAP - вызов методов установки в конфигурации bean-компонентов - PullRequest
3 голосов
/ 21 января 2011

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

setAuthenticationStrategy(
    DirContextAuthenticationStrategy authenticationStrategy
)

Для вызова этого установщика из моего файла bean, достаточно ли следующего XML?* То есть, что именно определяет вызов метода setAuthenticationStrategy?Это мое имя собственности authenticationStrategy?Spring автоматически переводит имена свойств в соответствующий метод установки?

Ответы [ 2 ]

5 голосов
/ 21 января 2011

На самом деле вы неправильно поняли значение слова «свойство» в контексте JavaBean.

Свойства компонента против полей

Стандарт JavaBeans (за которым следует Spring) определяет свойство компонента какчто-то, что имеет метод Getter и / или метод Setter, который следует определенному соглашению об именах:

для свойства 'Bar foo', либо getter Bar getFoo() (или isFoo() для логических свойств), либосеттер setFoo(Bar) должен присутствовать (или оба), но необязательно должно быть поле с именем "foo".В соответствии с соглашением обычно существует поле с тем же именем, что и у свойства, но это ни в коем случае не требуется.

Например, следующий класс (соответствующий стандарту JavaBeans) имеет свойство 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

Как я уже говорил выше, 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 говорят: Field! = Property, хотя в большинстве случаев существует поле того же типа и имени, что и у свойства.

2 голосов
/ 21 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...