2016-10-24 4 views
0

Я видел одну из программ, в которых MyConfig (файл конфигурации Spring) ссылается на конструктор одного из компонентов, чтобы получить другой компонент, определенный в MyConfig. Я не уверен в такой конфигурации. Я вижу циклическую ссылку в этом виде кода, хотя он работает нормально, но я не могу понять поток. Как это работает. Ниже приводится копия этого кода -Ссылка на Spring Java Config в bean-конструкторе для получения другого компонента в построенном классе

@Configuration 
public class MyConfig { 

    @Bean(name="a") 
    @Scope("prototype") 
    public A getA() { 
     return new A(); 
    } 

    @Bean(name="b") 
    @Scope("prototype") 
    public B getB() { 
     return new B(); 
    } 

    @Bean(name="c") 
    @Scope("prototype") 
    public C getC() { 
     return new C(); 
    } 

    @Bean(name="queueListener") 
    @Scope("singleton") 
    public Queue getQueue() { 
     return new Queue(MyConfig config); 
    } 

} 

Вот мой класс Queue -

public class Queue implements MessageListener{ 

    private MyConfig config; 

    public Q(MyConfig config) { 
     this.config = config; 
    } 

    @Override 
    public void onMessage() { 
     createC(); 
    } 

    public void createC() { 
     C cObj = config.getC(); 
     cObj.setConfig(config); 
     cObj.performTask(); 
    } 
} 

класс "C" выглядят как this-

public class C{ 

    private transient MyConfig config; 
    private MyConfig config; 

    public C() {  
    } 

    public void setConfig(MyConfig config) { 
     this.config = config; 
    } 

    public MyConfig getConfig() { 
     return config; 
    } 

    public void performTask() {  
     A a = config.getA(); // Is it right way to get bean? 
     B b = config.getB(); 
    } 

} 

Так что мой вопрос заключается в том, что это правильный способ получить фасоль в другой фасоли? Будет ли объект возврата действительно объектом весового компонента или просто классом класса java?

Я вижу циклическую ссылку в приведенном выше коде. Когда экземпляр класса Queue будет создан внутри MyConfig, вы получите экземпляр/ссылку MyConfig. Будет ли это создавать циклические ссылки? Мой Архитектор предложил мне подход выше, а не autoWiring Контекст приложения в обоих классах Queue и class «C». По архитектурному контексту очень тяжелый, и это не лучшая практика.

Каким будет цикл выполнения или иерархия вызовов, когда bean Queue создается? Было бы очень полезно понять работу над кодом.

ответ

0

Пожалуйста, смотрите пример на Spring Boot @Autowired creating instances on a runtime Вы можете увидеть, как использовать синглтон и прототипы повернут

+0

ссылки на внешние ресурсы, рекомендуется, но, пожалуйста, добавить контекст вокруг ссылки, так что ваши коллеги пользователи будут иметь некоторое представление о том, что это есть и почему он есть. Всегда указывайте наиболее значимую часть важной ссылки, если целевой сайт недоступен или постоянно находится в автономном режиме. – segarci

0

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

Если вы хотите, чтобы ввести прототип фасоли с одноплодной вы можете использовать метод, описанный здесь: Howto generate prototype objects with in a singleton bean using spring java configurations

 Смежные вопросы

  • Нет связанных вопросов^_^