Spring环境属性实现Spring服务

时间:2015-02-24 13:39:10

标签: java spring spring-mvc service settings

我有一个服务界面

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

2 个答案:

答案 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();
  }
}

给出的示例:Spring choose bean implementation at runtime