【问题标题】:Spring bean injection in a main method class主方法类中的 Spring bean 注入
【发布时间】:2012-01-08 22:17:45
【问题描述】:

我有一个带有 spring 3.0 的 Web 应用程序。我需要从一个使用 appcontext xml 中定义的 bean 的 cron 运行一个带有 main 方法的类(使用组件扫描 annocations)。我在同一个 src 目录中有我的主类。 如何将 Web 上下文中的 bean 注入 main 方法。我尝试使用

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

我尝试使用 AutoWired,它返回一个空 bean。所以我使用了 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 dependency-injection inversion-of-control main autowired


【解决方案1】:

Spring boot 对此提供了官方的解决方案。从

下载骨架

https://start.spring.io/

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

【讨论】:

    【解决方案2】:

    试试这个 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());
        }
    }
    

    还有这个豆子:

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

    【讨论】:

      【解决方案3】:

      为了解决这个问题,我创建了https://jira.springsource.org/browse/SPR-9044。如果您喜欢建议的方法,请投票。

      【讨论】:

        【解决方案4】:

        您不能将 Spring bean 注入到任何不是由 spring 创建的对象中。另一种说法是:Spring 只能注入到它管理的对象中。

        由于您正在创建上下文,因此您需要为您的 DAO 对象调用 getBean。

        查看Spring Batch,它可能对你有用。

        【讨论】:

          【解决方案5】:

          您可以为您的主应用程序使用 spring 上下文,并重用与 webapp 相同的 bean。你甚至可以重用一些 Spring XML 配置文件,只要它们没有定义只在 webapp 上下文(请求范围、web 控制器等)中有意义的 bean。

          但是您将获得不同的实例,因为您将运行两个 JVM。如果您真的想重用相同的 bean 实例,那么您的主类应该使用 Web 服务或 HttpInvoker 远程调用 Web 应用程序中某个 bean 的方法。

          【讨论】:

            猜你喜欢
            • 2011-09-09
            • 2015-02-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多