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/03/17 19:33:25 UTC

[isis] branch 2033-IoC_spring created (now e8ffcd0)

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

ahuber pushed a change to branch 2033-IoC_spring
in repository https://gitbox.apache.org/repos/asf/isis.git.


      at e8ffcd0  ISIS-2033: init CDI from within SB

This branch includes the following new commits:

     new e8ffcd0  ISIS-2033: init CDI from within SB

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[isis] 01/01: ISIS-2033: init CDI from within SB

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit e8ffcd033612038525de04e9de2b43b4ffeae3b9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Mar 17 20:33:14 2019 +0100

    ISIS-2033: init CDI from within SB
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2033
---
 .../org/apache/isis/commons/internal/cdi/_CDI.java |   1 +
 .../org/apache/isis/config/AppConfigLocator.java   |  29 ++--
 .../apache/isis/config/beans/BeanTypeRegistry.java | 155 ---------------------
 .../builder/IsisConfigurationBuilderDefault.java   |   2 +-
 .../isis/config/builder/ModulePackageHelper.java   |  20 +--
 .../isis/config/registry/BeanTypeRegistry.java     | 154 ++++++++++++++++++++
 .../apache/isis/config/registry/TypeMetaData.java  |  67 +++++++++
 .../metamodel/specloader/SpecificationLoader.java  |   4 +-
 .../specimpl/ObjectSpecificationAbstract.java      |  22 +--
 .../SpecificationLoaderTestAbstract.java           |  16 +--
 .../ClassDiscoveryServiceDefault.java              |   4 +-
 example/application/springapp/pom.xml              |  16 ++-
 .../incubator/BeanScanInterceptorForSpring.java    |   8 +-
 .../java/isis/incubator/BeanTypeRegistry2.java     | 128 -----------------
 .../src/main/java/isis/incubator/IsisBoot.java     |  33 ++++-
 .../java/springapp/boot/web/SpringAppManifest.java |  79 +++++++++++
 .../boot/web/SpringBootTomcatApplication.java      |   8 +-
 .../boot/web/isis-non-changing.properties          |  72 ++++++++++
 .../src/main/java/springapp/dom/DomainModule.java  |   4 +-
 19 files changed, 480 insertions(+), 342 deletions(-)

diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/_CDI.java b/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/_CDI.java
index 085b204..4d22988 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/_CDI.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/_CDI.java
@@ -27,6 +27,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Optional;
+import java.util.Queue;
 import java.util.Set;
 import java.util.function.Function;
 import java.util.function.Supplier;
diff --git a/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java b/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
index d7ce748..c6789e3 100644
--- a/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
+++ b/core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
@@ -32,16 +32,17 @@ import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.context._Plugin;
 import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.config.registry.BeanTypeRegistry;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import lombok.val;
+import lombok.extern.slf4j.Slf4j;
 
