0

我有一系列扩展基础服务的服务。在这个基础服务中,我实例化了一个用于轮询数据库并根据其内容发送通知的类,该轮询的时间由 spring 处理。我期望的是每个扩展基本服务的服务都应该有一个这个轮询器的实例,但是根据我放置@Scheduled 注释的位置,它不起作用。

我想要的是这样的:

public class Base {
    private Poller p = new Poller(this);

    // the rest of the service code
}

public class Poller{

    Base b;

    public Poller(Base B){
        b=B;
    }

    @Scheduled(fixedDelay=5000)
    public void poll(){
        //do stuff
        System.out.println(b.name); //doesn't work, causes really unhelpful errors
        System.out.println("----"); //prints as expected, but only once
                                    //regardless of how many extending services exist
    }
}

但它似乎只在所有扩展程序之间实例化一个轮询器。如果我像这样构造它:

public class Base {
    private Poller p = new Poller(this);

    // the rest of the service code

    @Scheduled(fixedDelay=5000)
    public void poll(){
        p.poll();
    }
}

public class Poller{

    Base b;

    public Poller(Base B){
        b=B;
    }

    public void poll(){
        //do stuff
        System.out.println(b.name); //prints the name of the service for each extender
        System.out.println("----"); //prints as expected, once for each extender
    }
}

它按预期工作,但不符合这里的设计目标。

有没有办法让预定的注释留在轮询器中,同时确保每个扩展服务都有自己的实例?

4

1 回答 1

2

这是因为您的Poller课程不是 Spring 管理的,在哪里Base。 用 in 中的操作符Poller实例化,因此 Spring 没有处理它。如果 Spring 没有创建实例,则它不会由 Spring 管理。newBase

我认为您的设计总体上是有缺陷的。您的孩子有对基数的引用和对孩子的基数。对我来说,您似乎很难以这种方式创建多个子类。

如果你想有一个基类,我会推荐两件事之一。

  1. 遗产。拥有Poller(以及其他子类) extend Base
  2. 代表团。成为Base每个子类的成员,并在子类中委派给它。

使用其中任何一种设计,我认为您都可以让您的代码按预期工作。

于 2013-03-07T20:54:55.673 回答