spring - 带有范围原型的抽象类中的自动装配接口不起作用

时间:2018-04-17 15:36:55

标签: java spring autowired

我有一个example spring project,其中我有一个抽象类Athlete,我想在其中自动加入接口Trainer

AthleteRunnable,其实现会覆盖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

感谢您的帮助

2 个答案:

答案 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实例,那么您可以执行类似的操作。

https://dzone.com/articles/instanciating-spring-component