自注入原型Bean-循环参考

时间:2018-08-02 03:19:06

标签: java spring spring-bean

我需要自我注入原型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...");

    }


}

如何改进我的代码?

2 个答案:

答案 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;
}