https://howtodoinjava.com/spring5/core/spring-bean-eager-vs-lazy-init/
默认情况下,Spring“应用程序上下文”会在应用程序启动期间主动创建并初始化所有范围为的 Bean。 在大多数情况下,它有助于早期发现 Bean 配置问题。 但是有时,由于项目要求不同,您可能需要标记部分或全部 bean 进行延迟初始化。
Spring 提供了两种简单的方法来配置 bean 的延迟初始化,具体取决于您使用的是哪种配置,即基于 XML 的配置或基于 Java 的配置。
1. @Lazy
初始化的 bean – Java 配置
1.1. 延迟加载特定的 bean
要仅延迟加载特定的 bean,请在 Java 配置中使用@Lazy
注解和@Bean
注解。
AppConfig.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
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
注解一起注入的位置
@Lazy
@Service
public class EmployeeManagerImpl implements EmployeeManager {
//
}
@Controller
public class EmployeeController {
@Lazy
@Autowired
EmployeeManager employeeManager;
}
在两个地方都没有使用@Lazy
注解,它将无法正常工作。
2. XML 配置中的延迟初始化的 bean
2.1. 仅延迟加载特定的 bean
要为特定 bean 启用延迟加载,请在 bean 配置 xml 文件中的 bean 定义上使用lazy-init="true"
属性。
beans.xml
<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
<beans default-lazy-init="true">
<bean id="employeeManager" class="com.howtodoinjava.spring.service.impl.EmployeeManagerImpl" />
<beans>
3. Spring 延迟加载演示
让我们看一下 bean 的代码,我们正在尝试延迟加载。
@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
注解以检测何时创建 bean。
让我们使用 – 初始化应用程序上下文
3.1. 没有延迟加载
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
EmployeeManagerImpl Bean is Created !!
Bean Factory Initialized !!
Employee [id=1, name=Lokesh]
在这里,在 bean 工厂完全初始化之前,已创建并初始化了第一个 bean。
3.2. 延迟加载
Console
Bean Factory Initialized !!
EmployeeManagerImpl Bean is Created !!
Employee [id=1, name=Lokesh]
启用 bean 延迟加载后,bean 工厂首先进行完全初始化。 稍后,当我们请求EmployeeManager
bean 时,然后工厂创建实例并返回它。
请在注解部分中将与的延迟加载和紧急加载之间的差异相关的问题放在 Spring 中。
学习愉快!