使用裸初始化项目

时间:2015-10-05 20:56:48

标签: java spring service autowired

我是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打我。

感谢

http://tinyurl.com/nunnyfm

1 个答案:

答案 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方法更方便。