Этот вопрос аналогичен вопросу «Почему мое поле Spring @Autowired имеет значение null?», но я использую метод main() здесь. Решение состоит в том, чтобы пометить Foo с помощью @Component и автоматически подключить его к Main с помощью метода @PostConstruct. Я узнал об этом из раздела «Как использовать ссылки (@Autowired) из метода main(String[] args)»?
В PostContruct: зачем использовать @PostConstruct?
Код: Выделить всё
@PostConstruct
Но более серьезной проблемой было то, что я делал 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();
}
}
Код: Выделить всё
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, в которых это делается таким образом, и это никогда не работает с моей стороны. Понятия не имею, что я делаю не так, но мне серьезно нужна помощь, чтобы разобраться в этом.
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();
}
}
Код: Выделить всё
package org.example;
import org.springframework.beans.factory.annotation.Autowired;
public class Foo {
@Autowired
Bar bar;
public void message() {
System.out.println(bar.getWord());
}
}
Код: Выделить всё
package org.example;
import org.springframework.stereotype.Component;
@Component
public class Bar {
String word = "word";
public String getWord() {return word;}
}
Код: Выделить всё
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">
4.0.0
org.example
untitled
1.0-SNAPSHOT
17
17
UTF-8
org.springframework.boot
spring-boot-starter
2.7.5
Код: Выделить всё
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-компонента, который Могу использовать на другом занятии.
- Строковое слово для вывода на консоль.
- Насколько я понимаю, класс с @Component может быть использован Spring как bean-компонент, если вы используете @Autowired для его внедрения. Я выполнил эти критерии и не получил ожидаемого результата.
- Исключение NullPointerException
Подробнее здесь: https://stackoverflow.com/questions/743 ... using-fiel