Мой основной класс выглядит следующим образом:
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();
}
}
И мой класс AppConfig выглядит следующим образом:
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();
}
}
Хотя я создаю экземпляр bean-компонента с именем mySpringBeanWithDependency и назначаю его статическому полю, команда метода 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, потому что я читал в весенней документации, что этого следует избегать, это написано в последнем абзаце здесь
Я не знал, что использовать getBean() не рекомендуется, спасибо за разъяснение. В этом случае я бы предположил, что способ сделать это - просто инициализировать контекст и аннотировать метод run() с помощью @PostConstruct, что означает, что он вызывается при создании экземпляра. Если bean-компонент не Lazy, он должен запустить ваше приложение. Не могу сказать, лучше ли это.
Инъекция зависимостей работает не так. инициализация статического поля - антипаттерн