1. Введение
Поскольку наш проект продолжает повторятьсяBeanКоличество будет сильно увеличено, и если все инициализировать при запуске, это займет очень много времени.Spring BootРазрешает ленивую инициализацию приложений, т. е. инициализацию по запросу.Spring Bean, вместоSpring BootСоздать все при запускеBean. Это сокращает время, необходимое для запуска приложения. Ленивую инициализацию часто называют «ленивой загрузкой».
2. Ленивая инициализация
Spring BootЛенивую инициализацию можно разделить наГлобальная ленивая инициализацияилокальная инициализация.
Примечание. В Spring Boot 2.2.x существуют следующие функции.
2.1 Глобальная инициализация
Глобальной инициализации мы можем добиться программно, нам нужно изменитьSpring Boot Mainнаписание метода.
Обычно нашиMainМетод такой,Обратите внимание, что глобальная отложенная загрузка здесь не объявлена.:
/**
* @author felord.cn
* @since 2020/3/31 22:53
*/
@SpringBootApplication
public class DemoSpringbootApplication {
@Lazy
public static void main(String[] args) {
SpringApplication.run(DemoSpringbootApplication.class,args);
}
}
Способ записи глобальной ленивой загрузки 1:
/**
* @author felord.cn
* @since 2020/3/31 22:53
*/
@SpringBootApplication
public class DemoSpringbootApplication {
@Lazy
public static void main(String[] args) {
SpringApplication sa = new SpringApplication(DemoSpringbootApplication.class);
sa.setLazyInitialization(true);
sa.run(args);
}
}
Способ записи глобальной ленивой загрузки 2:
/**
* @author felord.cn
* @since 2020/3/31 22:53
*/
@SpringBootApplication
public class DemoSpringbootApplication {
@Lazy
public static void main(String[] args) {
SpringApplicationBuilder sab = new SpringApplicationBuilder(DemoSpringbootApplication.class);
sab.lazyInitialization(true).run(args);
}
}
Приведенный выше метод записи 1 и метод записи 2 настраиваются нами программно.Spring BootФункции, большинство из которых являются глобальными функциями. В том числе «ленивая загрузка», описанная в этой статье.
Мы также можем взять более простой файл конфигурации (application.properties) для настройки ленивой инициализации:
# 默认是关闭的 false
spring.main.lazy-initialization=true
Когда мы включаем глобальную ленивую загрузку, вWebприменение приведет ко многимWebСвязанныйBeanдо первогоHTTPИнициализируется только после запроса.
контроллер:
/**
* @author felord.cn
* @since 2020/3/31 23:31
*/
@RestController
@RequestMapping
public class FooController {
private FooService fooService;
public FooController(FooService fooService) {
System.out.println("fooController init...")
this.fooService = fooService;
}
@GetMapping("/req")
public Map<String, String> demo() {
System.out.println("Preparing HTTP request...");
return fooService.response();
}
}
сервисный уровень:
/**
* @author felord.cn
* @since 2020/3/31 23:36
*/
@Service
public class FooService {
public FooService() {
System.out.println("fooService init ...");
}
public Map<String, String> response() {
Map<String, String> map = new HashMap<>();
map.put("msg","from fooService");
return map;
}
}
перечислить/req
После интерфейса мы обнаружили, что не толькоFooController
иFooService
При первом вызове для инициализации дажеSpring MVCосновнойDispatcherServlet
Все инициализируется при первом вызове.
2.2 Локальная инициализация
Если мы не хотим, чтобы глобальная ленивая инициализация работала на отдельныхBeanчто делать? мы можем в этомBeanаннотация к заявлению выше@Lazy(value = false)
Вот и все. ты можешь переписать2.1код и попробуйте сами. это@Lazy
действовать локально и передавать логическое значениеvalue
для управления задержкой инициализации. Ситуация такова:
- Когда мы объявляем глобальную ленивую загрузку,
@Lazy(value = false)
отмеченBeanбудет загружен немедленно. - когда мы объявляем глобальныеНетПри ленивой загрузке
@Lazy
отмеченBeanбудет лениво загружаться.
Пожалуйста, обрати внимание:
@Lazy
повлияет@Configuration
объявлен нижеBean
3. Меры предосторожности
Недостатком ленивой инициализации является то, что при неправильной настройкеBeanленивая инициализация, сбой больше не будет происходить при запуске, а только после инициализацииBeanОшибки будут обнаружены только тогда, когда они будут обнаружены, поэтому они должны быть тщательно протестированы.
В то же время необходимо следить за тем, чтобыJVMдостаточно памяти для хранения всех приложенийBean, а не просто инициализируется при запускеBean. Поэтому рекомендуетсяJVMРазмер кучи проверяется и корректируется по мере необходимости, чтобы гарантировать, что она не переполнится.
Те, которые требуют много времени для инициализации, имеют сложную логику и не являются необходимым выбором для запуска.BeanДолжен быть лениво инициализирован.
4. Резюме
Да, сегодняSpring BootОбъясняется, как выполнить ленивую инициализацию, а также некоторые предостережения. косвенно такжеMainТакже показано несколько положений метода, которые надеются помочь вам в вашем фактическом развитии. Обратите внимание на общедоступный номер:FelordcnТехническая информация о сухих товарах будет получена автоматически.