Примерно так:
@Configuration(proxyBeanMethods=true)
public class SomeConfiguration {
@Bean
ServiceA serviceA(){
return new ServiceA(sharedService());
}
@Bean
ServiceB serviceB(){
return new ServiceB(sharedService());
}
@Bean
ServiceC sharedService(){
return new ServiceC();
}
}
Здесь proxyBeanMethods будет гарантировать, что метод sharedService будет перехвачен и его результат будет использован повторно. Если вы будете следовать обычной java logi c, при вызове serviceA () и serviceB () будет два разных экземпляра Service C, а при непосредственном вызове sharedService () будет создан третий экземпляр , Затем прокси-перехватчик удостоверится, что фактический метод вызывается только один раз, поэтому создается только один экземпляр общей службы C, и и ServiceA, и ServiceB получат общий экземпляр.
Вы можете использовать другую конфигурацию паттерны, чтобы избежать этого, что, вероятно, и делают классы автоконфигурации.
Один из способов сделать это - автоматическое подключение сервиса через параметры метода вместо вложенных вызовов методов. В нормальном Java он менее чувствителен, но работает в конфигурациях Spring:
@Configuration(proxyBeanMethods=false)
public class SomeSmarterConfiguration {
@Bean
ServiceC sharedService(){
return new ServiceC();
}
@Bean
ServiceA serviceA(ServiceC sharedService){
return new ServiceA(sharedService);
}
@Bean
ServiceB serviceB(ServiceC sharedService){
return new ServiceB(sharedService);
}
}