java - Spring(-Boot) Autowiring 在裸初始化项目中始终为空

标签 java spring service autowired

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

谢谢

http://tinyurl.com/nunnyfm

最佳答案

此时它必须为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/

相关文章:

java - 在 Airflow 中设置 DB2

javascript - 将对象内部的文件从 angular2 发送到 Spring Rest

Spring 数据 jpa : Not an managed type: class xxx

android - 不同 API 级别的不同 AndroidManifest 文件

linux - 系统错误 “failed to start service: unit service is not loaded properly: exec format error”

java - http客户端的架构

java - 之前的注释缺少属性值的值

java - Spring可缓存多个节点

service - Symfony3 : Service not able to get arguments

java - 如何将 iReport 字体更改为参数