2016-09-17 22 views
1

私はスプリングブートを使用しています。例somenameの持つBeanがある場合は、「neededBean。自動コンフィギュレーションスプリングブートに基づいてコントローラを作成する方法

この 『』 neededBeanは、自動構成クラスであり、それが唯一の特定の条件で作成されます。

私はneededBeanはその自動設定をstatisfy doesntの場合はコントローラの作成を避けたいですそれは関係なく、自動コンフィギュレーションクラス

の作成されるようcondition.So私は@Controllerで私のクラスに注釈を付けることができない私は?

答えて

1

org.springframework.boot.actuate.endpoint.mvc.AbstractMvcEndpointはあなたの提案にとっては良いスタートです。

ここでは例を挙げて説明しますが、これは実際のケースでは役に立たないが、現実世界では役に立ちません。 ここでは@ConditionalOnClassを使用しますが、代わりに@ConditionalOnBeanまたは@ConditionalOnMissingBeanを使用する必要があります。

RabbitEndpoint.java - Tomcatを使用している場合にのみ自動構成されます。

/** 
* @author lhuang 
*/ 
@ConditionalOnClass(value = Tomcat.class) 
public class RabbitEndpoint extends AbstractMvcEndpoint { 
    public RabbitEndpoint() { 
     super("rabbit", true); 
    } 

    @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) 
    public void invoke(HttpServletRequest request, HttpServletResponse response) 
      throws IOException, ServletException { 
     System.out.println(" ------ Auto-Configuration on Tomcat.class Conditional ------ "); 
    } 
} 

META-INF/spring.factories、あなたがコンソールを取得するパスを訪れ、 "http://localhost:8080/rabbit"

をスプリングブートアプリを起動後

org.springframework.boot.autoconfigure.EnableAutoConfiguration=io.cloudhuang.web.RabbitEndpoint 

自動設定クラスを登録出力

------ Auto-Configuration on Tomcat.class Conditional ------ 
+0

おかげ黄をしようと、これはまさに私が質問を投稿する前にやったが、私はあなたがアクチュエータのエンドポイントでやっているアクチュエータのエンドポイント –

+0

なしで行うことができるかどうかを確認したいですか?彼の答えのアクチュエータは '@ ConditionalOnBean' /' @ ConditionalOnMissingBean'/'@ ConditionalOnClass'の使用例のほんの一例でした –

2

@Controllerのみによるコンポーネントのスキャンに検出されたかったものを達成する方法はありますコンポーネント全体を削除することができますデフォルトでそのパッケージを削除することができます。次に、他のBean上に条件があるクラスを@Configurationに設定します。その構成内で、コントローラパッケージをスキャンして適切なコントローラを追加するように指示します。

もう1つの方法は、実行中のアプリケーションに対して特定のアクティブなプロファイルが設定されている場合にのみコントローラを有効にすることです(@Profile)。そのプロファイルを使用するシナリオで指定します。

+0

おかげで、ショーンは最初のアプローチに –

0

ありがとうございます。@ConditionalOnBeanアノテーションを見てください彼はdocsです。

この注釈をコントローラに追加してBeanの名前を指定できるため、このBeanがアプリケーションコンテキストで使用可能な場合にのみインスタンス化されます。

@ConditionalOnBean(value=MyBean.class, name="NameOfMyBean") 
@Controller 
public class MyController{ 

    ... 
} 
+0

@ConditionalOnBeanは自動設定ではないクラスでは使用できません。春の文書でもそれを警告します。 –

+0

それは使用することができます。あなたがそうした場合、豆処理の順序は重要なので、使用しないでください。だからこそ私はドキュメントにリンクしています。 –

関連する問題