SpringCore - 我可以使用@ContextConfiguration在主类中加载bean而不是创建ApplicationContext obj来加载bean吗?

时间:2017-02-11 01:57:57

标签: spring dependency-injection applicationcontext

我在Spring doc上阅读了这个声明

  

@ContextConfiguration定义了类级元数据,用于确定如何为集成测试加载和配置ApplicationContext。
  具体来说,@ ContextConfiguration声明应用程序上下文资源位置或将用于加载上下文的带注释的类。

然后,我尝试通过将@ContextConfiguration置于类的顶部来加载主类(而不是测试类)中的应用程序上下文,但是Spring无法加载bean定义。

AppJavaBasedConfig

@Configuration
public class AppJavaBasedConfig {

    @Bean
    public IStringUtil stringUtil() {
        return new StringUtil();
    }

    @Bean
    public App app() {
        return new App();
    }
}

主要

@ContextConfiguration(classes=AppJavaBasedConfig.class)
public class App {

    @Autowired
    private IStringUtil stringUtil;

    public static void main(String[] args) {
        // ApplicationContext context = new AnnotationConfigApplicationContext(AppJavaBasedConfig.class);
        // App app = context.getBean(App.class);
        App app = new App();
        app.stringUtil.lower("AAA");
    }
}

抛出NullPointerException。

那么,我们可以在主类中使用这个注释吗?

2 个答案:

答案 0 :(得分:2)

简短的回答是否定的。这是一个概念性问题。 Spring可以加载所有用@Configuration注释的bean;但谁会实例化/启动弹簧容器?

因为你有public static void main我认为endproduct是jar,它将在命令行上以java -jar运行。

当你尝试执行java -jar时,执行的方法是public static void main(如果你有正确的所有清单),你应该做的第一件事就是从中实例化spring container crtl + c你的问题

public static void main(String[] args) {
     ApplicationContext context = new AnnotationConfigApplicationContext(AppJavaBasedConfig.class);
     App app = context.getBean(App.class);

}

如果你不想做所有这些,你可以使用spring boot

答案 1 :(得分:0)

如果在App.java中需要IStringUtil stringUtil并测试一些东西,可以使用@Bean的@PostContruct或init-method属性来调用bean的生命周期:

@Component
public class App {

    @Autowired
    private IStringUtil stringUtil;

    @PostConstruct
    public void init() {

        stringUtil.lower("AAA");
    }
}