mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-07-15 01:07:30 +08:00
Exclude infrastructure beans from lazy initialization
Closes gh-39831
This commit is contained in:
parent
e4462b0940
commit
9c68ce5900
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2024 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@ -37,11 +37,15 @@ import org.springframework.core.Ordered;
|
||||
* automatically excluded from lazy initialization to ensure that their
|
||||
* {@link SmartInitializingSingleton#afterSingletonsInstantiated() callback method} is
|
||||
* invoked.
|
||||
* <p>
|
||||
* Beans that are in the {@link BeanDefinition#ROLE_INFRASTRUCTURE infrastructure role}
|
||||
* are automatically excluded from lazy initialization, too.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
* @author Madhura Bhave
|
||||
* @author Tyler Van Gorder
|
||||
* @author Phillip Webb
|
||||
* @author Moritz Halbritter
|
||||
* @since 2.2.0
|
||||
* @see LazyInitializationExcludeFilter
|
||||
*/
|
||||
@ -63,6 +67,7 @@ public final class LazyInitializationBeanFactoryPostProcessor implements BeanFac
|
||||
ArrayList<LazyInitializationExcludeFilter> filters = new ArrayList<>(
|
||||
beanFactory.getBeansOfType(LazyInitializationExcludeFilter.class, false, false).values());
|
||||
filters.add(LazyInitializationExcludeFilter.forBeanTypes(SmartInitializingSingleton.class));
|
||||
filters.add(new InfrastructureRoleLazyInitializationExcludeFilter());
|
||||
return filters;
|
||||
}
|
||||
|
||||
@ -105,4 +110,18 @@ public final class LazyInitializationBeanFactoryPostProcessor implements BeanFac
|
||||
return Ordered.HIGHEST_PRECEDENCE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Excludes all {@link BeanDefinition bean definitions} which have the infrastructure
|
||||
* role from lazy initialization.
|
||||
*/
|
||||
private static final class InfrastructureRoleLazyInitializationExcludeFilter
|
||||
implements LazyInitializationExcludeFilter {
|
||||
|
||||
@Override
|
||||
public boolean isExcluded(String beanName, BeanDefinition beanDefinition, Class<?> beanType) {
|
||||
return beanDefinition.getRole() == BeanDefinition.ROLE_INFRASTRUCTURE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2021 the original author or authors.
|
||||
* Copyright 2012-2024 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@ -22,6 +22,7 @@ import java.util.List;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.factory.SmartInitializingSingleton;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
@ -30,6 +31,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
* Tests for {@link LazyInitializationBeanFactoryPostProcessor}.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
* @author Moritz Halbritter
|
||||
*/
|
||||
class LazyInitializationBeanFactoryPostProcessorTests {
|
||||
|
||||
@ -58,6 +60,19 @@ class LazyInitializationBeanFactoryPostProcessorTests {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenLazyInitializationIsEnabledThenInfrastructureRoleBeansAreInitializedDuringRefresh() {
|
||||
try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext()) {
|
||||
context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor());
|
||||
context.register(BeanState.class);
|
||||
context.registerBean(ExampleBean.class,
|
||||
(definition) -> definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE));
|
||||
context.refresh();
|
||||
BeanState beanState = context.getBean(BeanState.class);
|
||||
assertThat(beanState.initializedBeans).containsExactly(ExampleBean.class);
|
||||
}
|
||||
}
|
||||
|
||||
static class ExampleBean {
|
||||
|
||||
ExampleBean(BeanState beanState) {
|
||||
|
Loading…
Reference in New Issue
Block a user