我是 Spring 和 Spring-Boot 初学者,我刚刚创建了我的第一个 Spring-Vaadin 应用程序。对象的基本保存和加载如何通过 CRUD 接口(interface)工作,真是太好了。
所以我的问题是,自动连接映射无法与我创建的服务一起使用。
我的主程序(MainProgramApplication.java)看起来像:
@SpringBootApplication
public class MainProgramApplication {
public static void main(String[] args) {
SpringApplication.run(MainProgramApplication.class, args);
}
}
有问题的类是 MainProgramUI.java:
@Widgetset("AppWidgetset")
@SpringUI
public class Imdb2BoerseUI extends UI {
private static final long serialVersionUID = -6573726003150257919L;
private final VerticalLayout masterLayout;
private VerticalLayout resultLayout;
.......
@Autowired
private MediaService mediaService;
public Imdb2BoerseUI() {
mediaService.doSomethring(); //mediaService is null
}
}
所以我真的不知道为什么这个服务总是空的:( 我发现了很多带有 spring 和 Autowiring 注释的示例...我尝试了大多数版本:D
所以我最后一次尝试是这个(MediaService.java -> MediaServiceImpl.java)
MediaService.java:
@Service
@Configurable
public interface MediaService extends GenericAccessService<MediaObject>{
public List<MediaObject> getItemsBySearchString(String filterString);
}
MediaServiceImpl.java:
public class MediaServiceImpl implements MediaService{
@Autowired
private SearchQueryRepository searchQueryRepository; //works
@Autowired
private MediaObjectRepository MediaObjectRepository;
public MediaServiceImpl() {
doAnything();
}
............
}
并完成主 GenericAccessService-Interface:
public interface GenericAccessService<T> {
List<T> searchInDataBase(String filterPrefix, long firstResult);
long countInDataBase(String filterPrefix);
}
所以我的初学者问题是:为什么 mediaService 总是为 null?一般Spring教程的使用和spring-boot的使用有什么区别?使用 spring-boot 与一般的 spring 不同时,有什么需要避免的事情吗?
提前致谢。 本
<小时/>这是到目前为止我的文件夹结构:
mainProgram
│ MainProgramUI.java
│ MainProgramApplication.java
├───entities
│ MediaObject.java
│ MediaObjectRepository.java
│ SearchQuery.java
│ SearchQueryRepository.java
├───services
│ MediaService.java
│ MediaServiceImpl.java
│ .....
└───suggestion
GenericAccessService.java
.....
<小时/>
编辑
好吧,zapl 的答案在这种情况下有效。现在坚果:
我有一些类和一些 CustomComponents 添加到我的 MainUI 中。其中一个组件有一个普通的构造函数,例如:
MyCustomUiComponent(MyCustomVlauesObject a);
但我不想将我的单例类通过所有 ComponentClass 传递给我需要的类。
在 TopUiComponent.java 中,我创建了 MiddleUiComponent.java 的实例,并在此类中创建了许多 BottomUiComponent.java 的对象。
因此,如果我想在 BottomUiComponent.java 中拥有一个由 Spring 管理的服务或常规对象,我必须将其传递给 UI 元素的所有构造函数?
所以我附上了项目的当前状态。在类 MovieComponent.java 中,我想 Autowiring 一个单例类“ImageCache”。
但是我真的没有让它发挥作用。也许有人可以简单看一下并告诉我解决方案 T_T
谢谢
最佳答案
此时它必须为null
。 Spring 并不像看上去那么神奇。
public Imdb2BoerseUI() {
mediaService.doSomethring(); //mediaService is null
}
这就是构造函数,即使使用 Spring 注入(inject),它也是类生命周期中的第一个位置。当 Spring 注入(inject)字段时,它只能在调用该构造函数之后才能执行。否则没有实体可以设置字段。
你有2个选择:让spring直接注入(inject)到构造函数中:
@Autowired
public Imdb2BoerseUI(MediaService mediaService) {
this.mediaService = mediaService;
mediaService.doSomethring(); //mediaService is no longer null
}
或者在 spring 注入(inject)字段后通过为 spring 提供一个方法在准备好后调用来完成所有初始化:
@PostConstruct
private void init() {
mediaService.doSomethring();
}
构造函数注入(inject)是最干净的方式( http://olivergierke.de/2013/11/why-field-injection-is-evil/ ),但初始化后方法更方便。
关于java - Spring(-Boot) Autowiring 在裸初始化项目中始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32957755/