Spring 之 @Lazy加载

默认情况下,Spring“应用程序上下文”会在应用程序启动过程中积极创建并初始化所有“ 单例作用域 ” bean。在大多数情况下,它有助于早期发现Bean配置问题。但是有时,由于项目要求不同,您可能需要标记部分或全部bean进行延迟初始化。

Spring提供了两种简单的方法来配置bean的延迟初始化,这取决于您采用的是哪种配置,即基于XML的配置基于Java的配置

目录

1。 Java配置中的延迟初始化的Bean 
2。 XML配置中的延迟初始化的Bean

1。 @Lazy初始化的bean – Java配置

1.1。@延迟加载特定的bean

要仅延迟加载特定的bean,请在Java配置中使用@Lazy注解和@Bean注解。

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注解。

import org.springframework.context.annotation.Lazy;

@Lazy
@Configuration
public class AppConfig {
	
    @Bean
    public EmployeeManager employeeManager() {
        return new EmployeeManagerImpl();
    }
	
}

1.3。@AutowiredLazy 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>

<bean id="employeeManager" class="com.how2codex.spring.service.impl.EmployeeManagerImpl" 
	lazy-init="true"/>

<beans>

2.2。延迟全局加载所有bean

要为所有bean启用延迟加载,请在bean配置xml文件中的标记上使用default-lazy-init =“ true”属性beans

<beans default-lazy-init="true">

<bean id="employeeManager" class="com.how2codex.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.how2codex.spring.model.Employee;
import com.how2codex.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);
    }
}

程序输出。

EmployeeManagerImpl Bean is Created !!
Bean Factory Initialized !!
Employee [id=1, name=Lokesh]

在这里,在bean工厂完全初始化之前,已创建并初始化了第一个bean。

3.2。延迟加载

Bean Factory Initialized !!
EmployeeManagerImpl Bean is Created !!
Employee [id=1, name=Lokesh]

启用bean延迟加载后,bean工厂首先进行完全初始化。稍后,当我们请求EmployeeManagerbean时,factory然后创建了实例并返回了它。

请在注解部分中将与Spring的延迟加载和渴望加载之间的差异有关的问题放在我的问题上。

saigon has written 1445 articles

Leave a Reply