2017-02-09 8 views
1

У меня есть Java-конфигурации, где ServiceB зависит от ServiceA:Как получить пружинный боб в методе боб-определения

@Bean 
ServiceA getServiceA() { return new ServiceA(); } 
@Bean 
ServiceB getServiceB() { return new ServiceB(getServiceA()); } 

Тогда я хочу объявить ServiceA (но не ServiceB) в качестве компонента. Добавить @ScanPackage в конфиг и аннотирования ServiceA:

Как объявить метод getServiceB() сейчас?

ответ

2

Как уже писал Рохан в своем answer, аннотация Spring's @Bean может вставлять зависимости других весенних бобах, так же, как и инъекция зависимостей на основе конструктора.

Я бы просто добавил, что есть другие возможности делать инъекции зависимостей при определении компонента в java config. @Configuration аннотированный класс является Spring боб, как и любой другой Spring бина, так что вы можете автоматически проводная зависимость, как это обычно делается весной, а затем использовать эту зависимость при определении вашей @Bean, как:

@Autowired 
private ServiceA serviceA; 

@Bean 
public ServiceB getServiceB() { 
    return new ServiceB(serviceA); 
} 

С Spring Framework 4.3, вы также можете сделать инъекцию конструктора в классах @Configuration, что является еще одним способом вложения зависимостей.

См. Подробности в spring documentation.

+0

Быстрая коррекция: я написал ответ, с которым вы связались, но я не ОП, как ваш ответ видит, чтобы предположить :) –

+0

@RohanPrabhu, вы правы. :) Вы отредактировали вопрос, и я не был достаточно осторожен, чтобы заметить, что вы не OP. Я скорректировал свой ответ и упрекнул вас. –

3

пружинные параметры метода авто-впрыскивает по типу для методов, определяющих Bean:

@Bean 
ServiceB getServiceB(ServiceA serviceA) { 
    return new ServiceB(serviceA); 
} 

Теперь вам не придется беспокоиться о том, как ServiceA предусмотрено.

+0

Что делать, если 'ServiceB' используется' ServiceC' и 'ServiceD' и так далее? Должен ли я добавить параметр «ServiceA serviceA» ко всем объявлениям методов? – awfun

+0

Когда 'ServiceB' определяется как bean-компонент, вы можете просто использовать его в параметре метода. '@Bean ServiceC getServiceC (ServiceB serviceB) {новый ServiceC (serviceB); } '. Это также правильный способ сделать это, потому что вы будете использовать один и тот же экземпляр компонента (если вы не используете область прототипа), а также не дублируете код для создания «ServiceB» –

Смежные вопросы