Spring bean注入一个main方法类

时间:2011-11-29 15:08:36

标签: spring dependency-injection inversion-of-control main autowired

我有一个带有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);

}

5 个答案:

答案 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为此提供了官方解决方案。从

下载骨架

https://start.spring.io/

并确保将pom.xml中的包装设置为jar。只要您不包含任何Web依赖项,应用程序将仍然是控制台应用程序。