You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2019/10/31 18:57:06 UTC

[isis] branch v2 updated: ISIS-2158: remove static references to IsisBeanTypeRegistry

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/v2 by this push:
     new 68eb511  ISIS-2158: remove static references to IsisBeanTypeRegistry
68eb511 is described below

commit 68eb5114e6613f6ccece727f18e00c272440fd6f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Oct 31 19:56:54 2019 +0100

    ISIS-2158: remove static references to IsisBeanTypeRegistry
---
 .../beantyperegistry/BeanTypeRegistryPlugin.java   | 43 ----------------------
 .../IsisBeanFactoryPostProcessorForSpring.java     | 14 +++----
 .../config/beans/IsisBeanTypeRegistryHolder.java   |  9 +++++
 .../isis/config/registry/IsisBeanTypeRegistry.java |  8 +---
 .../IsisBeanTypeRegistry_UnitTestSupport.java      | 38 -------------------
 .../services/registry/ServiceRegistryDefault.java  |  5 ++-
 .../specloader/SpecificationLoaderDefault.java     | 13 +++++--
 .../specimpl/ObjectSpecificationAbstract.java      | 11 +++++-
 .../metamodel/MetaModelContext_forTesting.java     | 24 +++++++++++-
 .../isis/metamodel/ServiceRegistry_forTesting.java |  7 +---
 ...InjectorDefaultTest_validateServices_happy.java |  6 ++-
 .../SpecificationLoaderTestAbstract.java           |  1 -
 .../service/JdoPersistenceLifecycleService.java    |  6 ++-
 .../isis/jdo/entities/JdoEntityTypeRegistry.java   | 18 +++++----
 .../persistence/PersistenceSessionFactory5.java    | 10 ++++-
 .../homepage/HomePageResolverServiceDefault.java   | 11 +++---
 .../AbstractApplyToAllContractTest.java            | 10 ++---
 .../bootstrapping/AutoConfigurationTest.java       |  4 +-
 18 files changed, 102 insertions(+), 136 deletions(-)

diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/plugins/beantyperegistry/BeanTypeRegistryPlugin.java b/core/commons/src/main/java/org/apache/isis/commons/internal/plugins/beantyperegistry/BeanTypeRegistryPlugin.java
deleted file mode 100644
index eae5601..0000000
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/plugins/beantyperegistry/BeanTypeRegistryPlugin.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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.apache.isis.commons.internal.plugins.beantyperegistry;
-
-import java.util.Set;
-
-import org.apache.isis.commons.internal.context._Plugin;
-
-public interface BeanTypeRegistryPlugin {
-
-    // -- INTERFACE
-
-    Set<Class<?>> getEntityTypes();
-
-    // -- LOOKUP
-
-    public static BeanTypeRegistryPlugin get() {
-        return _Plugin.getOrElse(BeanTypeRegistryPlugin.class,
-                ambiguousPlugins->{
-                    return _Plugin.pickAnyAndWarn(BeanTypeRegistryPlugin.class, ambiguousPlugins);
-                },
-                ()->{
-                    throw _Plugin.absenceNonRecoverable(BeanTypeRegistryPlugin.class);
-                });
-    }
-
-}
diff --git a/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanFactoryPostProcessorForSpring.java b/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanFactoryPostProcessorForSpring.java
index 47761cd..f05e7dd 100644
--- a/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanFactoryPostProcessorForSpring.java
+++ b/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanFactoryPostProcessorForSpring.java
@@ -46,16 +46,17 @@ import lombok.extern.log4j.Log4j2;
  *
  */
 @Log4j2 @Component
