Spring 环境的服务实施 属性

Spring service implementation by environment property

我有一个服务接口

interface ImageSearchService {
   // methods...
}

我有两个实现:

@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=googlespring需要使用GoogleImageSearchImpl,或者如果环境my.search.impl=googlespring需要使用AzureImageSearchImpl.

您可以使用 Spring 配置文件实现此目的。

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

当 运行 应用程序时,select 通过设置变量 spring.profiles.active 的值来 运行 配置文件。您可以将其作为-Dspring.profiles.active=azure传递给JVM,将其配置为环境变量等

Here 是一个示例应用程序,显示了 Spring 配置文件的运行情况。

您也可以使用@Conditional

@Configuration
public class MyConfiguration {

  @Bean
  @Conditional(LinuxCondition.class)
  public MyService getMyLinuxService() {
    return new LinuxService();
  }
}

给出的例子: