5 changed files with 171 additions and 112 deletions
@ -1,53 +0,0 @@
@@ -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 @@
@@ -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 @@
@@ -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