Статьи

Весна @ Ленивая аннотация

Вступление:

По умолчанию среда Spring загружает и охотно инициализирует все компоненты при запуске самого приложения. В нашем приложении у нас могут быть довольно ресурсоемкие компоненты. Мы предпочтем загружать такие бобы по мере необходимости. Мы можем добиться этого, используя аннотацию Spring @Lazy .

В этом уроке мы узнаем, как использовать аннотацию @Lazy для ленивой загрузки наших bean-компонентов.

Ленивая инициализация:

Если мы пометим наш класс конфигурации Spring аннотацией @Lazy , то все определенные bean-компоненты с аннотацией @Bean будут загружены лениво:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
@Configuration
@ComponentScan(basePackages = "com.programmergirl.university")
@Lazy
public class AppConfig {
  
    @Bean
    public Student student() {
        return new Student();
    }
  
    @Bean
    public Teacher teacher() {
        return new Teacher();
    }
}

Мы также можем лениво загрузить только один компонент, используя эту аннотацию на уровне метода:

1
2
3
4
5
@Bean
@Lazy
public Teacher teacher() {
    return new Teacher();
}

Тестирование Lazy Загрузка:

Давайте быстро протестируем эту функциональность, запустив наше приложение:

01
02
03
04
05
06
07
08
09
10
11
12
13
public class SampleApp {
    private static final Logger LOG = Logger.getLogger(SampleApp.class);
    public static void main(String args[]) {
        AnnotationConfigApplicationContext context =
          new AnnotationConfigApplicationContext(AppConfig.class);
         
        LOG.info("Application Context is already up");
  
        // Beans in our Config class lazily loaded
        Teacher teacherLazilyLoaded = context.getBean(Teacher.class);
        Student studentLazilyLoaded = context.getBean(Student.class);
    }
}

На нашей консоли мы увидим:

1
2
3
4
5
6
Bean factory for ...AnnotationConfigApplicationContext:
...DefaultListableBeanFactory: [...]
...
Application Context is already up
Inside Teacher Constructor
Inside Student Constructor

Очевидно, что Spring инициализировал bean-компоненты Student и Teacher по требованию, а не при настройке контекста приложения.

С аннотацией @Autowired :

Мы также можем использовать аннотацию @Lazy в точке внедрения: конструкторе, установщике или на уровне поля.

Допустим, у нас есть класс Classroom, который мы хотим лениво загрузить:

1
2
3
4
5
6
7
8
@Component
@Lazy
public class Classroom {
    public Classroom() {
        System.out.println("Inside Classroom Constructor");
    }
    ...
}

И он связан с компонентом University с помощью аннотации @Autowired :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
@Component
public class University {
  
    @Lazy
    @Autowired
    private Classroom classroom;
  
    public University() {
        System.out.println("Inside University Constructor");
    }
  
    public void useClassroomBean() {
        this.classroom.getDetails();
        ...
    }
}

Здесь мы лениво вводили бин класса . И поэтому, создавая экземпляр объекта University , Spring создаст и отобразит для него прокси-объект Classroom . Наконец, когда мы вызываем useClassroomBean () , только тогда он создаст фактический экземпляр Classroom :

1
2
3
4
5
6
7
8
9
// in our main() method
AnnotationConfigApplicationContext context
  = new AnnotationConfigApplicationContext();
  
LOG.info("Application Context is already up");
  
University university = context.getBean(University.class);
LOG.info("Time to use the actual classroom bean...");
university.useClassroomBean();

Приведенный выше код создаст следующие журналы:

1
2
3
4
5
6
7
Bean factory for ...AnnotationConfigApplicationContext:
 ...DefaultListableBeanFactory: [...] ...
Inside University Constructor
...
Application Context is already up
Time to use the actual classroom bean...
Inside Classroom Constructor

Как мы видим, создание экземпляра объекта Classroom откладывается до тех пор, пока он действительно не понадобится.

Обратите внимание, что для отложенной инъекции мы должны использовать аннотацию @Lazy как для класса компонента, так и для точки внедрения.

Вывод:

В этом быстром уроке мы узнали, как лениво загружать бины Spring. Мы говорили о ленивой инициализации и ленивой инъекции.

Опубликовано на Java Code Geeks с разрешения Шубхры Шриваставы, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Spring @Lazy Аннотация

Мнения, высказанные участниками Java Code Geeks, являются их собственными.