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);
我有一个 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);