使用Spring Initializer创建一个简单的Spring引导。我仅在可用选项下选择DevTools。
创建项目后,无需对其进行任何更改,就可以正常运行该程序。
现在,当我尝试在项目中进行一些自动装配时,它根本不起作用。我不明白一直在这里寻找所有以前的问题的解决方案,但没有解决方案,而且我在我的情况下所做的工作没有什么复杂,如下所示。请告知我所缺少的。
@SpringBootApplication
public class DemoApplication {
// @Autowired
// private static Maker maker; // Stopped using this cos I wanted to check if the autowiring is not working in this class only or anywhere. Turns out it is anywhere.
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
Maker maker = new Maker();
maker.printName(); // Fails cos of ServiceHelper Autowiring
}
}
@Service
public class Maker {
@Autowired
private ServiceHelper serviceHelper;
public void printName(){
System.out.println("This is from the method body itself.");
System.out.println("Auto wiring works cos I got this -> " + serviceHelper.help());
}
}
@Component
public class ServiceHelper {
public String help(){
return "...FROM HELPER...";
}
}
StackTrace
线程“ restartedMain”中的异常 java.lang.reflect.InvocationTargetException在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)位于 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:497)在 org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) 由以下原因引起:java.lang.NullPointerException com.example.demo.services.Maker.printName(Maker.java:15)在 com.example.demo.DemoApplication.main(DemoApplication.java:17)... 5 更多
答案 0 :(得分:1)
您创建了一个实例,它的ServiceHelper
不会被Spring自动连接:
Maker maker = new Maker();
您可以通过ApplicationContext
访问Bean:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext cts = SpringApplication.run(DemoApplication.class, args);
Maker maker = ctx.getBean(Maker.class);
maker.printName();
}
}
答案 1 :(得分:1)
如果使用new
关键字创建任何bean时,该bean不会添加到Spring Application Context
中,这是@Autowire
静态bean的一种方法
@SpringBootApplication
public class DemoApplication {
@Autowired
private static Maker maker;
@Autowired
private Maker tMaker;
@PostConstruct
public void init() {
DemoApplication.maker = tMaker;
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
maker.printName();
}
}
或者您可以使用Autowire
来进行Constructor
,Maker
的实例在创建DemoApplication
时作为构造函数的参数注入
@Autowired
public DemoApplication(Maker maker) {
DemoApplication.maker = maker;
}
或者您可以在setter方法上使用@Autowired
,创建Maker
时将以DemoApplication
的实例调用setter方法
@Autowired
public void setMaker(Maker maker) {
DemoApplication.maker = maker
}
答案 2 :(得分:0)
当您使用new Maker()
时,您没有使用为您创建的Spring Bean,结果是您的对象未初始化,因为没有注入依赖项。
您需要获取Spring框架创建的bean,就像我在下面所做的那样,因为您不能直接自动绑定静态字段:
@SpringBootApplication
public class DemoApplication {
private static Maker maker;
@Autowired
public void setMaker(Maker maker) {
DemoApplication.maker = maker;
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
maker.printName();
}
}