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=google
spring需要使用GoogleImageSearchImpl
,或者如果环境my.search.impl=google
spring需要使用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();
}
}
给出的例子:
我有一个服务接口
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=google
spring需要使用GoogleImageSearchImpl
,或者如果环境my.search.impl=google
spring需要使用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();
}
}
给出的例子: