我需要自我注入原型bean。 据我所知,可能是bean scope =“ singleton”,但在这种情况下,我会从spring获得消息:“应用程序上下文中某些bean的依赖关系形成一个循环:postMan2”
我的豆子:
@Service
@Scope("prototype")
public class PostMan2 implements PostMans2 {
private PostMans2 postman;
@Async
public Future<String> deliverLetter(String message, int i) {
postman.test();
String res = "result!";
return new AsyncResult<String>(res);
}
@Override
public void test() {
System.out.println("Self injection example thread name="+name);
}
@PostConstruct
private void init() {
postman = ctx.getBean(PostMans2.class);
}
}
调用:
@Service
public class PostOffice implements PostOffices {
@Autowired
ApplicationContext ctx;
@Override
public void creatingPostmans() {
PostMans2 thr = ctx.getBean(PostMans2.class);
Future<String> fut = thr.deliverLetter("Some letter", 100);
while (!fut.isDone()) {
Thread.sleep(1000);
}
System.out.println("ending of PostMan's jobs...");
}
}
如何改进我的代码?
答案 0 :(得分:0)
我认为您的init()
正在形成一个循环。
在PostOffice
类中调用此
PostMans2 thr = ctx.getBean(PostMans2.class);
PostMans2
类将被引用。
在PostMans2
中,您定义了init()
,它将再次引用PostMans2
,并且将继续
因此,请尝试从init()
中删除PostMan2
,一切都很好
@PostConstruct
private void init() {
postman = ctx.getBean(PostMans2.class);
}
答案 1 :(得分:0)
为什么需要通过Spring来获取 this 的实例?
看起来像您想要这样做:
@PostConstruct
private void init() {
postman = this;
}