Какова эквивалентная конфигурация 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();
}