diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/SmartInitializingSingleton.java b/spring-beans/src/main/java/org/springframework/beans/factory/SmartInitializingSingleton.java new file mode 100644 index 0000000000..787080c789 --- /dev/null +++ b/spring-beans/src/main/java/org/springframework/beans/factory/SmartInitializingSingleton.java @@ -0,0 +1,58 @@ +/* + * Copyright 2002-2014 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 + * + * http://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.beans.factory; + +/** + * Callback interface triggered at the end of the singleton pre-instantiation phase + * during {@link BeanFactory} bootstrap. This interface can be implemented by + * singleton beans in order to perform some initialization after the regular + * singleton instantiation algorithm, avoiding side effects with accidental early + * initialization (e.g. from {@link ListableBeanFactory#getBeansOfType} calls). + * In that sense, it is an alternative to {@link InitializingBean} which gets + * triggered right at the end of a bean's local construction phase. + * + *
This callback variant is somewhat similar to + * {@link org.springframework.context.event.ContextRefreshedEvent} but doesn't + * require an implementation of {@link org.springframework.context.ApplicationListener}, + * with no need to filter context references across a context hierarchy etc. + * It also implies a more minimal dependency on just the {@code beans} package + * and is being honored by standalone {@link ListableBeanFactory} implementations, + * not just in an {@link org.springframework.context.ApplicationContext} environment. + * + *
NOTE: If you intend to start/manage asynchronous tasks, preferably + * implement {@link org.springframework.context.Lifecycle} instead which offers + * a richer model for runtime management and allows for phased startup/shutdown. + * + * @author Juergen Hoeller + * @since 4.1 + * @see org.springframework.beans.factory.config.ConfigurableListableBeanFactory#preInstantiateSingletons() + */ +public interface SmartInitializingSingleton { + + /** + * Invoked right at the end of the singleton pre-instantiation phase, + * with a guarantee that all regular singleton beans have been created + * already. {@link ListableBeanFactory#getBeansOfType} calls within + * this method won't trigger accidental side effects during bootstrap. + *
NOTE: This callback won't be triggered for singleton beans
+ * lazily initialized on demand after {@link BeanFactory} bootstrap,
+ * and not for any other bean scope either. Carefully use it for beans
+ * with the intended bootstrap semantics only.
+ */
+ void afterSingletonsInstantiated();
+
+}
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
index eedad5dda1..a12d90fc4c 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
@@ -56,6 +56,7 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.SmartFactoryBean;
+import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
@@ -684,12 +685,15 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
if (this.logger.isDebugEnabled()) {
this.logger.debug("Pre-instantiating singletons in " + this);
}
+
List