我的单例类中的依赖注入

时间:2014-06-18 16:03:05

标签: java spring dependency-injection singleton autowired

我们说我有界面栏:

public interface Bar {

    void lengthyOperation ();

}

它的实现Foo:

@Service
public class Foo implements Bar {

    void lengthyOperation () {

        // lengthy operation implementation

    }

}

我还有一个名为MyClass的单​​例类:

public class MyClass implements Runnable {

    @Autowired private final Bar bar;

    private final Thread thread;
    private static MyClass instance;

    private MyClass () {

        thread = new Thread (this);
        thread.start();

    }

    public static MyClass getInstance () {

        if (instance == null) instance = new MyClass();
        return instance;

    }

    public void run() {

        while (true) {

            bar.lengthyOperation();
            Thread.sleep(5000);

        }

    }

}

如何使用@Autowired注释(或可能的任何其他方式)将Bar注入MyClass?我试过@Autowired私人决赛吧吧;但它总是空的;

如果无法实现,有没有办法阻止调用@Autowired构造函数两次?如果你不知道我的意思,让我告诉你。这段代码:

@Controller
public class MyClass implements Runnable {

    private final Bar bar;

    @Autowired
    public MyClass (Bar bar) {

        this.bar = bar;
        thread = new Thread (this);
        thread.start();

    }

    public void run() {

        System.out.println("New thread...");

        while (true) {

            bar.lengthyOperation();
            Thread.sleep(5000);

        }

    }

}

将打印出来"新线程......"在控制台中两次。 也许(可能)有更优雅的方式来做这件事,但我不知道它......任何帮助都会受到赞赏!

谢谢!

编辑#1 dimoniy问我如何制作班级实例。基本上,必须在WebApp启动时创建MyClass实例,因此我使用了以下代码:

@Component
public class StartMyClass implements ApplicationListener<ApplicationEvent> {

    public void onApplicationEvent(ApplicationEvent e) {
        MyClass.getInstance();
    }

}

1 个答案:

答案 0 :(得分:1)

如何创建MyClass的实例? @Autowired不起作用,因为您的MyClass实例不是由Spring管理的。您需要在Java / XML spring配置中创建MyClass实例,或者使用@Component注释对其进行注释,并确保Spring可以扫描MyClass包。 您的@Controller注释不正确,因为您的班级显然不是控制者......

例如:

@Configuration
public class MiscConfiguration {

   @Bean
   public MyClass myClass() {
      return new MyClass();//Will be created/managed by Spring, @Autowired will work
   }
}