3

使用 Spring 接线,如果我有多个接口实现,我可以使用 @Qualifier 来指定我想要的。

例如,假设我有一个

@Component
@Qualifier("Toyota")
public class Toyota implements Car

和一个

@Component
@Qualifier("Bmv")
public class Bmv implements Car

然后我可以选择一个特定的实现:

  @Qualifier("Toyota") Car car 

但是有没有办法根据环境来选择实现呢?

即如果我将 spring.profiles.active 设置为本地,那么我将选择 Car 的“Toyota”实现,但如果 spring.profiles.active 设置为 dev 或 stage,那么我将选择 Car 的“Bmv”实现?

将不胜感激确切语法的示例。

4

3 回答 3

3

啊,解决方法其实很简单:

@Component
@Qualifier("Bmv")
@Profile("!dev")
public class Bmv implements Car

@Component
@Qualifier("Toyota")
@Profile("dev")
public class Toyota implements Car

这样,Car 的接线将使用 Toyota 作为 dev 环境,否则使用 Bmv。

于 2013-05-17T15:19:23.617 回答
2

您可以注入两种实现并通过参数 {spring.profiles.active} 选择您需要的实现,例如以下代码:

@autowired
private Car Toyota;
@autowired
private Car Bmv;

public Car getCar(){
  if(spring.profiles.active is local){
        return Toyota;
  }else{
        return  bmv;
  }
}
于 2013-05-17T02:50:20.567 回答
1

Spring 3.1 引入环境配置文件:http: //blog.springsource.com/2011/02/11/spring-framework-3-1-m1-released/

我个人不喜欢限定符,并且按照您在代码中提出的方式使用它们实际上与实现耦合而不是解耦。您可以像 Jason 建议的那样使用 @Autowired 元素,但将其与 bean 配置文件结合起来,如下所示:

<beans profile="dev"> <jdbc:embedded-database id="dataSource"> <jdbc:script location="classpath:com/bank/config/sql/schema.sql"/> <jdbc:script location="classpath:com/bank/config/sql/test-data.sql"/> </jdbc:embedded-database> </beans>

然后在创建环境时指定配置文件:

<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>spring.profiles.active</param-name> <param-value>production</param-value> </init-param> </servlet>

于 2013-05-17T03:13:52.597 回答