diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java new file mode 100644 index 0000000000..5f8f2e548e --- /dev/null +++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java @@ -0,0 +1,22 @@ +package com.baeldung.dynamic.autowire; + +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class BeanFactoryDynamicAutowireService { + private final BeanFactory beanFactory; + + @Autowired + public BeanFactoryDynamicAutowireService(BeanFactory beanFactory) { + this.beanFactory = beanFactory; + } + + public boolean isServerActive(String countryCode, int serverId) { + RegionService service = beanFactory.getBean(countryCode, RegionService.class); + + return service.isServerActive(serverId); + } + +} diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/DynamicAutowireConfig.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/DynamicAutowireConfig.java new file mode 100644 index 0000000000..256bd9b495 --- /dev/null +++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/DynamicAutowireConfig.java @@ -0,0 +1,9 @@ +package com.baeldung.dynamic.autowire; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("com.baeldung.dynamic.autowire") +public class DynamicAutowireConfig { +} diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/InterfaceDynamicAutowireService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/InterfaceDynamicAutowireService.java new file mode 100644 index 0000000000..ad655f5c42 --- /dev/null +++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/InterfaceDynamicAutowireService.java @@ -0,0 +1,26 @@ +package com.baeldung.dynamic.autowire; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +public class InterfaceDynamicAutowireService { + private final Map servicesByCountryCode; + + @Autowired + public InterfaceDynamicAutowireService(List regionServices) { + servicesByCountryCode = regionServices.stream() + .collect(Collectors.toMap(RegionService::getCountryCode, Function.identity())); + } + + public boolean isServerActive(String countryCode, int serverId) { + RegionService service = servicesByCountryCode.get(countryCode); + + return service.isServerActive(serverId); + } +} diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java new file mode 100644 index 0000000000..f9f92d045a --- /dev/null +++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java @@ -0,0 +1,7 @@ +package com.baeldung.dynamic.autowire; + +public interface RegionService { + boolean isServerActive(int serverId); + + String getCountryCode(); +} diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USARegionService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USARegionService.java new file mode 100644 index 0000000000..cfad0146e5 --- /dev/null +++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USARegionService.java @@ -0,0 +1,16 @@ +package com.baeldung.dynamic.autowire; + +import org.springframework.stereotype.Service; + +@Service("usa") +public class USARegionService implements RegionService { + @Override + public boolean isServerActive(int serverId) { + return true; + } + + @Override + public String getCountryCode() { + return "usa"; + } +} diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/UkRegionService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/UkRegionService.java new file mode 100644 index 0000000000..1fbe8ed96e --- /dev/null +++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/UkRegionService.java @@ -0,0 +1,16 @@ +package com.baeldung.dynamic.autowire; + +import org.springframework.stereotype.Service; + +@Service("uk") +public class UkRegionService implements RegionService { + @Override + public boolean isServerActive(int serverId) { + return false; + } + + @Override + public String getCountryCode() { + return "uk"; + } +} diff --git a/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java new file mode 100644 index 0000000000..5afab69c53 --- /dev/null +++ b/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java @@ -0,0 +1,30 @@ +package com.baeldung.dynamic.autowire; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = DynamicAutowireConfig.class) +public class DynamicAutowireIntegrationTest { + + @Autowired + private BeanFactoryDynamicAutowireService beanFactoryDynamicAutowireService; + + @Autowired + private InterfaceDynamicAutowireService interfaceDynamicAutowireService; + + @Test + public void testConstructWorkerByJava() { + assertThat(beanFactoryDynamicAutowireService.isServerActive("uk", 101), is(false)); + assertThat(interfaceDynamicAutowireService.isServerActive("uk", 101), is(false)); + + assertThat(beanFactoryDynamicAutowireService.isServerActive("usa", 101), is(true)); + assertThat(interfaceDynamicAutowireService.isServerActive("usa", 101), is(true)); + } +}