Spring Boot中的继承:@Autowired字段为空(需要在非Spring托管类中自动装配 - 多个实例)

Nas*_*ann 3 java spring autowired

我已经使用基于注释的配置运行Spring Boot,但我对于春天来说是一个很新的东西.我真的找不到其他地方的问题解决方案.我有使用以下继承结构的Task对象:

  • ParentTask
    • SystemTask
    • UserTask
      • SpecificUserTask

现在我想将一些Repository自动装配到SystemTask.此外,我想将存储库和一些服务自动装配到UserTask(以及它的所有子节点).

我该怎么做呢?使用以下代码,我得到一个空指针异常.

父母:

public abstract class ParentTask implements Runnable {

    // some fields

    protected ParentTask(/*fields*/) {
        //this.fields = fields;
    }

    @Override
    public abstract void run();

}
Run Code Online (Sandbox Code Playgroud)

第一个孩子:

public class SystemTask extends ParentTask {

    @Autowired
    protected SomeService someService;

    protected SystemTask(/*fields*/) {
        super(fields);
        //set some other fields
    }

    @Override
    public void run() {
        someService.doSomething(); // <-- nullPointerException
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个孩子:

public abstract class UserTask extends ParentTask {

    @Autowired
    protected SomeService someService;
    @Autowired
    protected SomeRepository someRepository;

    protected UserTask(/*fields*/) {
        super(fields);
    }

    @Override
    public abstract void run();

}
Run Code Online (Sandbox Code Playgroud)

UserTask的子项(应具有UserTask的自动化资源)

public class SpecificUserTask extends UserTask{

    private SpecificUserTask (/*fields*/) {
        super(fields);
        //set some other fields
    }

    @Override
    public void run() {
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

我的存储库是一个标准的mongo存储库imlpementation,不应该有任何错误.我的"someService"看起来像这样:

@Service
public class SomeService{

    // some fields

    @Autowired
    private someOtherRepository someOtherRepository;

    // some methods

    public void doSomething() {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题再次提出:

  1. 如何解决NullPointerException?
  2. 如何在UserTask中自动装配字段,以便它们在SpecificUserClass中可用?

谢谢大家.

编辑:这是我在需要时创建新任务的方式:

@Service
public class TaskAdministration {

    private final TaskAdministrationRepository taskAdministrationRepository;

    public void commissionSystemTask(fields) {

        SystemTask task = new SystemTask(fields);
        taskScheduler.schedule(task, taskTrigger);

        // persist task to restore if necessary
        taskAdministrationRepository.save(task);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ore*_*est 8

您需要在SpecificUserTask类上添加注释@Component.然后,当你@AutowiredSpecificUserTask春天将为它注入一切,这是超级课程.

SpecificUserTask如果你没有用spring的特定注释注释它,Spring对你的对象一无所知.

通过将一个bean的实例放入另一个bean的实例中的字段来实现自动装配.这两个类都应该是bean,并且应该在应用程序上下文中"存活".

应用程序上下文中的"生活"意味着上下文实例化对象,而不是你,你永远不应该做new MyClass().容器找到每个注入点并在那里设置实例.

所以当你用注释来注释bean时,@Service或者@Componentspring找到它们并实例化.