Java Spring Boot中的继承:@Autowired字段为null(需要在非Spring托管类中自动连接-多个实例)
我已经在运行基于注释的配置的Spring引导,但我对Spring还很陌生。我真的在别处找不到解决我问题的办法。 我有以下继承结构的任务对象:Java Spring Boot中的继承:@Autowired字段为null(需要在非Spring托管类中自动连接-多个实例),java,spring,autowired,Java,Spring,Autowired,我已经在运行基于注释的配置的Spring引导,但我对Spring还很陌生。我真的在别处找不到解决我问题的办法。 我有以下继承结构的任务对象: 父任务 系统任务 用户任务 特定用户任务 现在我想将一些存储库自动连接到SystemTask。我还想将存储库和一些服务自动连接到UserTask(及其所有子项) 我该怎么做?使用下面的代码,我得到一个空指针异常 家长: public abstract class ParentTask implements Runnable { //
- 父任务
- 系统任务
- 用户任务
- 特定用户任务
public abstract class ParentTask implements Runnable {
// some fields
protected ParentTask(/*fields*/) {
//this.fields = fields;
}
@Override
public abstract void run();
}
第一个孩子:
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
}
}
UserTask的子级(应具有UserTask的自动连接资源)
My Repository是一个标准的mongo Repository imlpement,不应该有任何错误。我的“someService”看起来像这样:
@Service
public class SomeService{
// some fields
@Autowired
private someOtherRepository someOtherRepository;
// some methods
public void doSomething() {
//...
}
}
我的问题是:
@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);
}
}
您需要在
SpecificUserTask
类上添加注释,如@Component
。然后,当您@Autowired
您的SpecificUserTask
spring将为它注入一切,并注入它的超类
如果您没有使用Spring的特定注释对对象进行注释,Spring对您的SpecificUserTask
对象一无所知
通过将一个bean的实例放置到另一个bean实例的字段中,可以实现自动连接。这两个类都应该是bean,并且应该“活”在应用程序上下文中
在应用程序上下文中“生存”意味着上下文实例化对象,而不是您,您永远不应该创建newmyclass()
。容器找到每个注入点并在那里设置一个实例
因此,当您使用诸如
@Service
或@Component
之类的注释对bean进行注释时,spring会找到它们并进行实例化。我解决了我的问题,实际上需要在非spring管理的类中使用自动连接的服务/存储库。
我使用了手动依赖项注入,如下所述:这样,我可以拥有一个类的多个实例,也可以使用spring管理的服务。这是我现在的代码:
@Service
public class TaskAdministration {
@Autowired
private ApplicationContext appContext;
private final TaskAdministrationRepository taskAdministrationRepository;
public void commissionSystemTask(fields) {
SystemTask task = new SystemTask(trigger);
AutowireCapableBeanFactory factory = appContext.getAutowireCapableBeanFactory();
factory.autowireBean( task );
factory.initializeBean( task, "SystemTask" );
taskScheduler.schedule(task, task.trigger);
// persist task to restore if necessary
taskAdministrationRepository.save(task);
}
}
如何创建任务对象?这些必须由Spring管理,否则自动布线将无法工作。我在问题中添加了它。我用“新…”来创建它们。还有别的办法吗?我需要多个实例。请您也添加原因:)好的,但是如果我想在非Spring托管类中添加服务或组件,我该怎么做?有没有其他可能实施这样的事情?
@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);
}
}
@Service
public class TaskAdministration {
@Autowired
private ApplicationContext appContext;
private final TaskAdministrationRepository taskAdministrationRepository;
public void commissionSystemTask(fields) {
SystemTask task = new SystemTask(trigger);
AutowireCapableBeanFactory factory = appContext.getAutowireCapableBeanFactory();
factory.autowireBean( task );
factory.initializeBean( task, "SystemTask" );
taskScheduler.schedule(task, task.trigger);
// persist task to restore if necessary
taskAdministrationRepository.save(task);
}
}