从main方法调用时,Spring,autowired jdbcTemplate为null

时间:2013-02-14 20:31:29

标签: spring

我的应用程序需要一个从服务器上的JAR文件调用的静态main方法。如果main是静态的,它调用的方法以及字段必须是静态的。问题是,我的jdbcTemplate是自动装配的,静态时为空(我明白这不起作用)。要么我从main中删除'static'而我不能从JAR中调用它,或者我在类中的所有内容都是'static'而jdbcTemplate是null。这个问题的最佳解决方案是什么。

提前致谢。

*请注意,main在此示例中不是静态的,当我在服务器上运行它时,'main'必须是静态的。请记住任何解决方案。

public class Purge {

 @Autowired
 protected JdbcTemplate jdbcTemplate;

 private int PURGE_DAYS = 14;

/**
 * @param args
 */
public void main(String[] args) {
    loadContext();
    purge();
}

ApplicationContext loadContext() {
    return new ClassPathXmlApplicationContext("applicationContext-purge.xml");
}

public void purge() {
    jdbcTemplate.execute("blah blah blah");
}

}

4 个答案:

答案 0 :(得分:0)

  1. 您的main方法不是static。如果是,则无法调用非静态purge()。您的代码中缺少某些内容。你有没有机会打电话给new Purge()?如果是这样,Spring并不知道该实例,也不会自动装配任何东西。

  2. 加载上下文后,您必须从该上下文中获取Purge的实例:

    Purge purge = loadContext().getBean(Purge.class)
    

答案 1 :(得分:0)

如果您需要从main方法访问bean,可以尝试使用ClassPathXmlApplicationContext#getBean

ApplicationContext context = loadContext();

this.jdbcTemplate = (JdbcTemplate) context.getBean("myJdbcBeanName");

答案 2 :(得分:0)

你别无选择,只能主静,下面是优雅的方法做它“春天”的方式。

   @Component
    public class Purge{

     @Autowired
     protected JdbcTemplate jdbcTemplate;

        public void purge(){
                  jdbcTemplate.execute("blah blah blah");

        }

        public static void main(String[] args) {
             ApplicationContext context = 
                    new ClassPathXmlApplicationContext("somthing.xml");
            Purge p = context.getBean(Purge.class);
            p.purge();
        }


    }

答案 3 :(得分:0)

感谢您的帮助。我发现获取jdbcTemplate bean更容易,这是我的解决方案。

public class Purge {

private static int PURGE_DAYS = 14;

/**
 * @param args
 */
public static void main(String[] args) {
    purge((JdbcTemplate) loadContext().getBean("jdbcTemplate"));
}

static ApplicationContext loadContext() {
    return new ClassPathXmlApplicationContext("applicationContext-purge.xml");
}

public static void purge(JdbcTemplate jdbcTemplate) {
    jdbcTemplate.execute("blah blah blah");
}

}