-public class IsisBeanFactoryPostProcessorForSpring implements BeanFactoryPostProcessor {
+public class IsisBeanFactoryPostProcessorForSpring 
+implements BeanFactoryPostProcessor, IsisBeanTypeRegistryHolder {
 
-    @Getter(lazy=true) 
-    private final IsisComponentScanInterceptor interceptor = IsisBeanTypeRegistry.current();
+    @Getter(onMethod = @__(@Override))
+    private final IsisBeanTypeRegistry isisBeanTypeRegistry = new IsisBeanTypeRegistry();
     
     @Override
     public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
         
         val registry = (BeanDefinitionRegistry) beanFactory;
-        val interceptor = getInterceptor();
+        val interceptor = isisBeanTypeRegistry;
         
         for (String beanDefinitionName : registry.getBeanDefinitionNames()) {
             
@@ -93,10 +94,5 @@ public class IsisBeanFactoryPostProcessorForSpring implements BeanFactoryPostPro
         }
         
     }
-    
-
-
-
-
 
 }
diff --git a/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanTypeRegistryHolder.java b/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanTypeRegistryHolder.java
new file mode 100644
index 0000000..2a644f8
--- /dev/null
+++ b/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanTypeRegistryHolder.java
@@ -0,0 +1,9 @@
+package org.apache.isis.config.beans;
+
+import org.apache.isis.config.registry.IsisBeanTypeRegistry;
+
+public interface IsisBeanTypeRegistryHolder {
+
+    IsisBeanTypeRegistry getIsisBeanTypeRegistry();
+    
+}
diff --git a/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java b/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
index 6ec1bdf..954b00e 100644
--- a/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
+++ b/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
@@ -41,7 +41,6 @@ import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.components.ApplicationScopedComponent;
 import org.apache.isis.commons.internal.components.SessionScopedComponent;
 import org.apache.isis.commons.internal.components.TransactionScopedComponent;
-import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.ioc.BeanSort;
 import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.config.beans.IsisComponentScanInterceptor;
@@ -49,7 +48,6 @@ import org.apache.isis.config.beans.IsisComponentScanInterceptor;
 import static org.apache.isis.commons.internal.base._With.requires;
 import static org.apache.isis.commons.internal.reflection._Annotations.findNearestAnnotation;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.val;
@@ -59,13 +57,9 @@ import lombok.extern.log4j.Log4j2;
  * Holds the set of domain services, persistent entities and fixture scripts.services etc.
  * @since 2.0
  */
