我有一个服务界面
interface ImageSearchService {
// methods...
}
我有2个实现:
@Service
class GoogleImageSearchImpl implements ImageSearchService {
// methods...
}
@Service
class AzureImageSearchImpl implements ImageSearchService {
// methods...
}
我有一个控制器可以使用其中一个:
@Controller
ImageSearchController {
@Autowired
ImageSearchService imageSearch; // Google or Azure ?!?
}
如何使用Environment API设置正确的实施?
如果环境属性为my.search.impl=google
,则需要使用GoogleImageSearchImpl
,或者如果环境my.search.impl=google
需要使用AzureImageSearchImpl
。
答案 0 :(得分:5)
您可以使用Spring Profiles实现此目的。
interface ImageSearchService {}
class GoogleImageSearchImpl implements ImageSearchService {}
class AzureImageSearchImpl implements ImageSearchService {}
请注意,@Service
注释已从两个实现类中删除,因为我们将动态实例化这些注释。
然后,在您的配置中执行以下操作:
<beans>
<beans profile="azure">
<bean class="AzureImageSearchImpl"/>
</beans>
<beans profile="google">
<bean class="GoogleImageSearchImpl"/>
</beans>
</beans>
如果您使用Java配置:
@Configuration
@Profile("azure")
public class AzureConfiguration {
@Bean
public ImageSearchService imageSearchService() {
return new AzureImageSearchImpl();
}
}
@Configuration
@Profile("google")
public class GoogleConfiguration {
@Bean
public ImageSearchService imageSearchService() {
return new GoogleImageSearchImpl();
}
}
运行应用程序时,通过设置变量spring.profiles.active
的值来选择要运行的配置文件。您可以将其作为-Dspring.profiles.active=azure
传递给JVM,将其配置为环境变量等等。
Here是一个示例应用程序,显示了Spring Profiles的运行情况。
答案 1 :(得分:0)
您也可以使用@Conditional
@Configuration
public class MyConfiguration {
@Bean
@Conditional(LinuxCondition.class)
public MyService getMyLinuxService() {
return new LinuxService();
}
}