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);
}
Springによって作成されていないオブジェクトにSpringBeanを注入することはできません。別の言い方をすれば、Springは管理するオブジェクトにのみ注入できます。
コンテキストを作成しているので、DAOオブジェクトに対してgetBeanを呼び出す必要があります。
チェックアウト Spring Batch それはあなたに役立つかもしれません。
このメインで試してください:
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!";
}
}
この問題に対処するために、 https://jira.springsource.org/browse/SPR-9044 を作成しました。提案されたアプローチが気に入ったら、投票してください。
Spring Bootは、これに対する公式のソリューションを提供します。からスケルトンをダウンロード
pom.xmlのパッケージがjarに設定されていることを確認してください。 Web依存関係を含めない限り、アプリケーションはコンソールアプリのままになります。
メインアプリケーションにSpringコンテキストを使用し、Webアプリケーションと同じBeanを再利用できます。 Webアプリケーションコンテキスト(リクエストスコープ、Webコントローラーなど)でのみ意味のあるBeanを定義していない場合は、一部のSpringXML構成ファイルを再利用することもできます。
ただし、2つのJVMが実行されているため、異なるインスタンスを取得します。同じBeanインスタンスを本当に再利用したい場合は、メインクラスがWebサービスまたはHttpInvokerを使用して、Webアプリケーション内のBeanのメソッドをリモートで呼び出す必要があります。