web-dev-qa-db-ja.com

メインメソッドクラスでのSpringBeanインジェクション

Spring3.0のWebアプリケーションがあります。 appcontext xmlで定義されたBeanを使用するcronからmainメソッドを使用してクラスを実行する必要があります(コンポーネントスキャン注釈を使用)。同じsrcディレクトリにメインクラスがあります。 WebコンテキストからmainメソッドにBeanを注入するにはどうすればよいですか。使ってみました

ApplicationContext context = new ClassPathXmlApplicationContext("appservlet.xml");

AutoWiredを使用しようとしましたが、nullBeanが返されます。そのため、Application ctxを使用しました。これにより、mainメソッドを実行すると、(予想どおりに)新しいコンテキストが作成されます。しかし、コンテナから既存のBeanを使用できる可能性はありますか。

 @Autowired
 static DAO dao;

    public static void main(String[] args) {
                 ApplicationContext context = new ClassPathXmlApplicationContext("xman-         servlet.xml");
    TableClient client = context.getBean(TableClient.class);
    client.start(context);

}
12
riamob

Springによって作成されていないオブジェクトにSpringBeanを注入することはできません。別の言い方をすれば、Springは管理するオブジェクトにのみ注入できます。

コンテキストを作成しているので、DAOオブジェクトに対してgetBeanを呼び出す必要があります。

チェックアウト Spring Batch それはあなたに役立つかもしれません。

6
DwB

このメインで試してください:

public class Main {

    public static void main(String[] args) {
        Main p = new Main();
        p.start(args);
    }

    @Autowired
    private MyBean myBean;
    private void start(String[] args) {
        ApplicationContext context = 
             new ClassPathXmlApplicationContext("classpath*:/META-INF/spring/applicationContext*.xml");
        System.out.println("The method of my Bean: " + myBean.getStr());
    }
}

そしてこの豆:

@Service 
public class MyBean {
    public String getStr() {
        return "mybean!";
    }
}
2
madx

この問題に対処するために、 https://jira.springsource.org/browse/SPR-9044 を作成しました。提案されたアプローチが気に入ったら、投票してください。

1
btiernay

Spring Bootは、これに対する公式のソリューションを提供します。からスケルトンをダウンロード

https://start.spring.io/

pom.xmlのパッケージがjarに設定されていることを確認してください。 Web依存関係を含めない限り、アプリケーションはコンソールアプリのままになります。

1
Peter Szanto

メインアプリケーションにSpringコンテキストを使用し、Webアプリケーションと同じBeanを再利用できます。 Webアプリケーションコンテキスト(リクエストスコープ、Webコントローラーなど)でのみ意味のあるBeanを定義していない場合は、一部のSpringXML構成ファイルを再利用することもできます。

ただし、2つのJVMが実行されているため、異なるインスタンスを取得します。同じBeanインスタンスを本当に再利用したい場合は、メインクラスがWebサービスまたはHttpInvokerを使用して、Webアプリケーション内のBeanのメソッドをリモートで呼び出す必要があります。

1
JB Nizet