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 が local に設定されている場合、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 を使用し、それ以外の場合は 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 に答える