Nas*_*ann 3 java spring autowired
我已经使用基于注释的配置运行Spring Boot,但我对于春天来说是一个很新的东西.我真的找不到其他地方的问题解决方案.我有使用以下继承结构的Task对象:
现在我想将一些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)
我的问题再次提出:
谢谢大家.
编辑:这是我在需要时创建新任务的方式:
@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)
您需要在SpecificUserTask类上添加注释@Component.然后,当你@Autowired的SpecificUserTask春天将为它注入一切,这是超级课程.
SpecificUserTask如果你没有用spring的特定注释注释它,Spring对你的对象一无所知.
通过将一个bean的实例放入另一个bean的实例中的字段来实现自动装配.这两个类都应该是bean,并且应该在应用程序上下文中"存活".
应用程序上下文中的"生活"意味着上下文实例化对象,而不是你,你永远不应该做new MyClass().容器找到每个注入点并在那里设置实例.
所以当你用注释来注释bean时,@Service或者@Componentspring找到它们并实例化.
| 归档时间: |
|
| 查看次数: |
3351 次 |
| 最近记录: |