2017-06-09 2 views
0

私は単純なSpringアプリケーションAppMainをautowiringして、明示的なXML構成を使用しないようにします。特定のコンポーネントフィールド型(@SpringBootApplicationと@Autowire)の配線固有のサブクラス

私のTaskSchedulerコンポーネントでは、ThreadPoolTaskExecutorオブジェクトをスーパークラスタイプのtaskExecutorフィールドに配線したいと思います。 XMLでSpringで簡単なことです。

しかし、自動配線と純粋な注釈ベースの設定で可能ですか?どうやってするか?

AppMain

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.scheduling.annotation.EnableScheduling; 

@SpringBootApplication 
@EnableScheduling 
public class AppMain { 
    public static void main(String[] args) { 
     SpringApplication app = new SpringApplication(AppMain.class); 
     app.run(args); 
    } 
} 

TaskScheduler

import org.springframework.core.task.TaskExecutor; 
import org.springframework.stereotype.Component; 
import org.springframework.beans.factory.annotation.Autowired; 

@Component 
public class TaskScheduler { 

    @Autowired 
    private final TaskExecutor taskExecutor; 

    @Scheduled(fixedDelay = 1000) 
    public void checkConfiguration() { 
     // TODO: do some business with task executor (expecting it to be ThreadPoolTaskExecutor in runtime) 
    } 

}

+1

どのように? @Autowireをフィールドの代わりにコンストラクタに追加し、コンストラクタへの入力としてスーパークラスを渡す必要があります。 – handris

+0

ああ、そうですね、次のようなものです: '@Autowired public TaskScheduler(ThreadPoolTask​​Executor taskExecutor){this.taskExecutor = taskExecutor; } 'はトリックをする必要があります...私はそれを試してみましょう。ありがとう! – alwi

+0

残念ながら、これは私に 'コンストラクタパラメータ0で表現されている満足していない依存関係をもたらします。 org.springframework.beans.factory.NoSuchBeanDefinitionException:型 'org.springframework.scheduling.concurrent.ThreadPoolTask​​Executor'の適格なBeanがありません:autowire候補となる少なくとも1つのbeanが必要です。 ' – alwi

答えて

1

私が正しくあなたの質問を取得する場合は、TaskExecutorための配線を必要とするとき、あなたは、特定の実装(ThreadPoolTaskExecutor)が必要です。

この場合、ThreadPoolTask​​ExecutorをビルドしたSpring Beanを持つコンフィグレーションクラスを作成し、メインアプリケーションでコンフィグレーションをインポートする必要があります。

import org.springframework.context.annotation.Bean; 
    import org.springframework.context.annotation.Configuration; 
    import org.springframework.core.task.TaskExecutor; 
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; 

    @Configuration 
    public class AppConfiguration { 

     @Bean 
     public TaskExecutor taskExecutor() { 
      return new ThreadPoolTaskExecutor(); 
     } 
    } 

そして、そのようなあなたのメインクラスを変更:コンストラクタベースの注入を作成する方法について

import org.springframework.boot.SpringApplication; 
import org.springframework.context.annotation.Import; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.scheduling.annotation.EnableScheduling; 

@SpringBootApplication 
@EnableScheduling 
@Import(AppConfiguration.class) 
public class AppMain { 
    public static void main(String[] args) { 
     SpringApplication app = new SpringApplication(AppMain.class); 
     app.run(args); 
    } 
} 
+0

は '@Import(AppConfiguration .class) 'が必要ですか? – alwi

+0

はい、Springはコンポーネントのスキャンと設定のインポートに基づいて依存関係を解決します。 –

関連する問題