Автоматическое подключение bean-компонента, определенного в XML - Spring Boot - PullRequest
0 голосов
/ 28 мая 2018

Я новичок в Spring (& boot) и столкнулся со следующей проблемой.У меня есть некоторые Бины, определенные в файле XML.Я могу получить эти бины, используя ApplicationContext.getBean(), вместо этого я бы хотел Autowire их или использовать их в классах, которые не имеют доступа к ApplicationContext

Упрощенная версия моего проекта:

beans.xml:

<bean id="PartnerDao" name="PartnerDao" class="partner.dao.PartnerDAOImpl">
   <constructor-arg index="0" value="${integration.username}"/>
   <constructor-arg index="1" value="${integration.password}"/>
</bean>

applicationContext.xml:

<beans>
    <import resource="classpath:beans.xml" />
    <context:annotation-config/>
    <cache:annotation-driven/>
    <task:annotation-driven/>
</beans>

Application.java:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }
}

PartnerService.java:

@Service
public class PartnerService {

  @Autowired
  @Qualifier("PartnerDao")
  PartnerDAO partnerDao;

}

При сборке я сталкиваюсь со следующим исключением:

org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type 'partner.dao.PartnerDAO' available:
expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=PartnerDao)}

Как я уже говорил, я новичок в Spring и использую аннотации Spring Boot для маневрирования, но мой супервизор сконструировал это beans.xml для интеграции с другими службами, и я не уверен, как автоматически подключить его.

Я всегда могу сделать:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
PartnerDAO partnerDao = context.getBean(partner.dao.PartnerDAOImpl.class);

Но я бы предпочел просто подключить его автоматически.

Есть ли другое жизнеспособное решение?

Спасибо.

1 Ответ

0 голосов
/ 29 мая 2018

Подключение компонента соответствует предоставлению зависимостей, которые могут понадобиться компоненту для выполнения его работы.В Spring бины могут быть соединены вместе двумя способами: вручную и автоматически.

Ручное подключение: с помощью атрибута ref в свойство или конструктор тег

<bean id="PartnerDao" name="PartnerDao" class="partner.dao.PartnerDAOImpl">
   <constructor-arg index="0" value="${integration.username}">
<ref bean="PartnerDao" />
<constructor-arg/>
   <constructor-arg index="1" value="${integration.password}"/>
</bean>

Я не уверен, сработает ли это или нет, но, по крайней мере, вы можете попробовать.

...