Spring аннотация @Lazy Как известно Spring создает бины сразу при поднятии контекста и со скоупом Singletone. Но бывают случаи, когда мы не хотим создавать его сразу. И Spring дает нам такую возможность с аннотацией @org.springframework.context.annotation.Lazy. Эта аннотация используется в Spring Framework для отложенной инициализации бина. Это означает, что бин будет создан только при первом обращении к нему. Мы можем использовать @Lazy над классом конфигурации: @Lazy @Configuration public class MyConfiguration { @Bean public MyBean myBean() { return new MyBean(); } ... } Это значит что все бины создаваемые в этом классе будут инициализироваться при первом обращении к ним. Либо мы можем повесить @Lazy на метод с @Bean, чтобы указать только один бин для ленивой загрузки. Рассмотрим пример с @Autowired: @Lazy @ToString @Component public class Apple { public Apple() { System.out.println( "Apple bean initialized"); } } У нас есть класс с аннотацией @Lazy, который так же помечен как @Component. И есть класс куда мы инжектим этот бин: @Component public class Bag { public Apple apple; @Autowired public Bag(@Lazy Apple apple) { this.apple = apple; System.out.println( "Bag bean initialized"); } } Обратите внимание, что @Lazy так же и над аргументом конструктора (если инжектим через него), это обязательно! Мы можем поднять контекст и посмотреть, что происходит: @SpringBootApplication public class Application { public static void main(String[] args) { var context = SpringApplication .run(Application.class, args); System.out.println("Context is up"); Bag bag = context.getBean(Bag.class); System.out.println("Bag is gotten"); System.out.println(bag.apple); } } Вывод будет следующим: Bag bean initialized Context is up Bag is gotten Apple bean initialized Apple() Как мы видим - сначала создастся бин класса Bag и поднимется контекст, и только после обращения к бину Apple через Bag, бин Apple проинициализируется. Использование аннотации @Lazy особенно полезно в больших приложениях, где не все бины нужны сразу и можно сэкономить ресурсы, инициализируя их только по мере необходимости.
16
2
1
1
1