# 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)