Java Spring:NullPointerException在为静态属性注入bean时
我的主要课程如下:Java Spring:NullPointerException在为静态属性注入bean时,java,spring,dependency-injection,static,spring-java-config,Java,Spring,Dependency Injection,Static,Spring Java Config,我的主要课程如下: package main; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import testbean.MySpringB
package main;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import testbean.MySpringBeanWithDependency;
public class Main {
public static MySpringBeanWithDependency mySpringBeanWithDependency;
@Autowired
public void setTest(MySpringBeanWithDependency mySpringBeanWithDependency) {
Main.mySpringBeanWithDependency = mySpringBeanWithDependency;
}
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
mySpringBeanWithDependency.run();
}
}
package main;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import testbean.MySpringBeanWithDependency;
import writer.NiceWriter;
import writer.Writer;
@PropertySource("atm.properties")
@Configuration
public class AppConfig {
@Bean
public MySpringBeanWithDependency mySpringBeanWithDependency() {
return new MySpringBeanWithDependency();
}
@Bean
public Writer writer() {
return new Writer();
}
@Bean
public NiceWriter niceWriter() {
return new NiceWriter();
}
}
我的AppConfig类如下所示:
package main;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import testbean.MySpringBeanWithDependency;
public class Main {
public static MySpringBeanWithDependency mySpringBeanWithDependency;
@Autowired
public void setTest(MySpringBeanWithDependency mySpringBeanWithDependency) {
Main.mySpringBeanWithDependency = mySpringBeanWithDependency;
}
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
mySpringBeanWithDependency.run();
}
}
package main;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import testbean.MySpringBeanWithDependency;
import writer.NiceWriter;
import writer.Writer;
@PropertySource("atm.properties")
@Configuration
public class AppConfig {
@Bean
public MySpringBeanWithDependency mySpringBeanWithDependency() {
return new MySpringBeanWithDependency();
}
@Bean
public Writer writer() {
return new Writer();
}
@Bean
public NiceWriter niceWriter() {
return new NiceWriter();
}
}
虽然我正在实例化名为mySpringBeanWithDependency的bean并将其分配给静态字段,但run()方法命令抛出了一个NullPointerException
我在一些答案中看到了注入静态场的解决方法,但我想它对我不起作用。有人能指出我哪里出了问题,我应该如何做到这一点吗?
Main
不是bean,也不是实例化的。我相信可能有一种方法可以将bean注入到静态字段中,但在需要时从应用程序上下文获取bean会更有意义:
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MySpringBeanWithDependency bean = context.getBean(MySpringBeanWithDependency.class);
bean.run();
}
这不是依赖注入的工作方式。初始化静态字段是反模式的我试图避免getBean,因为我在spring文档中读到它应该被避免,它写在最后一段中,我不知道它不鼓励使用
getBean()
,谢谢你的澄清。在这种情况下,我认为这样做的方法是,初始化上下文,并用@PostConstruct
注释run()
方法,这意味着它在实例化时被调用。如果bean不是Lazy
,它应该运行您的应用程序。不知道这是不是一个更好的方法,tho。