我们说我有界面栏:
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();
}
}
答案 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
}
}