此问题在此处已有答案:
Why is my Spring @Autowired field null?(21个答案)
14天前关闭。
注意:我发现了解决方案,因此正在更新。
这个问题类似于Why is my Spring @Autowired field null?,但我在这里使用的是main()
方法。解决方案是用@Component
标记Foo
,并通过@PostConstruct
方法将其自动连接到Main
。我是通过How to use autowired (@Autowired) references from main(String[] args) method?了解到这一点的
在构造后:Why use @PostConstruct?
@PostConstruct
确保所有bean在执行之前都已完全初始化(包括正在编辑的bean类)。
但更大的问题是我在做Foo foo = new Foo()
。foo
不在Spring的上下文范围内,它的生命周期100%都由我来管理。通过自动配置一切,把一切都放回Spring的手中:
新Main.java
package org.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.annotation.PostConstruct;
@SpringBootApplication
public class Main {
@Autowired
Foo foo;
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
@PostConstruct
public void test() {
foo.message();
}
}
新Foo.java
package org.example;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
@Component
@Slf4j
public class Foo {
@Autowired
Bar bar;
public Foo() {
log.info("Foo bean created");
}
public void message() {
log.info(bar.getWord());
}
}
原始问题如下:
我已经看了很多这样的Spring教程,但是我从来都不知道我做错了什么,但是我真的需要帮助来解决这个问题。
第1001章:我的Main.java
package org.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
Foo foo = new Foo();
foo.message();
}
}
第1001章:我的Foo.java
package org.example;
import org.springframework.beans.factory.annotation.Autowired;
public class Foo {
@Autowired
Bar bar;
public void message() {
System.out.println(bar.getWord());
}
}
第1001章:我的Bar.java
package org.example;
import org.springframework.stereotype.Component;
@Component
public class Bar {
String word = "word";
public String getWord() {return word;}
}
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>untitled</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
</dependencies>
</project>
当从Main()运行时,我得到:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "org.example.Bar.getWord()" because "this.bar" is null
at org.example.Foo.message(Foo.java:11)
at org.example.Main.main(Main.java:14)
这些都在同一个目录/包中。我已经在这两个小时,不知道为什么这是不工作。任何帮助将非常感谢。
我尝试过:
- 使用@Autowired创建一个可以在另一个类中使用的bean。
我期望发生的事情:
- 要输出到控制台的字符串
word
。 - 我的理解是,如果你使用@Autowired来注入一个包含@Component的类,那么Spring就会把它作为一个bean。我已经满足了这个条件,但是我没有得到我预期的结果。
实际结果:
- 空指针异常
1条答案
按热度按时间bgibtngc1#
自动连接只在注入组件时才起作用。您必须使Foo也成为一个组件(或定义一个bean),并将其自动连接到您的主类中。或者,您可以使用ApplicationContext的一个示例。
您也不需要
@ComponentScan
注解,因为@SpringBootApplication
已经有了它。请参阅:https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/using-boot-using-springbootapplication-annotation.html