+@Slf4j
 public final class AppConfigLocator {
     
-    private static final Logger LOG = LoggerFactory.getLogger(AppConfigLocator.class);
-    
     private AppConfigLocator() { }
     
     public static AppConfig getAppConfig() {
@@ -156,9 +157,18 @@ public final class AppConfigLocator {
         
         AppConfig appConfig;
         
+        appConfig = lookupAppConfig_UsingFrameworkContext();
+        if(appConfig!=null) {
+            log.info(String.format("Located AppConfig on framework's context '%s'.", appConfig.getClass().getName()));
+            
+            // assuming, we need to bootstrap CDI ourself
+            _CDI.init(()->BeanTypeRegistry.current().streamInbox());
+            return appConfig;
+        }
+        
         appConfig = lookupAppConfig_UsingCDI();
         if(appConfig!=null) {
-            LOG.info(String.format("Located AppConfig '%s' via CDI.", appConfig.getClass().getName()));
+            log.info(String.format("Located AppConfig '%s' via CDI.", appConfig.getClass().getName()));
             
             return appConfig;
         }
@@ -169,7 +179,7 @@ public final class AppConfigLocator {
         	val appConfigImpl = appConfig;
         	val appConfigClass = appConfig.getClass();
         	
-            LOG.info(String.format("Located AppConfig '%s' via ServiceLoader.", appConfigClass.getName()));
+        	log.info(String.format("Located AppConfig '%s' via ServiceLoader.", appConfigClass.getName()));
             
             Supplier<Stream<Class<?>>> onDiscover = appConfigImpl.isisConfiguration()::streamClassesToDiscover;
             
@@ -182,18 +192,17 @@ public final class AppConfigLocator {
             return appConfig;
         }
         
-        appConfig = AppConfig.empty();
-        // as we are in a non-managed environment, we need to bootstrap CDI ourself
-        //_CDI.init(onDiscover);
-        return appConfig;
-        
 //        appConfig = lookupAppConfig_UsingConfigProperties();
 //        if(appConfig!=null) {
 //            LOG.info(String.format("Located AppConfig '%s' using config properties.", appConfig.getClass().getName()));
 //            return appConfig;    
 //        }
         
-        //throw new IsisException("Failed to locate the AppConfig");
+        throw new IsisException("Failed to locate the AppConfig");
+    }
+    
+    private static AppConfig lookupAppConfig_UsingFrameworkContext() {
+        return _Context.getIfAny(AppConfig.class);
     }
     
     private static AppConfig lookupAppConfig_UsingCDI() {
diff --git a/core/config/src/main/java/org/apache/isis/config/beans/BeanTypeRegistry.java b/core/config/src/main/java/org/apache/isis/config/beans/BeanTypeRegistry.java
deleted file mode 100644
index dca7b9a..0000000
--- a/core/config/src/main/java/org/apache/isis/config/beans/BeanTypeRegistry.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package org.apache.isis.config.beans;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Stream;
-
-import org.apache.isis.applib.fixturescripts.FixtureScript;
-import org.apache.isis.commons.internal.collections._Lists;
-
-/**
- * Holds the set of domain services, persistent entities and fixture scripts.services
- */
-public final class BeanTypeRegistry {
-
-	public final static List<String> FRAMEWORK_PROVIDED_SERVICE_PACKAGES = _Lists.of(
-			"org.apache.isis.applib",
-			"org.apache.isis.core.wrapper" ,
-			"org.apache.isis.core.metamodel.services" ,
-			"org.apache.isis.core.runtime.services" ,
-			"org.apache.isis.schema.services" ,
-			"org.apache.isis.objectstore.jdo.applib.service" ,
-			"org.apache.isis.viewer.restfulobjects.rendering.service" ,
-			"org.apache.isis.objectstore.jdo.datanucleus.service.support" ,
-			"org.apache.isis.objectstore.jdo.datanucleus.service.eventbus" ,
-			"org.apache.isis.viewer.wicket.viewer.services", 
-			"org.apache.isis.core.integtestsupport.components");
-
-	public final static List<String> FRAMEWORK_PROVIDED_TYPES_FOR_SCANNING = _Lists.of(
-			"org.apache.isis.config.AppConfig",
-			"org.apache.isis.applib.IsisApplibModule",
-			"org.apache.isis.core.wrapper.WrapperFactoryDefault",
-			"org.apache.isis.core.metamodel.MetamodelModule",
-			"org.apache.isis.core.runtime.RuntimeModule",
-			"org.apache.isis.core.runtime.services.RuntimeServicesModule",
-			"org.apache.isis.jdo.JdoModule",
-			"org.apache.isis.viewer.restfulobjects.rendering.RendererContext"
-
-
-			//                "org.apache.isis.objectstore.jdo.applib.service" ,
-			//                "org.apache.isis.objectstore.jdo.datanucleus.service.support" ,
-			//                "org.apache.isis.objectstore.jdo.datanucleus.service.eventbus" ,
-			//                "org.apache.isis.viewer.wicket.viewer.services", 
-			//                "org.apache.isis.core.integtestsupport.components"
-
-
-			);
-
-	private static BeanTypeRegistry instance = new BeanTypeRegistry();
-	public static BeanTypeRegistry instance() {
-		return instance;
-	}
-
-	// -- persistenceCapableTypes
-	private Set<Class<?>> persistenceCapableTypes;
-	/**
-	 * @return <tt>null</tt> if no appManifest is defined
-	 */
-	public Set<Class<?>> getPersistenceCapableTypes() {
-		return persistenceCapableTypes;
-	}
-	public void setPersistenceCapableTypes(final Set<Class<?>> persistenceCapableTypes) {
-		this.persistenceCapableTypes = persistenceCapableTypes;
-	}
-
-
-	// -- mixinTypes
-	private Set<Class<?>> mixinTypes;
-
-	/**
-	 * Along with {@link #getDomainServiceTypes()}, these are introspected eagerly.
-	 *
-	 * @return <tt>null</tt> if no appManifest is defined
-	 */
-	public Set<Class<?>> getMixinTypes() {
-		return mixinTypes;
-	}
-	public void setMixinTypes(final Set<Class<?>> mixinTypes) {
-		this.mixinTypes = mixinTypes;
-	}
-
-
-	// -- fixtureScriptTypes
-	private Set<Class<? extends FixtureScript>> fixtureScriptTypes;
-
-	/**
-	 * @return <tt>null</tt> if no appManifest is defined
-	 */
-	public Set<Class<? extends FixtureScript>> getFixtureScriptTypes() {
-		return fixtureScriptTypes;
-	}
-	public void setFixtureScriptTypes(final Set<Class<? extends FixtureScript>> fixtureScriptTypes) {
-		this.fixtureScriptTypes = fixtureScriptTypes;
-	}
-
-
-
-	// -- domainServiceTypes
-	private Set<Class<?>> domainServiceTypes;
-	/**
-	 * @return <tt>null</tt> if no appManifest is defined
-	 */
-	public Set<Class<?>> getDomainServiceTypes() {
-		return domainServiceTypes;
-	}
-	public void setDomainServiceTypes(final Set<Class<?>> domainServiceTypes) {
-		this.domainServiceTypes = domainServiceTypes;
-	}
-
-
-	private Set<Class<?>> domainObjectTypes;
-	private Set<Class<?>> viewModelTypes;
-	private Set<Class<?>> xmlElementTypes;
-
-	public Set<Class<?>> getDomainObjectTypes() {
-		return domainObjectTypes;
-	}
-	public void setDomainObjectTypes(final Set<Class<?>> domainObjectTypes) {
-		this.domainObjectTypes = domainObjectTypes;
-	}
-
-	public Set<Class<?>> getViewModelTypes() {
-		return viewModelTypes;
-	}
-	public void setViewModelTypes(final Set<Class<?>> viewModelTypes) {
-		this.viewModelTypes = viewModelTypes;
-	}
-
-	public Set<Class<?>> getXmlElementTypes() {
-		return xmlElementTypes;
-	}
-	public void setXmlElementTypes(final Set<Class<?>> xmlElementTypes) {
-		this.xmlElementTypes = xmlElementTypes;
-	}
-
-	// -- STREAM ALL
-
-	/**
-	 * @since 2.0.0-M2
-	 */
-	public Stream<Class<?>> streamAllTypes() {
-
-		return _Lists.of(persistenceCapableTypes,
-				mixinTypes,
-				fixtureScriptTypes,
-				domainServiceTypes,
-				domainObjectTypes,
-				viewModelTypes,
-				xmlElementTypes)
-				.stream()
-				.flatMap(Collection::stream)
-				;
-	}
-
-}
\ No newline at end of file
diff --git a/core/config/src/main/java/org/apache/isis/config/builder/IsisConfigurationBuilderDefault.java b/core/config/src/main/java/org/apache/isis/config/builder/IsisConfigurationBuilderDefault.java
index fd182d8..d3f28ef 100644
--- a/core/config/src/main/java/org/apache/isis/config/builder/IsisConfigurationBuilderDefault.java
+++ b/core/config/src/main/java/org/apache/isis/config/builder/IsisConfigurationBuilderDefault.java
@@ -125,7 +125,7 @@ final class IsisConfigurationBuilderDefault implements IsisConfigurationBuilder
 
     private void addTopLevelDefaultConfigurationResource() {
         addConfigurationResource(ConfigurationConstants.DEFAULT_CONFIG_FILE, 
-                NotFoundPolicy.FAIL_FAST, ContainsPolicy.IGNORE);
+                NotFoundPolicy.CONTINUE, ContainsPolicy.IGNORE);
     }
 
     private void addDefaultConfigurationResources() {
diff --git a/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java b/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
index de50143..4ce5d67 100644
--- a/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
+++ b/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
@@ -46,7 +46,7 @@ import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.reflection._Reflect;
-import org.apache.isis.config.beans.BeanTypeRegistry;
+import org.apache.isis.config.registry.BeanTypeRegistry;
 import org.apache.isis.core.plugins.classdiscovery.ClassDiscovery;
 import org.apache.isis.core.plugins.classdiscovery.ClassDiscoveryPlugin;
 
@@ -114,9 +114,9 @@ class ModulePackageHelper {
         typesForScanning.add(appManifest.getClass());
         
         //FIXME [2033] at this point we should have all we need, let CDI take over
-        // and let then CDI Bean intercepter make entries into the registry 
+        // and let the CDI Bean intercepter make entries into the registry 
         
-        final BeanTypeRegistry registry = BeanTypeRegistry.instance();
+        final BeanTypeRegistry registry = BeanTypeRegistry.current();
 
         final Set<String> moduleAndFrameworkPackages = new HashSet<>();
         moduleAndFrameworkPackages.addAll(BeanTypeRegistry.FRAMEWORK_PROVIDED_SERVICE_PACKAGES);
@@ -180,13 +180,13 @@ class ModulePackageHelper {
                 .map(s -> s != null ? s + "." : null)
                 .collect(Collectors.toList());
 
-        registry.setDomainServiceTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, domainServiceTypes));
-        registry.setPersistenceCapableTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, persistenceCapableTypes));
-        registry.setFixtureScriptTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, fixtureScriptTypes));
-        registry.setMixinTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, mixinTypes));
-        registry.setDomainObjectTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, domainObjectTypes));
-        registry.setViewModelTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, viewModelTypes));
-        registry.setXmlElementTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, xmlElementTypes));
+        registry.getDomainServiceTypes().addAll(withinPackageAndNotAnonymous(packagesWithDotSuffix, domainServiceTypes));
+        registry.getEntityTypes().addAll(withinPackageAndNotAnonymous(packagesWithDotSuffix, persistenceCapableTypes));
+        registry.getFixtureScriptTypes().addAll(withinPackageAndNotAnonymous(packagesWithDotSuffix, fixtureScriptTypes));
+        registry.getMixinTypes().addAll(withinPackageAndNotAnonymous(packagesWithDotSuffix, mixinTypes));
+        registry.getDomainObjectTypes().addAll(withinPackageAndNotAnonymous(packagesWithDotSuffix, domainObjectTypes));
+        registry.getViewModelTypes().addAll(withinPackageAndNotAnonymous(packagesWithDotSuffix, viewModelTypes));
+        registry.getXmlElementTypes().addAll(withinPackageAndNotAnonymous(packagesWithDotSuffix, xmlElementTypes));
         
         typesForScanning.addAll(domainServiceTypes);
         typesForScanning.addAll(viewModelTypes);
