Spring Boot:为什么@Autowired 不适用于这种情况?

Spring Boot: Why does @Autowired not work for this case?

我有一个 Spring 引导 Java 应用程序,我正在尝试将 @Service 注入 class。我正在使用 @Autowired 但它没有这样做。我在其他 classes 中成功做到了,但不是这个。

服务class:

@Service
@Transactional
public class TaskService {
  ...
}

它工作的 class 是一个用 Vaadin @Route 注释注释的 Vaadin“视图”。我假设 @Route 注释在幕后发生了一些事情,允许它工作。

@Route("main")
public class TaskListView extends HorizontalLayout {

  private final TaskService taskService;

  public TaskListView(@Autowired TaskService taskService) {
    this.taskService = taskService;
  }

  ...
}

它不起作用的 class 也是 Vaadin“视图”,但没有 @Route 注释,因为它不打算导航到,而是用作视图的子组件(即,将在父视图中直接实例化)。

public class EditNotesForm extends VerticalLayout {

  @Autowired
  private TaskService         taskService;

  ...
}

第一个 class 使用构造函数注入,而第二个使用 属性 注入。我不明白为什么这会有所作为,因为我已经在其他应用程序中成功地使用了这两种技术。

由于 EditNotesForm 没有 Route 注释,spring 无法自动发现它,因此它无法注入任何依赖项。

由于您想手动实例化它,因此您需要为自己提供所有依赖项。

但如果您仍想从自动依赖注入中获益,请查看 https://www.baeldung.com/spring-beanfactory

来自 Vaadin 网站:

The only difference between using the router in a standard application and a Spring application is that, in Spring, you can use dependency injection in components annotated with @Route. These components are instantiated by Spring and become Spring-initialized beans. In particular, this means you can autowire other Spring-managed beans.

从常规 Vaadin 组件访问 Spring 组件的一种方法是创建静态获取方法来检索 Spring 组件。这是可以完成的一种方法...但不是唯一的。

@Component
public class StaticHelper {

    private static StaticHelper instance;

    @Autowired
    private ApplicationContext applicationContext;

    @PostConstruct
    public void registerInstance() {
        instance = this;
    }

    public static <T> T getBean(Class<T> class) {
        return instance.applicationContext.getBean(class);
    }

}

所以在你的例子中...

private TaskService taskService = StaticHelper.getBean(TaskService.class);