我有一个spring 3.0的web应用程序。我需要运行一个类与主方法从一个cron,使用在appcontext xml中定义的bean(使用组件扫描注释)。我有我的主类在同一个src目录。我如何从web上下文注入豆子到主要方法。我试着用
ApplicationContext context = new ClassPathXmlApplicationContext("appservlet.xml");
我试图使用AutoWired,它返回一个空bean。所以我使用了applicationctx,当我运行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 bean注入到任何不是由Spring创建的对象中。另一种说法是:Spring只能注入到它所管理的对象中。
由于您正在创建上下文,因此需要为DAO对象调用getBean。
查看Spring Batch,它可能对你有用。
您可以在主应用程序中使用spring上下文,并重用与web应用程序相同的bean。你甚至可以重用一些Spring XML配置文件,只要它们不定义只在web应用上下文中有意义的bean(请求作用域、web控制器等)。
但是您将得到不同的实例,因为您将运行两个jvm。如果您真的想重用相同的bean实例,那么您的主类应该使用web服务或HttpInvoker远程调用web应用程序中bean的一些方法。
Try with this Main:
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());
}
}
And this Bean:
@Service
public class MyBean {
public String getStr() {
return "mybean!";
}
}
为了解决这个问题,我创建了https://jira.springsource.org/browse/SPR-9044。如果你喜欢建议的方法,请投赞成票。
Spring boot提供了一个官方的解决方案。从
下载框架https://start.spring.io/,并确保pom.xml中的打包设置为jar。只要你不包含任何web依赖,应用程序将仍然是一个控制台应用程序。