多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Spring – `@Lazy`加载 > [https://howtodoinjava.com/spring5/core/spring-bean-eager-vs-lazy-init/](https://howtodoinjava.com/spring5/core/spring-bean-eager-vs-lazy-init/) 默认情况下,Spring“应用程序上下文”会在应用程序启动期间主动创建并初始化所有范围为的 Bean。 在大多数情况下,它有助于早期发现 Bean 配置问题。 但是有时,由于项目要求不同,您可能需要标记部分或全部 bean 进行延迟初始化。 Spring 提供了两种简单的方法来配置 bean 的延迟初始化,具体取决于您使用的是哪种配置,即[基于 XML 的配置](https://howtodoinjava.com/spring5/core/spring-bean-xml-config/)或[基于 Java 的配置](https://howtodoinjava.com/spring5/core/spring-bean-java-config/)。 ## 1\. `@Lazy`初始化的 bean – Java 配置 #### 1.1. 延迟加载特定的 bean 要仅延迟加载特定的 bean,请在 Java 配置中使用[`@Lazy`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Lazy.html)注解和`@Bean`注解。 `AppConfig.java` ```java import org.springframework.context.annotation.Lazy; @Configuration public class AppConfig { @Lazy @Bean public EmployeeManager employeeManager() { return new EmployeeManagerImpl(); } } ``` #### 1.2. 延迟加载所有 bean 要延迟加载所有 bean,请在 Java 配置中使用`@Lazy`注解以及`@Bean`注解。 `AppConfig.java` ```java import org.springframework.context.annotation.Lazy; @Lazy @Configuration public class AppConfig { @Bean public EmployeeManager employeeManager() { return new EmployeeManagerImpl(); } } ``` #### 1.3. `@Autowired`延迟 Bean 通常,使用`@Autowired`注解将 bean 注入其他组件。 在这种情况下,我们必须在两个地方都使用惰性标注: * 您要延迟加载的 bean 定义 * 它与`@Autowired`注解一起注入的位置 ```java @Lazy @Service public class EmployeeManagerImpl implements EmployeeManager { // } ``` ```java @Controller public class EmployeeController { @Lazy @Autowired EmployeeManager employeeManager; } ``` **在两个地方都没有使用`@Lazy`注解,它将无法正常工作。** ## 2\. XML 配置中的延迟初始化的 bean #### 2.1. 仅延迟加载特定的 bean 要为特定 bean 启用延迟加载,请在 bean 配置 xml 文件中的 bean 定义上使用`lazy-init="true"`属性。 `beans.xml` ```java <beans> <bean id="employeeManager" class="com.howtodoinjava.spring.service.impl.EmployeeManagerImpl" lazy-init="true"/> <beans> ``` #### 2.2. 延迟全局加载所有 bean 要为所有 bean 启用延迟加载,请在 bean 配置 xml 文件的`beans`标签上使用`default-lazy-init="true"`属性。 `beans.xml` ```java <beans default-lazy-init="true"> <bean id="employeeManager" class="com.howtodoinjava.spring.service.impl.EmployeeManagerImpl" /> <beans> ``` ## 3\. Spring 延迟加载演示 让我们看一下 bean 的代码,我们正在尝试延迟加载。 ```java @Lazy @Service public class EmployeeManagerImpl implements EmployeeManager { @Override public Employee create() { Employee emp = new Employee(); emp.setId(1); emp.setName("Lokesh"); return emp; } @PostConstruct public void onInit(){ System.out.println("EmployeeManagerImpl Bean is Created !!"); } } ``` 我已放置[`@PostConstruct`](https://howtodoinjava.com/spring/spring-core/spring-bean-life-cycle/)注解以检测何时创建 bean。 让我们使用 – 初始化应用程序上下文 #### 3.1. 没有延迟加载 ```java import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.howtodoinjava.spring.model.Employee; import com.howtodoinjava.spring.service.EmployeeManager; public class Main { public static void main( String[] args ) { ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); System.out.println("Bean Factory Initialized !!"); EmployeeManager empManager = ctx.getBean(EmployeeManager.class); Employee emp = empManager.create(); System.out.println(emp); } } ``` 程序输出。 `Console` ```java EmployeeManagerImpl Bean is Created !! Bean Factory Initialized !! Employee [id=1, name=Lokesh] ``` 在这里,在 bean 工厂完全初始化之前,已创建并初始化了第一个 bean。 #### 3.2. 延迟加载 `Console` ```java Bean Factory Initialized !! EmployeeManagerImpl Bean is Created !! Employee [id=1, name=Lokesh] ``` 启用 bean 延迟加载后,bean 工厂首先进行完全初始化。 稍后,当我们请求`EmployeeManager` bean 时,然后工厂创建实例并返回它。 请在注解部分中将与**的延迟加载和紧急加载之间的差异相关的问题放在 Spring** 中。 学习愉快! [下载源码](https://github.com/lokeshgupta1981/spring-core/tree/master/src/main/java/com/howtodoinjava/core/demo/beans)