14

Runnable を実装し、スプリング TaskExecutor に自動配線されたクラスをどのように作成できますか?

たとえば、私はタスクを持っています:

public class MyTask implements Runnable {

    @Autowired private MyRepository myRepository;

    @Override
    public void run() {
        myRepository.doSomething();
    }
}

そして、Spring TaskExecutor にタスクを送信するサービス:

@Service
public class MyService {

    @Autowired private TaskExecutor taskExecutor;

    public void someMethod() {

        MyTask myTask = new MyTask();
        taskExecutor.execute(myTask);

    }

}

MyTask は new MyTask() を使用してインスタンス化されているため、フィールドが自動配線されていないことはわかっています。しかし、どうすればこれを回避できますか?Spring の ApplicationContext にアクセスして、それを介して Bean を作成する必要がありますか? Web アプリケーション環境でこれを行うにはどうすればよいでしょうか?

ありがとう!

4

2 に答える 2

4

Spring を使用してこれを行うには、少なくとも 2 つの良い方法があります。まず、@Configurableアノテーション。これを使用すると、AspectJ に依存することになりますが、Spring によって管理されていない (つまり、new 演算子を使用している) Bean を注入できるようになります。これには、リンクに記載されているように、MyTask に @Configurable で注釈を付け、Spring 構成に数行を追加する必要があります。

@Configurable
public class MyTask implements Runnable { ... }

@Service
public class MyService {
   @Autowired private TaskExecutor taskExecutor;

   public void someMethod() {

     // AspectJ would jump in here and inject MyTask transparently
     MyTask myTask = new MyTask();
     taskExecutor.execute(myTask);

}

}

2 番目のアプローチでは、Spring の ServiceLocatorFactoryBean 機能を使用してプロトタイプ Bean を作成します。これはJavaDocで最もよく説明されていますが、この状況では、他の Bean と同じように @Service アノテーションが付けられたクラスに TaskFactory を注入し、次のようにします。

@Service
public class MyService {
  @Autowired private TaskExecutor taskExecutor;
  @Autowired private MyRepository myRepository;
  @Autowired private TaskFactory taskFactory;


public void someMethod() {
    MyTask myTask = taskFactory.getTask("myTask")
    taskExecutor.execute(myTask);
}

}

XML マッピングでこれを構成できるため、MyTask は既にリポジトリに挿入されています。私はこれらの両方のアプローチを日常的に使用していますが、読みやすく、開発者が簡単にテストできないことを行わないようにすることで開発者を正直に保つのに役立つため、後者を好む傾向があります。カジュアルな観察者には明らかです。

于 2013-04-19T00:36:43.550 に答える