我有一个example spring project,其中我有一个抽象类Athlete
,我想在其中自动加入接口Trainer
。
Athlete
为Runnable
,其实现会覆盖perform()
方法。
当我在perform()
中调用Sprinter
(扩展Athlete
)时,我想要自动装入Trainer
的{{1}}个实例仍然为空
运动员:
Athlete
短跑:
@Component
@Scope("prototype")
public abstract class Athlete implements Runnable{
protected final String name;
@Autowired protected Trainer trainer;
public Athlete(String name)
{
this.name = name;
}
protected abstract void perform();
@Override
public void run() {
perform();
}
}
@Component
@Scope("prototype")
public class Sprinter extends Athlete {
public Sprinter(String name) {
super(name);
}
@Override
protected void perform()
{
this.trainer.giveAdviceTo(name); // TRAINER IS NULL !!!!!!
for(int i=0;i<3;i++)
{
System.out.println("Sprinting...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Trainer
感谢您的帮助
答案 0 :(得分:1)
在我看来,在您的主要课程中,您自己就是在创建这些对象。
运动员a1 =新短跑运动员(&#34; adam&#34;);
Spring只能将对象自动装配到(托管)bean中。此时,Spring根本不知道您创建的Sprinter实例是否存在。
当你让Spring为你创建bean时,它也会注入所有@Autowired依赖项。
@Autowired
private BeanFactory beanFactory;
@Override
public void run(String... args) throws Exception {
Sprinter adam = beanFactory.getBean(Sprinter.class, "adam");
TennisPlayer roger = beanFactory.getBean(TennisPlayer.class, "roger");
executor.execute(adam);
executor.execute(roger);
}
答案 1 :(得分:1)
您正在尝试使用非默认构造函数(带参数的构造函数)创建bean对象。您可以在类中声明默认构造函数,或者如果您确实想要使用非默认构造函数创建bean实例,那么您可以执行类似的操作。