Tengo una interfaz llamada IpAssginer y dos clases que implementan IpAssginer llamadas CloudIpAssginer y DHCPClientService.
Estoy tratando de configurar un IpAssginer predeterminado para usar en función de cierta información sobre el inicio del sistema.
El siguiente código lo hace con éxito, pero se están creando dos instancias del bean seleccionado:
@Configuration public class BeanConfiguration { @Autowired private ShellUtilsService shellUtilsService; @Autowired private IpAssginer cloudIpAssginer; @Autowired private IpAssginer dhcpClientService; @Bean(name = "ipAssginer") public IpAssginer ipAssginer() { HwType hwType = shellUtilsService.getHwType(); IpAssginer ipAssginer = hwType.isInCloud() ? cloudIpAssginer : dhcpClientService; Log.Management.info("{} IpAssginer created with type: {}", this.getClass().getSimpleName(), ipAssginer.getIPAssginerType()); return ipAssginer; } }¿Alguna idea de cómo puedo hacer lo mismo pero crear solo una instancia del bean seleccionado?
También puede usar la anotación @Bean para crear Spring Bean, eliminar las anotaciones estereotipadas de la clase CloudIpAssginer y DhcpClientService , y luego usar la anotación @Bean en la clase @Configuration
@Configuration public class BeanConfiguration { @Autowired private ShellUtilsService shellUtilsService; @Bean(name = "ipAssginer") public IpAssginer ipAssginer() { HwType hwType = shellUtilsService.getHwType(); IpAssginer ipAssginer = hwType.isInCloud() ? new CloudIpAssginer() : new DhcpClientService(); Log.Management.info("{} IpAssginer created with type: {}", this.getClass().getSimpleName(), ipAssginer.getIPAssginerType()); return ipAssginer; } }Una solución que funcionó para mí:
Excluí el IpAssigner del contexto y funcionó con el siguiente código:
@Configuration public class BeanConfiguration { @Autowired private ShellUtilsService shellUtilsService; @Bean(name = "ipAssginer") @DependsOn("cloudApiService") public IpAssigner ipAssginer() { HwType hwType = shellUtilsService.getHwType(); IpAssigner ipAssginer = hwType != null && hwType.isInCloud() ? new CloudIpAssginer() : new DHCPClientService(); return ipAssginer; } }