diff --git a/core/config/src/main/java/org/apache/isis/config/registry/BeanTypeRegistry.java b/core/config/src/main/java/org/apache/isis/config/registry/BeanTypeRegistry.java
new file mode 100644
index 0000000..1409b03
--- /dev/null
+++ b/core/config/src/main/java/org/apache/isis/config/registry/BeanTypeRegistry.java
@@ -0,0 +1,154 @@
+package org.apache.isis.config.registry;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Stream;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.context._Context;
+
+import lombok.Getter;
+
+/**
+ * Holds the set of domain services, persistent entities and fixture scripts.services etc.
+ * @since 2.0.0-M3
+ */
+public final class BeanTypeRegistry implements AutoCloseable {
+
+    public static BeanTypeRegistry current() {
+        return _Context.computeIfAbsent(BeanTypeRegistry.class, BeanTypeRegistry::new);
+    }
+    
+    private final Set<Class<?>> inbox = new HashSet<>();
+    
+    @Getter private final Set<Class<?>> entityTypes = new HashSet<>();
+    @Getter private final Set<Class<?>> mixinTypes = new HashSet<>();
+    @Getter private final Set<Class<? extends FixtureScript>> fixtureScriptTypes = new HashSet<>();
+    @Getter private final Set<Class<?>> domainServiceTypes = new HashSet<>();
+    @Getter private final Set<Class<?>> domainObjectTypes = new HashSet<>();
+    @Getter private final Set<Class<?>> viewModelTypes = new HashSet<>();
+    @Getter private final Set<Class<?>> xmlElementTypes = new HashSet<>();
+
+    private final List<Set<? extends Class<? extends Object>>> allTypeSets = _Lists.of(
+            entityTypes,
+            mixinTypes,
+            fixtureScriptTypes,
+            domainServiceTypes,
+            domainObjectTypes,
+            viewModelTypes,
+            xmlElementTypes);
+    
+    
+    @Override
+    public void close() {
+        inbox.clear();
+        allTypeSets.forEach(Set::clear);
+    }
+
+	// -- STREAM ALL
+
+	public Stream<Class<?>> streamAllTypes() {
+
+		return _Lists.of(entityTypes,
+				mixinTypes,
+				fixtureScriptTypes,
+				domainServiceTypes,
+				domainObjectTypes,
+				viewModelTypes,
+				xmlElementTypes)
+				.stream()
+				.flatMap(Collection::stream)
+				;
+	}
+
+	// -- INBOX
+	
+	public void addToInbox(Class<?> type) {
+	    synchronized (inbox) {
+            inbox.add(type);
+        }
+	}
+	
+	/**
+	 * Implemented as a one-shot, that clears the inbox afterwards.
+	 * @return
+	 */
+    public Stream<Class<?>> streamInbox() {
+        
+        final List<Class<?>> defensiveCopy;
+        
+        synchronized (inbox) {
+            defensiveCopy = new ArrayList<>(inbox);
+            inbox.clear();
+        }
+        
+        return defensiveCopy.stream();
+    }
+    
+    // -- FILTER
+
+    //FIXME[2033] don't categorize this early, instead push candidate classes onto a queue for 
+    // later processing when the SpecLoader initializes.
+    public boolean isManagedType(TypeMetaData typeMetaData) {
+        boolean toInbox = false;
+        boolean manage = false;
+        
+        if(typeMetaData.hasDomainServiceAnnotation()) {
+            //domainServiceTypes.add(typeMetaData.getUnderlyingClass());
+            toInbox = true;
+        }
+        
+        if(typeMetaData.hasDomainObjectAnnotation()) {
+            //domainObjectTypes.add(typeMetaData.getUnderlyingClass());
+            toInbox = true;
+        }
+        
+        if(typeMetaData.hasViewModelAnnotation()) {
+            //domainObjectTypes.add(typeMetaData.getUnderlyingClass());
+            toInbox = true;
+        }
+        
+        if(typeMetaData.hasSingletonAnnotation()) {
+            manage = true;
+        }
+        
+        if(toInbox) {
+            addToInbox(typeMetaData.getUnderlyingClass());
+        }
+        
+        return false;
+    }
+    
+    // -- HELPER
+    
+    @Deprecated // not typesafe
+    public final static List<String> FRAMEWORK_PROVIDED_SERVICE_PACKAGES = _Lists.of(
+            "org.apache.isis.applib",
+            "org.apache.isis.core.wrapper" ,
+            "org.apache.isis.core.metamodel.services" ,
+            "org.apache.isis.core.runtime.services" ,
+            "org.apache.isis.schema.services" ,
+            "org.apache.isis.objectstore.jdo.applib.service" ,
+            "org.apache.isis.viewer.restfulobjects.rendering.service" ,
+            "org.apache.isis.objectstore.jdo.datanucleus.service.support" ,
+            "org.apache.isis.objectstore.jdo.datanucleus.service.eventbus" ,
+            "org.apache.isis.viewer.wicket.viewer.services", 
+            "org.apache.isis.core.integtestsupport.components");
+
+    @Deprecated // not typesafe
+    public final static List<String> FRAMEWORK_PROVIDED_TYPES_FOR_SCANNING = _Lists.of(
+            "org.apache.isis.config.AppConfig",
+            "org.apache.isis.applib.IsisApplibModule",
+            "org.apache.isis.core.wrapper.WrapperFactoryDefault",
+            "org.apache.isis.core.metamodel.MetamodelModule",
+            "org.apache.isis.core.runtime.RuntimeModule",
+            "org.apache.isis.core.runtime.services.RuntimeServicesModule",
+            "org.apache.isis.jdo.JdoModule",
+            "org.apache.isis.viewer.restfulobjects.rendering.RendererContext"
+            );
+
+}
\ No newline at end of file
diff --git a/core/config/src/main/java/org/apache/isis/config/registry/TypeMetaData.java b/core/config/src/main/java/org/apache/isis/config/registry/TypeMetaData.java
new file mode 100644
index 0000000..bb0657d
--- /dev/null
+++ b/core/config/src/main/java/org/apache/isis/config/registry/TypeMetaData.java
@@ -0,0 +1,67 @@
+package org.apache.isis.config.registry;
+
+import java.util.Set;
+
+import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+
+import lombok.Value;
+import lombok.val;
+
+@Value(staticConstructor="of")
+public class TypeMetaData {
+    
+    /**
+     * Fully qualified name of the underlying class.
+     */
+    String className;
+    
+    /**
+     * Fully qualified class names of all annotation types that are present on the underlying class.
+     */
+    Set<String> annotationTypes;
+    
+    public boolean hasSingletonAnnotation() {
+        return annotationTypes.contains(singletonAnnotation);
+    }
+    
+    public boolean hasDomainServiceAnnotation() {
+        return annotationTypes.contains(domainServiceAnnotation);
+    }
+    
+    public boolean hasDomainObjectAnnotation() {
+        return annotationTypes.contains(domainObjectAnnotation);
+    }
+    
+    public boolean hasMixinAnnotation() {
+        return annotationTypes.contains(mixinAnnotation);
+    }
+    
+    public boolean hasViewModelAnnotation() {
+        return annotationTypes.contains(viewModelAnnotation);
+    }
+    
+    /**
+     * @return the underlying class of this TypeMetaData
+     */
+    public Class<?> getUnderlyingClass() {
+        try {
+            return _Context.loadClass(className);
+        } catch (ClassNotFoundException e) {
+            val msg = String.format("Failed to load class for name '%s'", className);
+            throw _Exceptions.unrecoverable(msg, e);
+        }
+    }
+    
+    private final static String singletonAnnotation = javax.inject.Singleton.class.getName(); 
+    private final static String domainServiceAnnotation = 
+            org.apache.isis.applib.annotation.DomainService.class.getName();
+    private final static String domainObjectAnnotation = 
+            org.apache.isis.applib.annotation.DomainObject.class.getName();
+    private final static String mixinAnnotation = 
+            org.apache.isis.applib.annotation.Mixin.class.getName();
+    private final static String viewModelAnnotation = 
+            org.apache.isis.applib.annotation.ViewModel.class.getName();
+
+    
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
index 6344db6..fd861cd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
@@ -36,10 +36,10 @@ import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.config.IsisConfiguration;
-import org.apache.isis.config.beans.BeanTypeRegistry;
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.config.property.ConfigPropertyBoolean;
 import org.apache.isis.config.property.ConfigPropertyEnum;
+import org.apache.isis.config.registry.BeanTypeRegistry;
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.lang.ClassUtil;
@@ -156,7 +156,7 @@ public class SpecificationLoader {
         // need to completely load services and mixins (synchronously)
         LOG.info("Loading all specs (up to state of {})", IntrospectionState.NOT_INTROSPECTED);
 
-        val typeRegistry = BeanTypeRegistry.instance(); 
+        val typeRegistry = BeanTypeRegistry.current(); 
         
         final List<ObjectSpecification> specificationsFromRegistry = _Lists.newArrayList();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index c107c14..5383f10 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -40,7 +40,7 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.config.beans.BeanTypeRegistry;
+import org.apache.isis.config.registry.BeanTypeRegistry;
 import org.apache.isis.core.commons.exceptions.UnknownTypeException;
 import org.apache.isis.core.commons.lang.ClassExtensions;
 import org.apache.isis.core.commons.util.ToString;
@@ -93,6 +93,9 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.facetprocessor.FacetProcessor;
 import org.apache.isis.core.metamodel.specloader.postprocessor.PostProcessor;
 import org.apache.isis.core.security.authentication.AuthenticationSession;
+
+import lombok.val;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -850,12 +853,12 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             return Collections.emptyList();
         }
 
-        final Set<Class<?>> mixinTypes = BeanTypeRegistry.instance().getMixinTypes();
-        if(mixinTypes == null) {
+        val mixinTypes = BeanTypeRegistry.current().getMixinTypes();
+        if(_NullSafe.isEmpty(mixinTypes)) {
             return Collections.emptyList();
         }
 
-        final List<ObjectAssociation> mixedInAssociations = _Lists.newArrayList();
+        val mixedInAssociations = _Lists.<ObjectAssociation>newArrayList();
 
         for (final Class<?> mixinType : mixinTypes) {
             addMixedInAssociationsIfAny(mixinType, mixedInAssociations);
@@ -864,7 +867,8 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     }
 
     private void addMixedInAssociationsIfAny(
-            final Class<?> mixinType, final List<ObjectAssociation> toAppendTo) {
+            final Class<?> mixinType, 
+            final List<ObjectAssociation> toAppendTo) {
 
         final ObjectSpecification specification = getSpecificationLoader().loadSpecification(mixinType,
                 IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
@@ -1034,13 +1038,13 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         if (isBean() || isValue()) {
             return Collections.emptyList();
         }
-        final Set<Class<?>> mixinTypes = BeanTypeRegistry.instance().getMixinTypes();
-        if(mixinTypes == null) {
+        
+        val mixinTypes = BeanTypeRegistry.current().getMixinTypes();
+        if(_NullSafe.isEmpty(mixinTypes)) {
             return Collections.emptyList();
         }
 
-        final List<ObjectAction> mixedInActions = _Lists.newArrayList();
-
+        val mixedInActions = _Lists.<ObjectAction>newArrayList();
         for (final Class<?> mixinType : mixinTypes) {
             addMixedInActionsIfAny(mixinType, mixedInActions);
         }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
index fddc47a..6935a5b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
@@ -35,7 +35,7 @@ import org.apache.isis.applib.services.i18n.TranslationService.Mode;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.commons.internal.base._Timing;
 import org.apache.isis.commons.internal.collections._Sets;
-import org.apache.isis.config.beans.BeanTypeRegistry;
+import org.apache.isis.config.registry.BeanTypeRegistry;
 import org.apache.isis.core.metamodel.BeansForTesting;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
@@ -127,13 +127,13 @@ abstract class SpecificationLoaderTestAbstract {
         
         // PRODUCTION
         
-        BeanTypeRegistry.instance().setDomainServiceTypes(_Sets.newHashSet());
-        BeanTypeRegistry.instance().setFixtureScriptTypes(_Sets.newHashSet());
-        BeanTypeRegistry.instance().setDomainObjectTypes(_Sets.newHashSet());
-        BeanTypeRegistry.instance().setMixinTypes(_Sets.newHashSet());
-        BeanTypeRegistry.instance().setViewModelTypes(_Sets.newHashSet());
-        BeanTypeRegistry.instance().setPersistenceCapableTypes(_Sets.newHashSet());
-        BeanTypeRegistry.instance().setXmlElementTypes(_Sets.newHashSet());
+//        BeanTypeRegistry.instance().setDomainServiceTypes(_Sets.newHashSet());
+//        BeanTypeRegistry.instance().setFixtureScriptTypes(_Sets.newHashSet());
+//        BeanTypeRegistry.instance().setDomainObjectTypes(_Sets.newHashSet());
+//        BeanTypeRegistry.instance().setMixinTypes(_Sets.newHashSet());
+//        BeanTypeRegistry.instance().setViewModelTypes(_Sets.newHashSet());
+//        BeanTypeRegistry.instance().setPersistenceCapableTypes(_Sets.newHashSet());
+//        BeanTypeRegistry.instance().setXmlElementTypes(_Sets.newHashSet());
 
         _Timing.runVerbose("specificationLoader.init()", specificationLoader::init);
         
diff --git a/core/plugins/legacy/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceDefault.java b/core/plugins/legacy/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceDefault.java
index 32ee9f5..9117374 100644
--- a/core/plugins/legacy/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceDefault.java
+++ b/core/plugins/legacy/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceDefault.java
@@ -27,7 +27,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
 import org.apache.isis.commons.internal.base._Casts;
-import org.apache.isis.config.beans.BeanTypeRegistry;
+import org.apache.isis.config.registry.BeanTypeRegistry;
 import org.apache.isis.core.plugins.classdiscovery.ClassDiscoveryPlugin;
 
 /**
@@ -63,7 +63,7 @@ implements ClassDiscoveryService {
     // -- HELPER
 
     private static <T> Set<Class<? extends T>> getFixtureScriptTypes() {
-        Set<?> fixtureScriptTypes = BeanTypeRegistry.instance().getFixtureScriptTypes();
+        Set<?> fixtureScriptTypes = BeanTypeRegistry.current().getFixtureScriptTypes();
         if (fixtureScriptTypes != null) {
             return _Casts.uncheckedCast(fixtureScriptTypes);
         }
diff --git a/example/application/springapp/pom.xml b/example/application/springapp/pom.xml
index 9a902bf..26ce268 100644
--- a/example/application/springapp/pom.xml
+++ b/example/application/springapp/pom.xml
@@ -107,13 +107,21 @@
 			<groupId>org.apache.isis.core</groupId>
 			<artifactId>isis-core-applib</artifactId>
 		</dependency>
+		
+		<!-- ISIS RUNTIME -->
+
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-runtime-services</artifactId>
+			<version>${revision}</version>
+		</dependency>
 
 		<!-- ISIS CORE PLUGINS -->
 
-<!-- 		<dependency> -->
-<!-- 			<groupId>org.apache.isis.core</groupId> -->
-<!-- 			<artifactId>isis-core-plugins-ioc-weld</artifactId> -->
-<!-- 		</dependency> -->
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-plugins-ioc-weld</artifactId>
+		</dependency>
 
 		<dependency>
 			<groupId>org.apache.isis.core</groupId>
diff --git a/example/application/springapp/src/main/java/isis/incubator/BeanScanInterceptorForSpring.java b/example/application/springapp/src/main/java/isis/incubator/BeanScanInterceptorForSpring.java
index 6a250b7..ac1fba3 100644
--- a/example/application/springapp/src/main/java/isis/incubator/BeanScanInterceptorForSpring.java
+++ b/example/application/springapp/src/main/java/isis/incubator/BeanScanInterceptorForSpring.java
@@ -6,7 +6,9 @@ import org.springframework.core.type.classreading.MetadataReader;
 import org.springframework.core.type.classreading.MetadataReaderFactory;
 import org.springframework.core.type.filter.TypeFilter;
 
-import isis.incubator.BeanTypeRegistry2.TypeMetaData;
+import org.apache.isis.config.registry.BeanTypeRegistry;
+import org.apache.isis.config.registry.TypeMetaData;
+
 import lombok.Getter;
 import lombok.val;
 import lombok.extern.slf4j.Slf4j;
@@ -14,7 +16,7 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 public class BeanScanInterceptorForSpring implements TypeFilter {
 	
-	@Getter(lazy=true) private final BeanTypeRegistry2 typeRegistry = BeanTypeRegistry2.current();
+	@Getter(lazy=true) private final BeanTypeRegistry typeRegistry = BeanTypeRegistry.current();
 
 	@Override
 	public boolean match(
@@ -33,7 +35,7 @@ public class BeanScanInterceptorForSpring implements TypeFilter {
 		val annotationTypes = annotationMetadata.getAnnotationTypes();
 		val typeMetaData = TypeMetaData.of(classMetadata.getClassName(), annotationTypes);
 		
-		return getTypeRegistry().isDomainType(typeMetaData);
+		return getTypeRegistry().isManagedType(typeMetaData);
 	}
 
 }
diff --git a/example/application/springapp/src/main/java/isis/incubator/BeanTypeRegistry2.java b/example/application/springapp/src/main/java/isis/incubator/BeanTypeRegistry2.java
deleted file mode 100644
index 68e3439..0000000
--- a/example/application/springapp/src/main/java/isis/incubator/BeanTypeRegistry2.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package isis.incubator;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
-
-import lombok.Getter;
-import lombok.Value;
-import lombok.val;
-
-public class BeanTypeRegistry2 implements AutoCloseable {
-
-	public static BeanTypeRegistry2 current() {
-		return _Context.computeIfAbsent(BeanTypeRegistry2.class, BeanTypeRegistry2::new);
-	}
-	
-	@Getter private final Set<Class<?>> entityTypes = new HashSet<>();
-	@Getter private final Set<Class<?>> mixinTypes = new HashSet<>();
-	@Getter private final Set<Class<?>> fixtureScriptTypes = new HashSet<>();
-	@Getter private final Set<Class<?>> domainServiceTypes = new HashSet<>();
-	@Getter private final Set<Class<?>> domainObjectTypes = new HashSet<>();
-	@Getter private final Set<Class<?>> viewModelTypes = new HashSet<>();
-	@Getter private final Set<Class<?>> xmlElementTypes = new HashSet<>();
-
-	private final List<Set<Class<?>>> allTypeSets = _Lists.of(
-			entityTypes,
-			mixinTypes,
-			fixtureScriptTypes,
-			domainServiceTypes,
-			domainObjectTypes,
-			viewModelTypes,
-			xmlElementTypes);
-	
-	
-	@Override
-	public void close() {
-		allTypeSets.forEach(Set::clear);
-	}
-
-	//FIXME[2033] don't categorize this early, instead push candidate classes onto a queue for 
-	// later processing when the SpecLoader initializes.
-	public boolean isDomainType(TypeMetaData typeMetaData) {
-		boolean isToBeIocManaged = false;
-		
-		if(typeMetaData.hasDomainServiceAnnotation()) {
-			domainServiceTypes.add(typeMetaData.getUnderlyingClass());
-		}
-		
-		if(typeMetaData.hasDomainObjectAnnotation()) {
-			domainObjectTypes.add(typeMetaData.getUnderlyingClass());
-		}
-		
-		if(typeMetaData.hasViewModelAnnotation()) {
-			domainObjectTypes.add(typeMetaData.getUnderlyingClass());
-		}
-		
-		if(typeMetaData.hasSingletonAnnotation()) {
-			isToBeIocManaged = true;
-		}
-		
-		return isToBeIocManaged;
-	}
-	
-	// -- TYPE META DATA
-	
-	@Value(staticConstructor="of")
-	public static class TypeMetaData {
-		
-		/**
-		 * Fully qualified name of the underlying class.
-		 */
-		String className;
-		
-		/**
-		 * Fully qualified class names of all annotation types that are present on the underlying class.
-		 */
-		Set<String> annotationTypes;
-		
-		public boolean hasSingletonAnnotation() {
-			return annotationTypes.contains(singletonAnnotation);
-		}
-		
-		public boolean hasDomainServiceAnnotation() {
-			return annotationTypes.contains(domainServiceAnnotation);
-		}
-		
-		public boolean hasDomainObjectAnnotation() {
-			return annotationTypes.contains(domainObjectAnnotation);
-		}
-		
-		public boolean hasMixinAnnotation() {
-			return annotationTypes.contains(mixinAnnotation);
-		}
-		
-		public boolean hasViewModelAnnotation() {
-			return annotationTypes.contains(viewModelAnnotation);
-		}
-		
-		/**
-		 * @return the underlying class of this TypeMetaData
-		 */
-		public Class<?> getUnderlyingClass() {
-			try {
-				return _Context.loadClass(className);
-			} catch (ClassNotFoundException e) {
-				val msg = String.format("Failed to load class for name '%s'", className);
-				throw _Exceptions.unrecoverable(msg, e);
-			}
-		}
-		
-		private final static String singletonAnnotation = javax.inject.Singleton.class.getName(); 
-		private final static String domainServiceAnnotation = 
-				org.apache.isis.applib.annotation.DomainService.class.getName();
-		private final static String domainObjectAnnotation = 
-				org.apache.isis.applib.annotation.DomainObject.class.getName();
-		private final static String mixinAnnotation = 
-				org.apache.isis.applib.annotation.Mixin.class.getName();
-		private final static String viewModelAnnotation = 
-				org.apache.isis.applib.annotation.ViewModel.class.getName();
-
-		
-	}
-	
-}
diff --git a/example/application/springapp/src/main/java/isis/incubator/IsisBoot.java b/example/application/springapp/src/main/java/isis/incubator/IsisBoot.java
index 233de56..30d1e95 100644
--- a/example/application/springapp/src/main/java/isis/incubator/IsisBoot.java
+++ b/example/application/springapp/src/main/java/isis/incubator/IsisBoot.java
@@ -1,7 +1,5 @@
 package isis.incubator;
 
-import org.apache.isis.core.runtime.RuntimeModule;
-import org.apache.isis.core.runtime.system.session.IsisSessionProducerBean;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
@@ -10,7 +8,12 @@ import org.springframework.context.annotation.ComponentScan.Filter;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.FilterType;
 
+import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.config.AppConfig;
+import org.apache.isis.core.runtime.RuntimeModule;
+
 import lombok.val;
+import springapp.boot.web.SpringAppManifest;
 
 @Configuration 
 @ComponentScan(basePackageClasses={RuntimeModule.class}, includeFilters= {
@@ -20,13 +23,21 @@ public class IsisBoot implements ApplicationContextAware {
 
 	@Override
 	public void setApplicationContext(ApplicationContext springContext) throws BeansException {
+	    
+	    // TODO put AppConfig onto the _Context
+	    
+	    val appConfig = new SpringAppManifest();
+	    
+	    System.out.println("!!!!!!!!!!!!!!!!!!! finalizing config");
+	    appConfig.isisConfiguration();
+	    System.out.println("!!!!!!!!!!!!!!!!!!! finalized config");
+	    
+	    
+	    _Context.putSingleton(AppConfig.class, appConfig);
+	    
 		// TODO Auto-generated method stub
 		System.out.println("!!!!!!!!!!!!!!!!!!! TODO bootstrap isis from context");
 		
-//		val isisSessionProducerBean = new IsisSessionProducerBean();
-//		isisSessionProducerBean.produceSpecificationLoader();
-		
-		
 		springContext.getBeansOfType(Object.class).forEach(
 		(k, v)->{
 			
@@ -41,4 +52,14 @@ public class IsisBoot implements ApplicationContextAware {
 		
 	}
 	
+//	@Bean 
+//	public AppConfig appConfig() {
+//        return AppConfig.empty();
+//	}
+	
+//	@Bean
+//	public SpecificationLoader specificationLoader(IsisSessionProducerBean isisSessionProducerBean) {
+//	    return isisSessionProducerBean.produceSpecificationLoader();
+//	}
+	
 }
diff --git a/example/application/springapp/src/main/java/springapp/boot/web/SpringAppManifest.java b/example/application/springapp/src/main/java/springapp/boot/web/SpringAppManifest.java
new file mode 100644
index 0000000..ac7c3c8
--- /dev/null
+++ b/example/application/springapp/src/main/java/springapp/boot/web/SpringAppManifest.java
@@ -0,0 +1,79 @@
+package springapp.boot.web;
+
+import javax.enterprise.inject.Produces;
+import javax.inject.Singleton;
+
+import org.apache.isis.applib.AppManifestAbstract2;
+import org.apache.isis.config.AppConfig;
+import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.config.beans.WebAppConfigBean;
+import org.apache.isis.core.runtime.authorization.standard.AuthorizationManagerStandard;
+import org.apache.isis.core.runtime.threadpool.ThreadPoolExecutionMode;
+import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
+import org.apache.isis.core.security.authentication.bypass.AuthenticatorBypass;
+import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
+import org.apache.isis.core.security.authentication.standard.AuthenticationManagerStandard;
+import org.apache.isis.core.security.authorization.bypass.AuthorizorBypass;
+import org.apache.isis.core.security.authorization.manager.AuthorizationManager;
+
+import springapp.dom.DomainModule;
+
+/**
+ * Bootstrap the application.
+ */
+public class SpringAppManifest extends AppManifestAbstract2 implements AppConfig {
+
+    public static final Builder BUILDER = Builder
+            .forModule(new DomainModule())
+            .withConfigurationPropertiesFile(
+                    SpringAppManifest.class, "isis-non-changing.properties")
+            .withAuthMechanism("shiro")
+            ;
+
+    public SpringAppManifest() {
+        super(BUILDER);
+        
+        ThreadPoolSupport.HIGHEST_CONCURRENCY_EXECUTION_MODE_ALLOWED = 
+                ThreadPoolExecutionMode.SEQUENTIAL_WITHIN_CALLING_THREAD;
+        
+    }
+
+    // Implementing AppConfig, to tell the framework how to bootstrap the configuration.
+    @Override @Produces @Singleton
+    public IsisConfiguration isisConfiguration() {
+        return IsisConfiguration.buildFromAppManifest(this);
+    }
+    
+     /**
+     * The standard authentication manager, configured with the 'bypass' authenticator 
+     * (allows all requests through).
+     * <p>
+     * integration tests ignore appManifest for authentication and authorization.
+     */
+    @Produces @Singleton
+    public AuthenticationManager authenticationManagerWithBypass() {
+        final AuthenticationManagerStandard authenticationManager = new AuthenticationManagerStandard();
+        authenticationManager.addAuthenticator(new AuthenticatorBypass());
+        return authenticationManager;
+    }
+    
+    @Produces @Singleton
+    public AuthorizationManager authorizationManagerWithBypass() {
+        final AuthorizationManagerStandard authorizationManager = new AuthorizationManagerStandard() {
+            {
+                authorizor = new AuthorizorBypass();
+            }  
+        };
+        return authorizationManager;
+    }
+    
+    @Produces @Singleton
+    public WebAppConfigBean webAppConfigBean() {
+        return WebAppConfigBean.builder()
+                .build();
+    }
+
+    
+    
+    
+}
diff --git a/example/application/springapp/src/main/java/springapp/boot/web/SpringBootTomcatApplication.java b/example/application/springapp/src/main/java/springapp/boot/web/SpringBootTomcatApplication.java
index 73f9eb5..2700c3f 100644
--- a/example/application/springapp/src/main/java/springapp/boot/web/SpringBootTomcatApplication.java
+++ b/example/application/springapp/src/main/java/springapp/boot/web/SpringBootTomcatApplication.java
@@ -1,10 +1,12 @@
 package springapp.boot.web;
 
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.Bean;
+
 import org.apache.isis.core.runtime.threadpool.ThreadPoolExecutionMode;
 import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
 import org.apache.isis.core.webapp.IsisWebAppContextListener;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 
 import isis.incubator.IsisBoot;
 import springapp.dom.DomainModule;
@@ -12,7 +14,7 @@ import springapp.dom.DomainModule;
 @SpringBootApplication(scanBasePackageClasses= {DomainModule.class, IsisBoot.class})
 public class SpringBootTomcatApplication extends SpringBootServletInitializer {
 
-	//@Bean
+	@Bean
 	public IsisWebAppContextListener isisWebAppContextListener() {
 
 		ThreadPoolSupport.HIGHEST_CONCURRENCY_EXECUTION_MODE_ALLOWED = 
diff --git a/example/application/springapp/src/main/java/springapp/boot/web/isis-non-changing.properties b/example/application/springapp/src/main/java/springapp/boot/web/isis-non-changing.properties
new file mode 100644
index 0000000..463d7d4
--- /dev/null
+++ b/example/application/springapp/src/main/java/springapp/boot/web/isis-non-changing.properties
@@ -0,0 +1,72 @@
+#  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.
+
+
+# -- auto wired by plugins --
+#isis.services.eventbus.implementation=guava
+#isis.services.eventbus.implementation=axon
+
+isis.reflector.validator.allowDeprecated=false
+isis.reflector.validator.noParamsOnly=true
+isis.reflector.validator.explicitObjectType=true
+isis.reflector.validator.serviceActionsOnly=true
+isis.reflector.validator.mixinsOnly=true
+
+isis.reflector.facet.cssClassFa.patterns=\
+                        new.*:fa-plus,\
+                        add.*:fa-plus-square,\
+                        create.*:fa-plus,\
+                        update.*:fa-edit,\
+                        delete.*:fa-trash,\
+                        find.*:fa-search,\
+                        list.*:fa-list
+
+isis.reflector.facet.cssClass.patterns=\
+                        delete.*:btn-danger
+
+isis.reflector.explicitAnnotations.action=true
+
+isis.objects.editing=false
+
+isis.viewer.wicket.application.name=Hello World App
+isis.viewer.wicket.application.css=css/application.css
+isis.viewer.wicket.application.js=scripts/application.js
+isis.viewer.wicket.application.about=Hello World
+isis.viewer.wicket.welcome.file=welcome.html
+
+isis.viewer.wicket.credit.1.image=/images/apache-isis/logo-48x48.png
+isis.viewer.wicket.credit.1.name=Apache Isis
+isis.viewer.wicket.credit.1.url=http://isis.apache.org
+
+isis.viewer.wicket.themes.initial=Flatly
+isis.viewer.wicket.themes.showChooser=yes
+isis.viewer.wicket.themes.enabled=Cosmo,Flatly,Darkly,Sandstone,United
+
+
+isis.viewer.wicket.maxTitleLengthInStandaloneTables=0
+isis.viewer.wicket.maxTitleLengthInParentedTables=0
+
+
+isis.persistor.datanucleus.impl.datanucleus.schema.validateTables=true
+isis.persistor.datanucleus.impl.datanucleus.schema.validateConstraints=true
+
+
+isis.persistor.datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit=false
+isis.persistor.datanucleus.impl.datanucleus.identifier.case=MixedCase
+isis.persistor.datanucleus.impl.datanucleus.cache.level2.type=none
+isis.persistor.datanucleus.impl.datanucleus.cache.level2.mode=ENABLE_SELECTIVE
+
diff --git a/example/application/springapp/src/main/java/springapp/dom/DomainModule.java b/example/application/springapp/src/main/java/springapp/dom/DomainModule.java
index f455740..6ea8e12 100644
--- a/example/application/springapp/src/main/java/springapp/dom/DomainModule.java
+++ b/example/application/springapp/src/main/java/springapp/dom/DomainModule.java
@@ -23,10 +23,12 @@ import javax.enterprise.inject.Vetoed;
 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 import org.springframework.context.annotation.Configuration;
 
+import org.apache.isis.applib.ModuleAbstract;
+
 @Vetoed // must not be managed by CDI
 @Configuration
 //@ComponentScan(basePackages= {"domainapp.modules.spring"})
 @EnableAutoConfiguration
-public class DomainModule {
+public class DomainModule extends ModuleAbstract {
 
 }