我有一个带有spring 3.0的Web应用程序。我需要使用来自cron的main方法运行一个类,该cron使用appcontext xml中定义的bean(使用组件扫描annocations)。我的主类在同一个src目录中。 如何从Web上下文中将bean注入main方法。我试着用
做ApplicationContext context = new ClassPathXmlApplicationContext("appservlet.xml");
我尝试使用AutoWired并返回null bean。所以我使用了应用程序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);
}
答案 0 :(得分:5)
您不能将Spring bean注入任何不是由spring创建的对象。另一种说法是:Spring只能注入它管理的对象。
由于您正在创建上下文,因此需要为DAO对象调用getBean。
查看Spring Batch它可能对您有用。
答案 1 :(得分:2)
尝试使用此主菜:
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 :(得分:1)
您可以为主应用程序使用spring上下文,并重用与webapp相同的bean。您甚至可以重用一些Spring XML配置文件,前提是它们没有定义只在webapp上下文中有意义的bean(请求范围,Web控制器等)。
但是你会得到不同的实例,因为你将运行两个JVM。如果你真的想重用相同的bean实例,那么你的主类应该使用web服务或HttpInvoker远程调用webapp中bean的某些方法。
答案 3 :(得分:1)
为了解决这个问题,我创建了https://jira.springsource.org/browse/SPR-9044。如果您喜欢提议的方法,请投票支持。
答案 4 :(得分:1)
Spring Boot为此提供了官方解决方案。从
下载骨架并确保将pom.xml中的包装设置为jar。只要您不包含任何Web依赖项,应用程序将仍然是控制台应用程序。