Какова эквивалентная конфигурация Java для атрибута пространства имен p XML?

Например, как я могу преобразовать следующее в JavaConfig @Bean?

<bean id="ldapDao" class="org.mycompany.LdapDAOImpl" p:ldapUrl-ref="ldapHost"/>

Вот где я нахожусь с эквивалентным JavaConfig Bean

@Bean(name="ldapDao")
public LdapDAOImpl getLdapDAOImpl(){
    LdapDAOImpl ldapDAOImpl = new LdapDAOImpl();
    //How can I set the reference here to ldapHost?
    return new LdapDAOImpl();
}          

2 ответа

Решение

Во-первых, p-namespace определяется как

p-namespace позволяет использовать атрибуты bean-элемента вместо вложенных <property/> элементы, чтобы описать ваши значения свойств и / или сотрудничающие бины.

Другими словами, это просто альтернатива для определения свойств бина.

Например,

<bean id="ldapDao" class="org.mycompany.LdapDAOImpl" p:ldapUrl-ref="ldapHost"/>

эквивалентно

<bean id="ldapDao" class="org.mycompany.LdapDAOImpl">
    <property name="ldapUrl" ref="ldapHost" />
</bean>

где -ref суффикс в p: атрибут поясняется примером в документации

Как видите, этот пример включает в себя не только значение свойства, использующее пространство имен p, но также использует специальный формат для объявления ссылок на свойства. В то время как первое определение бина использует <property name="spouse" ref="jane"/> чтобы создать ссылку от боба джона на бин джейн, во втором определении бина используется p:spouse-ref="jane" в качестве атрибута, чтобы сделать то же самое. В этом случае супруг является именем свойства, тогда как -ref Часть указывает, что это не прямое значение, а скорее ссылка на другой компонент.

каждый property элемент появляется в вашем <bean> определение требует соответствующего установщика в классе бина.

Учитывая все вышеизложенное, соответствующие @Bean определение будет тем, которое инициализирует объект типа org.mycompany.LdapDAOImpl и вызывает его setLdapUrl сеттер с объектом, соответствующим бину с именем ldapHost в качестве аргумента.

Например, если у вас есть такой боб

@Bean
public LdapHost ldapHost() {
    return new LdapHost();
}

Затем вы будете использовать это для инициализации вашего ldapDao

@Bean
public LdapDaoImpl ldapDao() {
    LdapDaoImpl ldapDao = new LdapDaoImpl();
    ldapDao.setLdapUrl(ldapHost());
    return ldapDao;
}

В качестве альтернативы, вы можете сделать так, чтобы Spring сделал это для вас.

@Bean
public LdapDaoImpl ldapDao(LdapHost ldapHost) {
    LdapDaoImpl ldapDao = new LdapDaoImpl();
    ldapDao.setLdapUrl(ldapHost);
    return ldapDao;
}

Похоже, p:ldapUrl-ref - это не что иное, как установка значения ldapUrl в моем классе LdapDAOImpl. Так что простой сеттер работает просто отлично.

@Bean(name="ldapDao")
    public LdapDAOImpl getLdapDAOImpl(){
        LdapDAOImpl ldapDAOImpl = new LdapDAOImpl();
        ldapDAOImpl.setLdapUrl(url);
        return new LdapDAOImpl();
    }
Другие вопросы по тегам