我在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。
那么,我们可以在主类中使用这个注释吗?
答案 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");
}
}