4

Как ленить инициализировать зависимость, которая является @Inject?Lazy init инжектированная зависимость бобов (весна 3)

public class ClassA { 
    @Inject 
    ClassB classB; 
} 


@Configuration 
public class Config { 
    @Bean 
    public ClassA classA() { 
     return new ClassA(); 
    } 

    @Bean 
    @Lazy 
    public ClassB classB() { 
     return new ClassB(); 
    } 
} 

Когда CLASSA боб конкретизируется, ClassB боб также экземпляр, несмотря на @Lazy аннотацию. Как я могу избежать создания экземпляра класса B?

+1

Это лениво, пока вам это не понадобится. Spring нужно создать экземпляр, чтобы вставить его в 'ClassA', поэтому в этот момент он инициализируется. –

ответ

0

Вы не можете сделать это так. Как сказал Сотириос, Spring нужно создать экземпляр, чтобы ввести его в ClassA. Вы, вероятно, можете сделать это вручную с помощью контекста приложения. Что-то вроде:

public class ClassA { 

    @Inject 
    private ApplicationContext appContext; 

    private ClassB classB; 

    //Bean will be instanciated when this method is called 
    public ClassB getClassB() { 
     if (classB == null) { 
      classB = appContext.getBean(ClassB.class); 
     } 
     return classB; 
    } 
} 

И затем используйте геттер для доступа к объекту.

+1

Такой ленивый init предназначен только для свойств, которые не являются «@Inject» или «@Autowired»? Это кажется немного ограничивающим, поскольку, насколько я знаю, эти аннотации всегда используются в новых версиях Spring. Если бит был установлен в xml-файле, ленивый будет работать? – Ana

+0

Я думаю, вы не понимаете, как работает Lazy init, bean scope и injection. Lazy init предназначен для использования с «@Inject» или «@Autowired», но на самом деле не имеет смысла вводить ленивый компонент в bean-компонент, который имеет одноэлементную область. Если вы поместите компонент в XML, он будет делать то же самое ... В конце, компонент Singleton с Lazy = true создается как компонент Prototype, разница в том, что при создании экземпляра bean-компонента он всегда возвращает тот же экземпляр. –

+0

Большое спасибо за ваш ответ. В самом деле, я не понимаю связи между ленивым значением init и bean. Такой ленивый в singleton не имеет смысла, потому что весна сделает экземпляр компонента при запуске; Прототипные компоненты не инициализируются при запуске, но разве это не по умолчанию? Где @Lazy делает разницу? Или ленивые зависимости прототипа bean не инициализируются, даже когда компонент прототипа инициализируется, но ленивые зависимости одноэлементного компонента всегда инициализируются? – Ana

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

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