Пружинная круговая зависимость с областью применения PROTOTYPE - PullRequest
0 голосов
/ 01 июня 2018

Я создал сценарий ниже, чтобы понять зависимость Spring Circular.

Чисто, когда сфера одиночная.Но конфликт возникает, когда S COPE равен PROTOTYPE.

Так что я хочу знать, есть ли поддержка Spring, избегаемая по сценарию ниже, или мы должны изменить дизайн.если так, пожалуйста, предложите какой-нибудь дизайн.

Рассмотрим пример ниже.

@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class BeanB {

    private BeanA beanA;

    @Autowired
    public void setBeanA(BeanA beanA) {
        this.beanA = beanA;
    }

    public void printBeanB() {
        System.out.println(getBeanName());
    }

    public void printBeanBBeanA() {
        System.out.println(getBeanName() + " - " + beanA.getBeanName());
    }

    public String getBeanName() {
        return "Bean B";
    }
}


@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class BeanA {

    private BeanB beanB;

    @Autowired
    public void setBeanB(BeanB beanB) {
        this.beanB = beanB;
    }

    public void printBeanA() {
        System.out.println(getBeanName());
    }

    public void printBeanABeanB() {
        System.out.println(getBeanName() + " - " + beanB.getBeanName());
    }

    public String getBeanName() {
        return "Bean A";
    }
}

Это дает ошибку:

Описание:

Зависимости некоторых компонентов в контексте приложения образуют цикл:

demoApplication (поле private com.example.demo.beans.BeanA com.example.demo.DemoApplication.beanA)

Поэтому поддержка Spring позволяет избежать этого или мы должны изменить дизайн.если так, пожалуйста, предложите какой-нибудь дизайн.

1 Ответ

0 голосов
/ 04 июня 2018

Я мог бы решить эту проблему с помощью аннотации @Lazy, как показано ниже.

@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class BeanA {

    @Autowired
    @Lazy
    private BeanB beanB;
    public void printBeanA() {
        System.out.println(getBeanName());
    }

    public void printBeanABeanB() {
        System.out.println(getBeanName() + " - " + beanB.getBeanName());
    }

    public String getBeanName() {
        return "Bean A";
    }
}

@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class BeanB {

    @Autowired
    @Lazy
    private BeanA beanA;

    public void setBeanA(BeanA beanA) {
        this.beanA = beanA;
    }

    public void printBeanB() {
        System.out.println(getBeanName());
    }

    public void printBeanBBeanA() {
        System.out.println(getBeanName() + " - " + beanA.getBeanName());
    }

    public String getBeanName() {
        return "Bean B";
    }
}
...