我是Spring和Spring-Boot的首发,我刚刚创建了我的第一个Spring-Vaadin应用程序。非常好的基本保存和加载对象如何在CRUD接口上工作。
所以我的问题是,自动装配的映射不适用于我创建的服务。
我的主程序(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和autowired annotation的例子......我尝试了大多数版本: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总是为空?一般Spring教程的使用与spring-boot的使用之间的区别在哪里?一般情况下使用弹簧靴与弹簧不同时有什么可避免的吗?
提前致谢。 本
到目前为止我的文件夹结构:
mainProgram
│ MainProgramUI.java
│ MainProgramApplication.java
├───entities
│ MediaObject.java
│ MediaObjectRepository.java
│ SearchQuery.java
│ SearchQueryRepository.java
├───services
│ MediaService.java
│ MediaServiceImpl.java
│ .....
└───suggestion
GenericAccessService.java
.....
好的,zapl的答案适用于那种情况。坚果现在:
我有一些类和一些我添加到我的MainUI的CustomComponents。其中一个组件有一个普通的构造函数,如:
MyCustomUiComponent(MyCustomVlauesObject a);
但是我不想通过所有ComponentClasses将我的单例类传递给我需要它的类。
在TopUiComponent.java中我创建了MiddleUiComponent.java的实例,在这个类中我创建了许多BottomUiComponent.java对象。
因此,如果我想在BottomUiComponent.java中拥有一个Service或Spring管理的常规Object,我必须通过UI -elements的所有构造函数传递它?
所以我附上了我目前的项目状态。在类MovieComponent.java中,我想自动装配一个单例类'ImageCache'。
但我真的没有让它发挥作用。也许有人可以只是短暂的看一下并用解决方案T_T打我。
感谢
答案 0 :(得分:1)
此时必须是null
。春天并不像看起来那么神奇。
public Imdb2BoerseUI() {
mediaService.doSomethring(); //mediaService is null
}
这是构造函数,即使使用Spring的注入,它也是你班级生命周期中的第一个。当Spring注入字段时,它只能在调用该构造函数后执行此操作。否则没有可以设置字段的实体。
你有两个选择:让spring直接在构造函数中注入:
@Autowired
public Imdb2BoerseUI(MediaService mediaService) {
this.mediaService = mediaService;
mediaService.doSomethring(); //mediaService is no longer null
}
或者在弹簧注入字段之后进行所有初始化,方法是在弹出一个方法时调用它:
@PostConstruct
private void init() {
mediaService.doSomethring();
}
构造函数注入是最干净的方法(http://olivergierke.de/2013/11/why-field-injection-is-evil/),但init方法更方便。