-@NoArgsConstructor(access = AccessLevel.PRIVATE) @Log4j2
+@NoArgsConstructor @Log4j2
 public final class IsisBeanTypeRegistry implements IsisComponentScanInterceptor, AutoCloseable {
 
-    public static IsisBeanTypeRegistry current() {
-        return _Context.computeIfAbsent(IsisBeanTypeRegistry.class, IsisBeanTypeRegistry::new);
-    }
-
     /**
      * Inbox for introspection, as used by the SpecificationLoader
      */
diff --git a/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry_UnitTestSupport.java b/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry_UnitTestSupport.java
deleted file mode 100644
index b5b05ee..0000000
--- a/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry_UnitTestSupport.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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.apache.isis.config.registry;
-
-import java.util.Set;
-
-import org.apache.isis.commons.internal.plugins.beantyperegistry.BeanTypeRegistryPlugin;
-
-/**
- * Required workaround, to provide module 'unittestsupport' access into {@link IsisBeanTypeRegistry}
- * without creating a module dependency cycle.  
- * 
- * @since 2.0
- */
-public class IsisBeanTypeRegistry_UnitTestSupport implements BeanTypeRegistryPlugin {
-
-    @Override
-    public Set<Class<?>> getEntityTypes() {
-        return IsisBeanTypeRegistry.current().getEntityTypes();    
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
index 524749e..ab91be2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
@@ -36,7 +36,7 @@ import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 import org.apache.isis.commons.internal.ioc.spring._Spring;
-import org.apache.isis.config.registry.IsisBeanTypeRegistry;
+import org.apache.isis.config.beans.IsisBeanTypeRegistryHolder;
 
 import lombok.val;
 
@@ -48,6 +48,7 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
     
     // enforces provisioning order (this is a depends-on relationship) 
     @Inject private IsisSystemEnvironment isisSystemEnvironment; 
+    @Inject private IsisBeanTypeRegistryHolder isisBeanTypeRegistryHolder;
     
     @Override
     public Optional<ManagedBeanAdapter> lookupRegisteredBeanById(String id) {
@@ -72,7 +73,7 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
 
     private Map<String, ManagedBeanAdapter> enumerateManagedBeans() {
         
-        val filter = IsisBeanTypeRegistry.current();
+        val filter = isisBeanTypeRegistryHolder.getIsisBeanTypeRegistry();
         val managedBeanAdapterByName = _Maps.<String, ManagedBeanAdapter>newHashMap();
 
         isisSystemEnvironment.getIocContainer().streamAllBeans()
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
index d7b672d..8d9606a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
@@ -36,6 +36,7 @@ import org.apache.isis.commons.internal.base._Timing;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.config.beans.IsisBeanTypeRegistryHolder;
 import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facetapi.Facet;
@@ -85,6 +86,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
     @Inject private IsisConfiguration isisConfiguration;
     @Inject private IsisSystemEnvironment isisSystemEnvironment;
     @Inject private ServiceRegistry serviceRegistry;
+    @Inject private IsisBeanTypeRegistryHolder isisBeanTypeRegistryHolder;
     
     private final ClassSubstitutor classSubstitutor = new ClassSubstitutor();
 
@@ -102,7 +104,8 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
             IsisSystemEnvironment isisSystemEnvironment,
             ServiceRegistry serviceRegistry,
             ServiceInjector serviceInjector,
-            ProgrammingModel programmingModel) {
+            ProgrammingModel programmingModel,
+            IsisBeanTypeRegistryHolder isisBeanTypeRegistryHolder) {
 
         val instance = new SpecificationLoaderDefault(); 
 
@@ -116,6 +119,8 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         instance.facetProcessor = new FacetProcessor(programmingModel, instance.metaModelContext);
         instance.postProcessor = new PostProcessor(programmingModel);
         
+        instance.isisBeanTypeRegistryHolder = isisBeanTypeRegistryHolder;
+        
         
         return instance;
     }
@@ -146,7 +151,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         facetProcessor.init();
         postProcessor.init();
 
-        val typeRegistry = IsisBeanTypeRegistry.current();
+        val typeRegistry = isisBeanTypeRegistryHolder.getIsisBeanTypeRegistry();
 
         val scannedSpecs = _Lists.<ObjectSpecification>newArrayList();
         val domainServiceSpecs = _Lists.<ObjectSpecification>newArrayList();
@@ -349,8 +354,10 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
             objectSpec.setMetaModelContext(metaModelContext);
 
         } else {
+            
+            val typeRegistry = isisBeanTypeRegistryHolder.getIsisBeanTypeRegistry();
 
-            val managedBeanNameIfAny = IsisBeanTypeRegistry.current().getManagedBeanNameForType(cls);
+            val managedBeanNameIfAny = typeRegistry.getManagedBeanNameForType(cls);
 
             objectSpec = new ObjectSpecificationDefault(
                     cls,
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index c86f86a..63cd8c9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -42,6 +42,7 @@ import org.apache.isis.commons.internal.collections._Streams;
 import org.apache.isis.commons.internal.ioc.BeanSort;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 import org.apache.isis.commons.internal.reflection._Reflect;
+import org.apache.isis.config.beans.IsisBeanTypeRegistryHolder;
 import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.metamodel.commons.ClassExtensions;
 import org.apache.isis.metamodel.commons.ToString;
@@ -805,7 +806,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             return Collections.emptyList();
         }
 
-        val mixinTypes = IsisBeanTypeRegistry.current().getMixinTypes();
+        val mixinTypes = getIsisBeanTypeRegistry().getMixinTypes();
         if(_NullSafe.isEmpty(mixinTypes)) {
             return Collections.emptyList();
         }
@@ -912,7 +913,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             return Collections.emptyList();
         }
 
-        val mixinTypes = IsisBeanTypeRegistry.current().getMixinTypes();
+        val mixinTypes = getIsisBeanTypeRegistry().getMixinTypes();
         if(_NullSafe.isEmpty(mixinTypes)) {
             return Collections.emptyList();
         }
@@ -1072,6 +1073,12 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     protected SpecificationLoader getSpecificationLoader() {
         return getMetaModelContext().getSpecificationLoader();
     }
+    
+    protected IsisBeanTypeRegistry getIsisBeanTypeRegistry() {
+        return getMetaModelContext().getServiceRegistry()
+                .lookupServiceElseFail(IsisBeanTypeRegistryHolder.class)
+                .getIsisBeanTypeRegistry();
+    }
 
     protected BeanSort sortOf(ObjectSpecification spec) {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
index d5307c6..6e28bbc 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
@@ -35,6 +35,8 @@ import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.config.beans.IsisBeanTypeRegistryHolder;
+import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.metamodel.progmodel.ProgrammingModel;
@@ -105,6 +107,8 @@ public final class MetaModelContext_forTesting implements MetaModelContext {
     private TransactionService transactionService;
 
     private TransactionState transactionState;
+    
+    private IsisBeanTypeRegistryHolder isisBeanTypeRegistryHolder;
 
     private Map<String, ObjectAdapter> serviceAdaptersById;
 
@@ -151,6 +155,7 @@ public final class MetaModelContext_forTesting implements MetaModelContext {
                 getConfigurationLegacy(),
                 getConfiguration(),
                 getObjectManager(),
+                getIsisBeanTypeRegistryHolder(),
                 systemEnvironment,
                 serviceInjector,
                 serviceRegistry,
@@ -206,6 +211,21 @@ public final class MetaModelContext_forTesting implements MetaModelContext {
         return serviceInjector;
     }
     
+    public IsisBeanTypeRegistryHolder getIsisBeanTypeRegistryHolder() {
+        if(isisBeanTypeRegistryHolder==null) {
+            
+            val typeRegistry = new IsisBeanTypeRegistry();
+            
+            isisBeanTypeRegistryHolder = new IsisBeanTypeRegistryHolder() {
+                @Override
+                public IsisBeanTypeRegistry getIsisBeanTypeRegistry() {
+                    return typeRegistry;
+                }
+            };
+        }
+        return isisBeanTypeRegistryHolder;
+    }
+    
     @Override
     public SpecificationLoader getSpecificationLoader() {
         if(specificationLoader==null) {
@@ -215,13 +235,15 @@ public final class MetaModelContext_forTesting implements MetaModelContext {
             val serviceRegistry = requireNonNull(getServiceRegistry());
             val serviceInjector = requireNonNull(getServiceInjector());
             val programmingModel = requireNonNull(getProgrammingModel());
+            val isisBeanTypeRegistryHolder = requireNonNull(getIsisBeanTypeRegistryHolder());
 
             specificationLoader = SpecificationLoaderDefault.getInstance(
                     configuration, 
                     environment, 
                     serviceRegistry, 
                     serviceInjector, 
-                    programmingModel);
+                    programmingModel,
+                    isisBeanTypeRegistryHolder);
             
         }
         return specificationLoader;
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java
index 70ed9b1..b53a62b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java
@@ -33,7 +33,6 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.ioc.IocContainer;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 import org.apache.isis.commons.internal.ioc.spring._Spring;
-import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 
 import lombok.Builder;
 import lombok.Getter;
@@ -100,10 +99,8 @@ class ServiceRegistry_forTesting implements ServiceRegistry {
         synchronized(registeredBeans) {
             if(registeredBeans.isEmpty()) {
 
-                val beanSortClassifier = IsisBeanTypeRegistry.current();
-
                 streamSingletons()
-                .map(s->toBeanAdapter(s, beanSortClassifier))
+                .map(s->toBeanAdapter(s))
                 .filter(_NullSafe::isPresent)
                 .forEach(registeredBeans::add);
             }    
@@ -135,7 +132,7 @@ class ServiceRegistry_forTesting implements ServiceRegistry {
 
     }
 
-    private ManagedBeanAdapter toBeanAdapter(Object singleton, IsisBeanTypeRegistry beanSortClassifier) {
+    private ManagedBeanAdapter toBeanAdapter(Object singleton) {
 
         return PojoBeanAdapter.builder()
                 .id(singleton.getClass().getName())
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices_happy.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices_happy.java
index 4f497d5..b39d0d5 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices_happy.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices_happy.java
@@ -33,6 +33,7 @@ import org.springframework.test.context.ActiveProfiles;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.config.IsisConfigModule;
+import org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring;
 import org.apache.isis.metamodel.services.registry.ServiceRegistryDefault;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -44,7 +45,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
         ServiceRegistryDefault.class,
         ServiceInjectorLegacyTest.Producers.class,
         ServiceInjectorDefaultTest_validateServices_happy.DomainServiceWithSomeId.class,
-        ServiceInjectorDefaultTest_validateServices_happy.DomainServiceWithDifferentId.class
+        ServiceInjectorDefaultTest_validateServices_happy.DomainServiceWithDifferentId.class,
+        
+        IsisBeanFactoryPostProcessorForSpring.class
+        
 },
 properties = {
         "isis.services.injector.setPrefix=true"
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java
index dff48ee..d07b81c 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java
@@ -110,7 +110,6 @@ abstract class SpecificationLoaderTestAbstract {
     protected MessageService mockMessageService;
     protected MetaModelContext metaModelContext;
 
-
     // is loaded by subclasses
     protected ObjectSpecification specification;
 
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/service/JdoPersistenceLifecycleService.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/service/JdoPersistenceLifecycleService.java
index a868a60..3824df6 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/service/JdoPersistenceLifecycleService.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/service/JdoPersistenceLifecycleService.java
@@ -26,7 +26,7 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.config.registry.IsisBeanTypeRegistry;
+import org.apache.isis.config.beans.IsisBeanTypeRegistryHolder;
 import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.runtime.system.context.session.AppLifecycleEvent;
 import org.apache.isis.runtime.system.context.session.SessionLifecycleEvent;
@@ -42,11 +42,13 @@ public class JdoPersistenceLifecycleService {
 
     @Inject private MetaModelContext metaModelContext;
     @Inject private PersistenceSessionFactory persistenceSessionFactory;
+    @Inject private IsisBeanTypeRegistryHolder isisBeanTypeRegistryHolder;
 
     @PostConstruct
     public void postConstr() {
         if(log.isDebugEnabled()) {
-            log.debug("init entity types {}", IsisBeanTypeRegistry.current().getEntityTypes());
+            log.debug("init entity types {}", 
+                    isisBeanTypeRegistryHolder.getIsisBeanTypeRegistry().getEntityTypes());
         }
     }
 
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/entities/JdoEntityTypeRegistry.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/entities/JdoEntityTypeRegistry.java
index b5bfb68..51270e9 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/entities/JdoEntityTypeRegistry.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/entities/JdoEntityTypeRegistry.java
@@ -18,13 +18,13 @@
  */
 package org.apache.isis.jdo.entities;
 
+import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.Set;
 import java.util.stream.Collectors;
 
 import javax.jdo.annotations.PersistenceCapable;
 
-import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.jdo.metamodel.JdoMetamodelUtil;
@@ -32,25 +32,29 @@ import org.apache.isis.jdo.metamodel.JdoMetamodelUtil;
 import static org.apache.isis.commons.internal.base._NullSafe.stream;
 
 import lombok.NoArgsConstructor;
+import lombok.Synchronized;
 import lombok.val;
 
 @NoArgsConstructor
 public class JdoEntityTypeRegistry {
 
-    private final _Lazy<Set<String>> entityTypes = _Lazy.threadSafe(this::findEntityTypes);
+    private Set<String> entityTypes;
 
-    public Set<String> getEntityTypes() {
-        return entityTypes.get();
+    @Synchronized
+    public Set<String> getEntityTypes(IsisBeanTypeRegistry isisBeanTypeRegistry) {
+        if(entityTypes==null) {
+            entityTypes = Collections.unmodifiableSet(findEntityTypes(isisBeanTypeRegistry));
+        }
+        return entityTypes;
     }
 
     // -- HELPER
 
-    private Set<String> findEntityTypes() {
+    private static Set<String> findEntityTypes(IsisBeanTypeRegistry isisBeanTypeRegistry) {
 
         val entityTypes = new LinkedHashSet<String>();
 
-        Set<Class<?>> persistenceCapableTypes = 
-                IsisBeanTypeRegistry.current().getEntityTypes();
+        Set<Class<?>> persistenceCapableTypes = isisBeanTypeRegistry.getEntityTypes();
 
         val classNamesNotEnhanced = _Lists.<String>newArrayList();
         for (Class<?> persistenceCapableType : persistenceCapableTypes) {
diff --git a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/PersistenceSessionFactory5.java b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/PersistenceSessionFactory5.java
index c58a867..6b9eeb2 100644
--- a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/PersistenceSessionFactory5.java
+++ b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/PersistenceSessionFactory5.java
@@ -22,6 +22,7 @@ package org.apache.isis.jdo.persistence;
 import java.util.Map;
 import java.util.Objects;
 
+import javax.inject.Inject;
 import javax.inject.Singleton;
 import javax.jdo.listener.StoreLifecycleListener;
 
@@ -32,6 +33,7 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.commons.internal.base._Blackhole;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.config.beans.IsisBeanTypeRegistryHolder;
 import org.apache.isis.jdo.datanucleus.DataNucleusSettings;
 import org.apache.isis.jdo.datanucleus.JDOStateManagerForIsis;
 import org.apache.isis.jdo.entities.JdoEntityTypeRegistry;
@@ -56,6 +58,8 @@ import lombok.extern.log4j.Log4j2;
 @Service @Singleton @Log4j2
 public class PersistenceSessionFactory5
 implements PersistenceSessionFactory, FixturesInstalledStateHolder {
+    
+    @Inject private IsisBeanTypeRegistryHolder isisBeanTypeRegistryHolder;
 
     private final _Lazy<DataNucleusApplicationComponents5> applicationComponents = 
             _Lazy.threadSafe(this::createDataNucleusApplicationComponents);
@@ -95,7 +99,8 @@ implements PersistenceSessionFactory, FixturesInstalledStateHolder {
         
         addDataNucleusPropertiesIfRequired(datanucleusProps);
         
-        val classesToBePersisted = jdoEntityTypeRegistry.getEntityTypes();
+        val typeRegistry = isisBeanTypeRegistryHolder.getIsisBeanTypeRegistry();
+        val classesToBePersisted = jdoEntityTypeRegistry.getEntityTypes(typeRegistry);
 
         return new DataNucleusApplicationComponents5(
                 configuration,
@@ -105,7 +110,8 @@ implements PersistenceSessionFactory, FixturesInstalledStateHolder {
 
     @Override
     public void catalogNamedQueries() {
-        val classesToBePersisted = jdoEntityTypeRegistry.getEntityTypes();
+        val typeRegistry = isisBeanTypeRegistryHolder.getIsisBeanTypeRegistry();
+        val classesToBePersisted = jdoEntityTypeRegistry.getEntityTypes(typeRegistry);
         DataNucleusApplicationComponents5.catalogNamedQueries(classesToBePersisted, 
                 metaModelContext.getSpecificationLoader());
     }
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java
index 2d130df..cf995c6 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java
@@ -32,7 +32,7 @@ import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.config.registry.IsisBeanTypeRegistry;
+import org.apache.isis.config.beans.IsisBeanTypeRegistryHolder;
 import org.apache.isis.metamodel.consent.Consent;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facets.actions.homepage.HomePageFacet;
@@ -49,9 +49,10 @@ import lombok.val;
 @Service
 public class HomePageResolverServiceDefault implements HomePageResolverService {
 
-    @Inject FactoryService factoryService;
-    @Inject ServiceRegistry serviceRegistry;
-    @Inject SpecificationLoader specLoader;
+    @Inject private FactoryService factoryService;
+    @Inject private ServiceRegistry serviceRegistry;
+    @Inject private SpecificationLoader specLoader;
+    @Inject private IsisBeanTypeRegistryHolder isisBeanTypeRegistryHolder;
 
     @Override
     public HomePageAction getHomePageAction() {
@@ -62,7 +63,7 @@ public class HomePageResolverServiceDefault implements HomePageResolverService {
 
     private HomePageAction lookupHomePageAction() {
 
-        val viewModelTypes = IsisBeanTypeRegistry.current().getViewModelTypes();
+        val viewModelTypes = isisBeanTypeRegistryHolder.getIsisBeanTypeRegistry().getViewModelTypes();
 
         // -- 1) lookup view-models that are type annotated with @HomePage
 
diff --git a/core/testsupport/unittestsupport/src/main/java/org/apache/isis/unittestsupport/AbstractApplyToAllContractTest.java b/core/testsupport/unittestsupport/src/main/java/org/apache/isis/unittestsupport/AbstractApplyToAllContractTest.java
index c4ea8e6..01d9d9d 100644
--- a/core/testsupport/unittestsupport/src/main/java/org/apache/isis/unittestsupport/AbstractApplyToAllContractTest.java
+++ b/core/testsupport/unittestsupport/src/main/java/org/apache/isis/unittestsupport/AbstractApplyToAllContractTest.java
@@ -21,16 +21,14 @@ package org.apache.isis.unittestsupport;
 import java.io.PrintStream;
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Set;
 import java.util.TreeSet;
 
-import javax.jdo.annotations.PersistenceCapable;
-
 import org.junit.Test;
 
 import org.apache.isis.commons.internal._Constants;
-import org.apache.isis.commons.internal.plugins.beantyperegistry.BeanTypeRegistryPlugin;
 import org.apache.isis.unittestsupport.utils.IndentPrinter;
 
 /**
@@ -39,12 +37,10 @@ import org.apache.isis.unittestsupport.utils.IndentPrinter;
  */
 public abstract class AbstractApplyToAllContractTest {
 
-    protected final BeanTypeRegistryPlugin beanTypes;
     protected IndentPrinter out;
 
     protected AbstractApplyToAllContractTest(
             final String packagePrefix) {
-        beanTypes = BeanTypeRegistryPlugin.get();
         out = new IndentPrinter(_Constants.nopWriter);
     }
 
@@ -83,13 +79,13 @@ public abstract class AbstractApplyToAllContractTest {
     }
 
     /**
-     * By default, finds all entity types (ie annotated with {@link PersistenceCapable}).
+     * By default, finds nothing.
      *
      * <p>
      * Can be overridden if need be.
      */
     protected Set<Class<?>> findTypes() {
-        return beanTypes.getEntityTypes();
+        return Collections.emptySet();
     }
 
     protected abstract void applyContractTest(Class<?> entityType);
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java
index 41dad24..3f89c0c 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java
@@ -32,6 +32,7 @@ import org.springframework.test.context.TestPropertySource;
 import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisPresets;
 import org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring;
+import org.apache.isis.config.beans.IsisBeanTypeRegistryHolder;
 import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.metamodel.MetaModelContexts;
 import org.apache.isis.testdomain.Incubating;
@@ -70,6 +71,7 @@ class AutoConfigurationTest {
     
     @Inject private ApplicationContext applicationContext;
     @Inject private IsisSystemEnvironment isisSystemEnvironment;
+    @Inject private IsisBeanTypeRegistryHolder isisBeanTypeRegistryHolder;
 
     //XXX for debugging and experimenting
     @Component
@@ -97,7 +99,7 @@ class AutoConfigurationTest {
     @Test
     void domainObjects_shouldBeDiscovered() {
 
-        val registry = IsisBeanTypeRegistry.current();
+        val registry = isisBeanTypeRegistryHolder.getIsisBeanTypeRegistry();
         val discoveredTypes = registry.snapshotIntrospectableTypes().keySet();
         
         for(val cls : nonManaged()) {