DATACMNS-327 - AbstractMappingContext implements InitializingBean again.

This causes the configured persistent entities being added to the context on its initialization instead of a delayed initialization on ApplicationContext refreshed event.
This commit is contained in:
Oliver Gierke
2013-05-12 23:42:37 +02:00
parent 705db1420e
commit 1996ed9630
2 changed files with 21 additions and 30 deletions

View File

@@ -35,12 +35,11 @@ import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.data.mapping.PersistentEntity;
import org.springframework.data.mapping.PersistentProperty;
import org.springframework.data.mapping.PropertyPath;
@@ -67,12 +66,10 @@ import org.springframework.util.ReflectionUtils.FieldFilter;
* @author Oliver Gierke
*/
public abstract class AbstractMappingContext<E extends MutablePersistentEntity<?, P>, P extends PersistentProperty<P>>
implements MappingContext<E, P>, ApplicationContextAware, ApplicationEventPublisherAware,
ApplicationListener<ContextRefreshedEvent> {
implements MappingContext<E, P>, ApplicationEventPublisherAware, InitializingBean, ApplicationContextAware {
private final ConcurrentMap<TypeInformation<?>, E> persistentEntities = new ConcurrentHashMap<TypeInformation<?>, E>();
private ApplicationContext applicationContext;
private ApplicationEventPublisher applicationEventPublisher;
private Set<? extends Class<?>> initialEntitySet = new HashSet<Class<?>>();
@@ -83,20 +80,6 @@ public abstract class AbstractMappingContext<E extends MutablePersistentEntity<?
private final Lock read = lock.readLock();
private final Lock write = lock.writeLock();
/*
* (non-Javadoc)
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
*/
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
// Default publisher
if (this.applicationEventPublisher == null) {
this.applicationEventPublisher = applicationContext;
}
}
/*
* (non-Javadoc)
* @see org.springframework.context.ApplicationEventPublisherAware#setApplicationEventPublisher(org.springframework.context.ApplicationEventPublisher)
@@ -324,16 +307,25 @@ public abstract class AbstractMappingContext<E extends MutablePersistentEntity<?
protected abstract P createPersistentProperty(Field field, PropertyDescriptor descriptor, E owner,
SimpleTypeHolder simpleTypeHolder);
/*
* (non-Javadoc)
* @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent)
/**
* Should not be used anymore. If {@link ApplicationContextAware} is still needed by child classes implement the
* interface directly. Such implementations should remove the call to the parent method as it will be removed in
* future versions.
*
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
*/
public void onApplicationEvent(ContextRefreshedEvent event) {
@Deprecated
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (!event.getApplicationContext().equals(applicationContext)) {
return;
}
}
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
@Override
public void afterPropertiesSet() {
initialize();
}

View File

@@ -27,7 +27,6 @@ import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.data.mapping.PersistentEntity;
import org.springframework.data.mapping.PropertyPath;
import org.springframework.data.mapping.model.BasicPersistentEntity;
@@ -90,17 +89,17 @@ public class AbstractMappingContextUnitTests {
}
@Test
public void registersEntitiesOnContextRefreshedEvent() {
public void registersEntitiesOnInitialization() {
ApplicationContext context = mock(ApplicationContext.class);
SampleMappingContext mappingContext = new SampleMappingContext();
mappingContext.setInitialEntitySet(Collections.singleton(Person.class));
mappingContext.setApplicationContext(context);
mappingContext.setApplicationEventPublisher(context);
verify(context, times(0)).publishEvent(Mockito.any(ApplicationEvent.class));
mappingContext.onApplicationEvent(new ContextRefreshedEvent(context));
mappingContext.afterPropertiesSet();
verify(context, times(1)).publishEvent(Mockito.any(ApplicationEvent.class));
}