5 changed files with 171 additions and 112 deletions
@ -1,53 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright 2012-2018 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. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
package org.springframework.boot; |
|
||||||
|
|
||||||
import java.util.function.Predicate; |
|
||||||
|
|
||||||
/** |
|
||||||
* This predicate can be implemented by downstream projects to customize the behavior of |
|
||||||
* the {@link LazyInitializationBeanFactoryPostProcessor}. |
|
||||||
* |
|
||||||
* <P> |
|
||||||
* There are edge cases (such as in DSLs that dynamically create additional beans) in |
|
||||||
* which it is not easy to explicitly exclude a class from the lazy-loading behavior. |
|
||||||
* Adding an instance of this predicate to the application context can be used for these |
|
||||||
* edge cases. |
|
||||||
* <P> |
|
||||||
* Returning "true" from this predicate will exclude a class from the lazy-loading |
|
||||||
* process. |
|
||||||
* |
|
||||||
* <P> |
|
||||||
* Example: |
|
||||||
* <P> |
|
||||||
* <pre> |
|
||||||
* {@code |
|
||||||
* |
|
||||||
* @Bean |
|
||||||
* public static EagerLoadingBeanDefinitionPredicate eagerLoadingBeanDefinitionPredicate() { |
|
||||||
* return IntegrationFlow.class::isAssignableFrom; |
|
||||||
* }}</pre> |
|
||||||
* |
|
||||||
* WARNING: Beans of this type will be instantiated very early in the spring application |
|
||||||
* life cycle. |
|
||||||
* |
|
||||||
* @author Tyler Van Gorder |
|
||||||
* @since 2.2.0 |
|
||||||
*/ |
|
||||||
public interface EagerLoadingBeanDefinitionPredicate extends Predicate<Class<?>> { |
|
||||||
|
|
||||||
} |
|
||||||
@ -0,0 +1,76 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2018 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. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.config.BeanDefinition; |
||||||
|
import org.springframework.beans.factory.support.AbstractBeanDefinition; |
||||||
|
|
||||||
|
/** |
||||||
|
* Filter that can be used to exclude beans definitions from having their |
||||||
|
* {@link AbstractBeanDefinition#setLazyInit(boolean) lazy-int} set by the |
||||||
|
* {@link LazyInitializationBeanFactoryPostProcessor}. |
||||||
|
* <P> |
||||||
|
* Primarily intended to allow downstream projects to deal with edge-cases in which it is |
||||||
|
* not easy to support lazy-loading (such as in DSLs that dynamically create additional |
||||||
|
* beans). Adding an instance of this filter to the application context can be used for |
||||||
|
* these edge cases. |
||||||
|
* <P> |
||||||
|
* A typical example would be something like this: |
||||||
|
* <P> |
||||||
|
* <pre><code> |
||||||
|
* @Bean |
||||||
|
* public static LazyInitializationExcludeFilter integrationLazyInitializationExcludeFilter() { |
||||||
|
* return LazyInitializationExcludeFilter.forBeanTypes(IntegrationFlow.class); |
||||||
|
* }</code></pre> |
||||||
|
* <p> |
||||||
|
* NOTE: Beans of this type will be instantiated very early in the spring application |
||||||
|
* lifecycle so should generally be declared static and not have any dependencies. |
||||||
|
* |
||||||
|
* @author Tyler Van Gorder |
||||||
|
* @author Philip Webb |
||||||
|
* @since 2.2.0 |
||||||
|
*/ |
||||||
|
@FunctionalInterface |
||||||
|
public interface LazyInitializationExcludeFilter { |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns {@code true} if the specified bean definition should be excluded from |
||||||
|
* having {@code lazy-int} automatically set. |
||||||
|
* @param beanName the bean name |
||||||
|
* @param beanDefinition the bean definition |
||||||
|
* @param beanType the bean type |
||||||
|
* @return {@code true} if {@code lazy-int} should not be automatically set |
||||||
|
*/ |
||||||
|
boolean isExcluded(String beanName, BeanDefinition beanDefinition, Class<?> beanType); |
||||||
|
|
||||||
|
/** |
||||||
|
* Factory method that creates a filter for the given bean types. |
||||||
|
* @param types the filtered types |
||||||
|
* @return a new filter instance |
||||||
|
*/ |
||||||
|
static LazyInitializationExcludeFilter forBeanTypes(Class<?>... types) { |
||||||
|
return (beanName, beanDefinition, beanType) -> { |
||||||
|
for (Class<?> type : types) { |
||||||
|
if (type.isAssignableFrom(beanType)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return false; |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,47 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2019 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. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot; |
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.config.BeanDefinition; |
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||||
|
import static org.mockito.Mockito.mock; |
||||||
|
|
||||||
|
/** |
||||||
|
* Tests for {@link LazyInitializationExcludeFilter}. |
||||||
|
* |
||||||
|
* @author Phillip Webb |
||||||
|
*/ |
||||||
|
class LazyInitializationExcludeFilterTests { |
||||||
|
|
||||||
|
@Test |
||||||
|
void forBeanTypesMatchesTypes() { |
||||||
|
LazyInitializationExcludeFilter filter = LazyInitializationExcludeFilter.forBeanTypes(CharSequence.class, |
||||||
|
Number.class); |
||||||
|
String beanName = "test"; |
||||||
|
BeanDefinition beanDefinition = mock(BeanDefinition.class); |
||||||
|
assertThat(filter.isExcluded(beanName, beanDefinition, CharSequence.class)).isTrue(); |
||||||
|
assertThat(filter.isExcluded(beanName, beanDefinition, String.class)).isTrue(); |
||||||
|
assertThat(filter.isExcluded(beanName, beanDefinition, StringBuilder.class)).isTrue(); |
||||||
|
assertThat(filter.isExcluded(beanName, beanDefinition, Number.class)).isTrue(); |
||||||
|
assertThat(filter.isExcluded(beanName, beanDefinition, Long.class)).isTrue(); |
||||||
|
assertThat(filter.isExcluded(beanName, beanDefinition, Boolean.class)).isFalse(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
Loading…
Reference in new issue