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/09/27 18:42:34 UTC

[isis] branch v2 updated: ISIS-2158: class discovery: removes the need for a custom scan-filter

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 c4d0233  ISIS-2158: class discovery: removes the need for a custom scan-filter
c4d0233 is described below

commit c4d023316ae4e145cf68b06ffa88afc15665b386
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Sep 27 20:42:24 2019 +0200

    ISIS-2158: class discovery: removes the need for a custom scan-filter
    
    - @Singleton is no longer discovered!
    - use @Service or @DomainService instead
    - the IsisBeanScanInterceptorForSpring is now a NoOp, waiting to be
    removed
    - IsisBoot installs the IsisBeanFactoryPostProcessorForSpring which is
    the replacement for the filter above
---
 .../isis/applib/annotation/DomainObject.java       |   7 +
 .../isis/applib/annotation/DomainService.java      |   8 ++
 .../org/apache/isis/applib/annotation/Mixin.java   |   7 +
 .../apache/isis/applib/annotation/ViewModel.java   |   7 +
 .../services/audit/AuditerServiceLogging.java      |   5 +-
 .../isis/applib/services/clock/ClockService.java   |   5 +-
 .../applib/services/jaxb/JaxbServiceDefault.java   |   5 +-
 .../services/publish/PublisherServiceLogging.java  |   4 +-
 .../IsisBeanFactoryPostProcessorForSpring.java     | 106 +++++++++++++++
 .../beans/IsisBeanScanInterceptorForSpring.java    |  32 ++---
 .../resources/presets/DebugDiscovery.properties    |   1 +
 .../metamodel/services/ServiceInjectorDefault.java |   3 +-
 .../appfeat/ApplicationFeatureFactory.java         |   5 +-
 .../ApplicationFeatureRepositoryDefault.java       |   4 +-
 .../services/events/MetamodelEventService.java     |   4 +-
 .../exceprecog/ExceptionRecognizerDocDefault.java  |   4 +-
 .../services/grid/GridLoaderServiceDefault.java    |   4 +-
 .../services/grid/GridServiceDefault.java          |   4 +-
 .../grid/bootstrap3/GridSystemServiceBS3.java      |   4 +-
 .../services/layout/LayoutServiceDefault.java      |   4 +-
 .../metamodel/MetaModelServiceDefault.java         |   4 +-
 .../services/registry/ServiceRegistryDefault.java  |   3 +-
 .../services/repository/RepositoryServiceJdo.java  |   5 +-
 .../services/swagger/SwaggerServiceDefault.java    |   4 +-
 .../services/title/TitleServiceDefault.java        |   4 +-
 .../services/user/UserServiceDefault.java          |   5 +-
 .../specloader/InjectorMethodEvaluatorDefault.java |   4 +-
 .../MetaModelValidatorServiceDefault.java          |   5 +-
 .../specloader/ProgrammingModelServiceDefault.java |   5 +-
 .../specloader/SpecificationLoaderDefault.java     |   5 +-
 .../IsisPlatformTransactionManagerForJdo.java      |   4 +-
 .../isis/jdo/jdosupport/IsisJdoSupportDN5.java     |   5 +-
 .../org/apache/isis/runtime/spring/IsisBoot.java   |   3 +
 .../apache/isis/wrapper/WrapperFactoryDefault.java |   5 +-
 .../AuthenticationSessionProviderDefault.java      |   5 +-
 .../background/CommandExecutorServiceDefault.java  |   5 +-
 .../bookmarks/BookmarkServiceInternalDefault.java  |   5 +-
 .../services/command/CommandServiceDefault.java    |   4 +-
 .../services/eventbus/EventBusServiceSpring.java   |   4 +-
 .../factory/FactoryServiceInternalDefault.java     |   5 +-
 .../homepage/HomePageResolverServiceDefault.java   |   5 +-
 .../services/i18n/po/TranslationServicePo.java     |   5 +-
 .../menubars/MenuBarsLoaderServiceDefault.java     |   4 +-
 .../menubars/bootstrap3/MenuBarsServiceBS3.java    |   5 +-
 .../services/message/MessageServiceDefault.java    |   4 +-
 .../persist/ObjectAdapterServiceDefault.java       |   4 +-
 .../services/routing/RoutingServiceDefault.java    |   5 +-
 .../sessmgmt/SessionManagementServiceDefault.java  |   5 +-
 .../services/sse/EventStreamServiceDefault.java    |   5 +-
 .../services/xactn/TransactionServiceSpring.java   |   4 +-
 .../xmlsnapshot/XmlSnapshotServiceDefault.java     |   7 +-
 .../modules/h2console/WebModuleH2Console.java      |   4 +-
 .../logonlog/WebModuleLogOnExceptionLogger.java    |   4 +-
 .../resources/WebModuleStaticResources.java        |   4 +-
 .../modules/sse/WebModuleServerSentEvents.java     |   4 +-
 .../context/session/RuntimeEventService.java       |   5 +-
 .../JdoPersistenceLifecycleService.java            |   3 +-
 .../events/PersistenceEventService.java            |   5 +-
 .../system/session/IsisSessionFactoryDefault.java  |   7 +-
 .../transaction/AuditingServiceInternal.java       |   5 +-
 .../PersistenceSessionServiceInternalDefault.java  |   5 +-
 .../manager/AuthorizationManagerStandard.java      |   4 +-
 .../apache/isis/security/shiro/WebModuleShiro.java |   3 +-
 .../RepresentationServiceContentNegotiator.java    |   5 +-
 .../restfulobjects/WebModuleRestfulObjects.java    |   4 +-
 .../isis/viewer/wicket/viewer/WebModuleWicket.java |   4 +-
 .../imagecache/ImageResourceCacheClassPath.java    |   5 +-
 .../ComponentFactoryRegistrarDefault.java          |   4 +-
 .../ComponentFactoryRegistryDefault.java           |   4 +-
 .../registries/pages/PageClassListDefault.java     |   5 +-
 .../registries/pages/PageClassRegistryDefault.java |   4 +-
 .../pages/PageNavigationServiceDefault.java        |   4 +-
 .../viewer/services/DeepLinkServiceWicket.java     |   4 +-
 .../viewer/services/LocaleProviderWicket.java      |   5 +-
 .../services/TranslationsResolverWicket.java       |   5 +-
 .../settings/WicketViewerSettingsDefault.java      |   4 +-
 .../java/domainapp/dom/jee/JeeDemoService.java     |   4 +-
 .../domainapp/dom/types/blob/DemoBlobStore.java    |   5 +-
 .../domainapp/utils/LibraryPreloadingService.java  |   5 +-
 .../conf/Configuration_usingStereotypes.java       |  15 +++
 .../testdomain/model/stereotypes/MyObject.java}    |  13 +-
 .../model/stereotypes/MyObject_mixin.java}         |  18 ++-
 .../testdomain/model/stereotypes/MyService.java}   |  12 +-
 .../isis/testdomain/model/stereotypes/MyView.java} |  12 +-
 .../testdomain/auditing/AuditerServiceTest.java    |   4 +-
 .../bootstrapping/AutoConfigurationTest.java       | 150 +++++++++++++++++++++
 .../JdoBootstrappingTest_usingFixtures.java        |   2 +
 .../SpringServiceProvisioningTest.java             |   7 +-
 .../eventhandling/GenericEventPublishingTest.java  |   6 +-
 .../eventhandling/SpringEventPublishingTest.java   |   6 +-
 .../publishing/PublisherServiceTest.java           |   3 +-
 ...ransactionRollbackTest_usingTransactional.java} |   2 +-
 .../extensions/fixtures/FixturesEventService.java  |   4 +-
 .../fixtures/FixturesLifecyleService.java          |   5 +-
 .../fixturescripts/ExecutionParametersService.java |   4 +-
 .../QueryResultsCacheControlInternal.java          |   5 +-
 .../secman/jdo/seed/SeedSecurityModuleService.java |   4 +-
 97 files changed, 558 insertions(+), 203 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
index 5388086..34e4134 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
@@ -24,6 +24,8 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import org.springframework.stereotype.Component;
+
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
@@ -37,10 +39,15 @@ import org.apache.isis.applib.events.lifecycle.ObjectUpdatingEvent;
 
 /**
  * Domain semantics for domain objects (entities and view models; for services see {@link org.apache.isis.applib.annotation.DomainService}).
+ * 
+ * @apiNote Meta annotation {@link Component} allows for the Spring framework to pick up (discover) the 
+ * annotated type. 
+ * For more details see {@link org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring}.
  */
 @Inherited
 @Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
+@Component
 public @interface DomainObject {
 
     /**
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
index 4023001..85a9728 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
@@ -25,16 +25,24 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import org.springframework.stereotype.Service;
+
 /**
  * Indicates that the class should be automatically recognized as a domain service.
  *
  * <p>
  * Also indicates whether the domain service acts as a repository for an entity, and menu ordering UI hints.
  * </p>
+ * 
+ * @apiNote Meta annotation {@link Service} allows for the Spring framework to pick up (discover) the 
+ * annotated type. 
+ * For more details see {@link org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring}.
+ * 
  */
 @Inherited
 @Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
+@Service
 public @interface DomainService {
 
     /**
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Mixin.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Mixin.java
index 6ea021d..7568045 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Mixin.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Mixin.java
@@ -25,13 +25,20 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import org.springframework.stereotype.Component;
+
 /**
  * An object that acts as a mix-in to some other object, contributing behaviour and/or derived state based on the
  * domain object.
+ * 
+ * @apiNote Meta annotation {@link Component} allows for the Spring framework to pick up (discover) the 
+ * annotated type. 
+ * For more details see {@link org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring}.
  */
 @Inherited
 @Target({ ElementType.TYPE })
 @Retention(RetentionPolicy.RUNTIME)
+@Component
 public @interface Mixin {
 
     /**
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModel.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModel.java
index 0912744..3c61bbc 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModel.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModel.java
@@ -27,6 +27,8 @@ import java.lang.annotation.Target;
 
 import javax.xml.bind.annotation.XmlRootElement;
 
+import org.springframework.stereotype.Component;
+
 /**
  * An object that is conceptually part of the application layer, and which surfaces behaviour and/or state that
  * is aggregate of one or more domain entity.
@@ -46,10 +48,15 @@ import javax.xml.bind.annotation.XmlRootElement;
  * </p>
  *
  * @see ViewModel
+ * 
+ * @apiNote Meta annotation {@link Component} allows for the Spring framework to pick up (discover) the 
+ * annotated type. 
+ * For more details see {@link org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring}.
  */
 @Inherited
 @Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
+@Component
 public @interface ViewModel {
 
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/audit/AuditerServiceLogging.java b/core/applib/src/main/java/org/apache/isis/applib/services/audit/AuditerServiceLogging.java
index 8729e30..31f1810 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/audit/AuditerServiceLogging.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/audit/AuditerServiceLogging.java
@@ -22,13 +22,14 @@ import java.sql.Timestamp;
 import java.util.UUID;
 
 import javax.annotation.PostConstruct;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 
 import lombok.extern.log4j.Log4j2;
 
-@Singleton
+@Service
 @Log4j2
 public class AuditerServiceLogging implements AuditerService {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/clock/ClockService.java b/core/applib/src/main/java/org/apache/isis/applib/services/clock/ClockService.java
index 0561ebc..723fb23 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/clock/ClockService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/clock/ClockService.java
@@ -20,11 +20,10 @@ package org.apache.isis.applib.services.clock;
 
 import java.sql.Timestamp;
 
-import javax.inject.Singleton;
-
 import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
 import org.joda.time.LocalDateTime;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.clock.Clock;
 
@@ -34,7 +33,7 @@ import org.apache.isis.applib.clock.Clock;
  * co-ordinated time management through a centralized time service.
  *
  */
-@Singleton
+@Service
 public class ClockService {
 
     public LocalDate now() {
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
index 47c5a64..eb94b52 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
@@ -21,13 +21,14 @@ package org.apache.isis.applib.services.jaxb;
 import java.util.Map;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.domain.DomainObjectList;
 import org.apache.isis.applib.services.inject.ServiceInjector;
@@ -36,7 +37,7 @@ import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.schema.utils.jaxbadapters.PersistentEntitiesAdapter;
 import org.apache.isis.schema.utils.jaxbadapters.PersistentEntityAdapter;
 
-@Singleton
+@Service
 public class JaxbServiceDefault extends JaxbService.Simple {
 
     @Override
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublisherServiceLogging.java b/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublisherServiceLogging.java
index 854ae0e..91bedd0 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublisherServiceLogging.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/publish/PublisherServiceLogging.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.applib.services.publish;
 
-import javax.inject.Singleton;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.schema.chg.v1.ChangesDto;
@@ -28,7 +28,7 @@ import org.apache.isis.schema.utils.InteractionDtoUtils;
 
 import lombok.extern.log4j.Log4j2;
 
-@Singleton @Log4j2
+@Service @Log4j2
 public class PublisherServiceLogging implements PublisherService {
 
     @Override
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
new file mode 100644
index 0000000..aa89561
--- /dev/null
+++ b/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanFactoryPostProcessorForSpring.java
@@ -0,0 +1,106 @@
+/*
+ *  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.beans;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+import org.springframework.stereotype.Component;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.Mixin;
+import org.apache.isis.applib.annotation.ViewModel;
+import org.apache.isis.config.registry.IsisBeanTypeRegistry;
+import org.apache.isis.config.registry.TypeMetaData;
+
+import lombok.Getter;
+import lombok.val;
+import lombok.extern.log4j.Log4j2;
+
+/**
+ * The framework's stereotypes {@link DomainService}, {@link DomainObject}, {@link ViewModel}, etc. 
+ * are meta annotated with eg. {@link Component}, which allows for the Spring framework to pick up the 
+ * annotated type as candidate to become a managed bean. 
+ * <p>
+ * By plugging into Spring's bootstrapping via a {@link BeanFactoryPostProcessor}, intercepting those 
+ * types is possible. Eg. {@link ViewModel} should not be managed by Spring, only discovered.
+ * 
+ * @since 2.0
+ *
+ */
+@Log4j2 @Component
+public class IsisBeanFactoryPostProcessorForSpring implements BeanFactoryPostProcessor {
+
+    @Getter(lazy=true) 
+    private final IsisBeanTypeRegistry typeRegistry = IsisBeanTypeRegistry.current();
+    
+    @Override
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
+        
+        val registry = (BeanDefinitionRegistry) beanFactory;
+        for (String beanDefinitionName : registry.getBeanDefinitionNames()) {
+            
+            log.debug(()->"processing: " + beanDefinitionName);
+            
+            val beanDefinition = registry.containsBeanDefinition(beanDefinitionName) 
+                    ? registry.getBeanDefinition(beanDefinitionName) 
+                            : null;
+                    
+            if(beanDefinition==null || beanDefinition.getBeanClassName() == null) {
+                continue; // check next beanDefinition
+            }
+            
+            val typeMetaData = TypeMetaData.of(beanDefinition.getBeanClassName());
+            
+            //TODO should re-implement/rename this method 
+            getTypeRegistry().isIoCManagedType(typeMetaData);
+             
+            if(hasMetamodelAnnotation_otherThanDomainService(typeMetaData)) {
+                registry.removeBeanDefinition(beanDefinitionName);
+                log.debug(()->"removing: " + beanDefinitionName);
+            }
+            
+        }
+        
+    }
+    
+    //TODO this should be a functionality of the IsisBeanTypeRegistry
+    private boolean hasMetamodelAnnotation_otherThanDomainService(TypeMetaData typeMetaData) {
+        
+        val type = typeMetaData.getUnderlyingClass();
+        
+        if(type.isAnnotationPresent(DomainObject.class)) {
+            return true;
+        }
+        
+        if(type.isAnnotationPresent(ViewModel.class)) {
+            return true;
+        }
+        
+        if(type.isAnnotationPresent(Mixin.class)) {
+            return true;
+        }
+        
+        return false;
+        
+    }
+
+}
diff --git a/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanScanInterceptorForSpring.java b/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanScanInterceptorForSpring.java
index 71182db..0b3482b 100644
--- a/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanScanInterceptorForSpring.java
+++ b/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanScanInterceptorForSpring.java
@@ -31,7 +31,7 @@ import lombok.Getter;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Log4j2
+@Log4j2 @Deprecated
 public class IsisBeanScanInterceptorForSpring implements TypeFilter {
 
     @Getter(lazy=true) 
@@ -42,21 +42,23 @@ public class IsisBeanScanInterceptorForSpring implements TypeFilter {
             MetadataReader metadataReader, 
             MetadataReaderFactory metadataReaderFactory)
                     throws IOException {
+        
+        return false; //NOOP
 
-        val classMetadata = metadataReader.getClassMetadata();
-        if(!classMetadata.isConcrete()) {
-            return false;
-        }
-
-        //val annotationMetadata = metadataReader.getAnnotationMetadata();
-        //val annotationTypes = annotationMetadata.getAnnotationTypes();
-        val typeMetaData = TypeMetaData.of(classMetadata.getClassName()/*, annotationTypes*/);
-
-        if(log.isDebugEnabled()) {
-            log.debug("scanning concrete type {} -> {}", classMetadata.getClassName(), typeMetaData);
-        }
-
-        return getTypeRegistry().isIoCManagedType(typeMetaData);
+//        val classMetadata = metadataReader.getClassMetadata();
+//        if(!classMetadata.isConcrete()) {
+//            return false;
+//        }
+//
+//        //val annotationMetadata = metadataReader.getAnnotationMetadata();
+//        //val annotationTypes = annotationMetadata.getAnnotationTypes();
+//        val typeMetaData = TypeMetaData.of(classMetadata.getClassName()/*, annotationTypes*/);
+//
+//        if(log.isDebugEnabled()) {
+//            log.debug("scanning concrete type {} -> {}", classMetadata.getClassName(), typeMetaData);
+//        }
+//
+//        return getTypeRegistry().isIoCManagedType(typeMetaData);
     }
 
 }
diff --git a/core/config/src/main/resources/presets/DebugDiscovery.properties b/core/config/src/main/resources/presets/DebugDiscovery.properties
index 45a70de..4141dbf 100644
--- a/core/config/src/main/resources/presets/DebugDiscovery.properties
+++ b/core/config/src/main/resources/presets/DebugDiscovery.properties
@@ -16,3 +16,4 @@
 #  under the License.
 
 logging.level.org.apache.isis.config.registry.IsisBeanTypeRegistry = DEBUG
+logging.level.org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring = DEBUG
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorDefault.java
index 50883bf..0a72e7f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorDefault.java
@@ -32,6 +32,7 @@ import javax.inject.Singleton;
 
 import org.springframework.beans.factory.InjectionPoint;
 import org.springframework.core.MethodParameter;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -46,7 +47,7 @@ import org.apache.isis.metamodel.spec.InjectorMethodEvaluator;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Singleton @Log4j2
+@Service @Log4j2
 public class ServiceInjectorDefault implements ServiceInjector {
 
     private static final String KEY_SET_PREFIX = "isis.services.injector.setPrefix";
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureFactory.java
index 10652f7..0315f79 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureFactory.java
@@ -19,11 +19,12 @@
 package org.apache.isis.metamodel.services.appfeat;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.factory.FactoryService;
 
-@Singleton
+@Service
 public class ApplicationFeatureFactory {
 
     public ApplicationFeature newApplicationFeature() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
index 1f0f313..aebe97e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
@@ -30,6 +30,8 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
@@ -61,7 +63,7 @@ import static org.apache.isis.config.internal._Config.getConfiguration;
 
 import lombok.val;
 
-@Singleton
+@Service
 public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRepository {
 
     // -- caches
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/events/MetamodelEventService.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/events/MetamodelEventService.java
index f248dfa..17cd605 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/events/MetamodelEventService.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/events/MetamodelEventService.java
@@ -22,6 +22,8 @@ import javax.enterprise.event.Event;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
@@ -37,7 +39,7 @@ import lombok.Builder;
  * @since 2.0
  *
  */
-@Singleton 
+@Service 
 @Builder //for JUnit Test support
 public class MetamodelEventService {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java
index 2cea7e8..4399def 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/exceprecog/ExceptionRecognizerDocDefault.java
@@ -24,6 +24,8 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.RecoverableException;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
@@ -32,7 +34,7 @@ import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerForType;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.metamodel.adapter.version.ConcurrencyException;
 
-@Singleton
+@Service
 public class ExceptionRecognizerDocDefault
 implements ExceptionRecognizer {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java
index 56225ed..6933a9a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridLoaderServiceDefault.java
@@ -27,6 +27,8 @@ import java.util.Objects;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.layout.grid.Grid;
 import org.apache.isis.applib.services.grid.GridLoaderService;
 import org.apache.isis.applib.services.message.MessageService;
@@ -37,7 +39,7 @@ import org.apache.isis.commons.internal.resources._Resources;
 
 import lombok.extern.log4j.Log4j2;
 
-@Singleton @Log4j2
+@Service @Log4j2
 public class GridLoaderServiceDefault implements GridLoaderService {
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridServiceDefault.java
index 0d4852d..3cfaee6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridServiceDefault.java
@@ -24,6 +24,8 @@ import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.layout.grid.Grid;
 import org.apache.isis.applib.services.grid.GridLoaderService;
 import org.apache.isis.applib.services.grid.GridService;
@@ -32,7 +34,7 @@ import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
 
-@Singleton
+@Service
 public class GridServiceDefault implements GridService {
 
     public static final String COMPONENT_TNS = "http://isis.apache.org/applib/layout/component";
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
index 3c2a025..cd9281d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
@@ -29,6 +29,8 @@ import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.layout.component.ActionLayoutData;
 import org.apache.isis.applib.layout.component.ActionLayoutDataOwner;
@@ -67,7 +69,7 @@ import static org.apache.isis.commons.internal.base._NullSafe.stream;
 
 import lombok.val;
 
-@Singleton
+@Service
 public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
 
     public static final String TNS = "http://isis.apache.org/applib/layout/grid/bootstrap3";
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java
index 6854211..29a60ec 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java
@@ -26,6 +26,8 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import javax.xml.bind.Marshaller;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.layout.grid.Grid;
 import org.apache.isis.applib.layout.menubars.MenuBars;
 import org.apache.isis.applib.services.grid.GridService;
@@ -41,7 +43,7 @@ import org.apache.isis.metamodel.specloader.SpecificationLoader;
 
 import lombok.val;
 
-@Singleton
+@Service
 public class LayoutServiceDefault implements LayoutService {
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java
index 7d08c74..681c4a9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -27,6 +27,8 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.CommandDtoProcessor;
 import org.apache.isis.applib.services.grid.GridService;
@@ -51,7 +53,7 @@ import org.apache.isis.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.schema.metamodel.v1.MetamodelDto;
 
-@Singleton
+@Service
 public class MetaModelServiceDefault implements MetaModelService {
 
     private MetaModelExporter metaModelExporter;
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 6bf509b..c9626b8 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
@@ -31,6 +31,7 @@ import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.context.annotation.Bean;
 import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainService;
@@ -53,7 +54,7 @@ import lombok.extern.log4j.Log4j2;
 /**
  * @since 2.0
  */
-@Singleton @Log4j2
+@Service @Log4j2
 public final class ServiceRegistryDefault implements ServiceRegistry, ApplicationContextAware {
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/repository/RepositoryServiceJdo.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/repository/RepositoryServiceJdo.java
index 8d4351e..5c22da9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/repository/RepositoryServiceJdo.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/repository/RepositoryServiceJdo.java
@@ -26,7 +26,8 @@ import java.util.stream.Collectors;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.PersistFailedException;
 import org.apache.isis.applib.RepositoryException;
@@ -44,7 +45,7 @@ import org.apache.isis.metamodel.services.persistsession.PersistenceSessionServi
 
 import lombok.val;
 
-@Singleton
+@Service
 public class RepositoryServiceJdo implements RepositoryService {
 
     private boolean autoFlush;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java
index 8846e3b..0efcf68 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java
@@ -21,6 +21,8 @@ package org.apache.isis.metamodel.services.swagger;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.services.swagger.SwaggerService;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.metamodel.services.swagger.internal.SwaggerSpecGenerator;
@@ -31,7 +33,7 @@ import static org.apache.isis.commons.internal.base._With.ifPresentElse;
 import static org.apache.isis.commons.internal.resources._Resources.getRestfulPathIfAny;
 import static org.apache.isis.commons.internal.resources._Resources.prependContextPathIfPresent;
 
-@Singleton 
+@Service 
 public class SwaggerServiceDefault implements SwaggerService {
 
     @Inject SpecificationLoader specificationLoader;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/title/TitleServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/title/TitleServiceDefault.java
index 3b7953b..a169593 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/title/TitleServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/title/TitleServiceDefault.java
@@ -22,6 +22,8 @@ package org.apache.isis.metamodel.services.title;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.services.title.TitleService;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
@@ -29,7 +31,7 @@ import org.apache.isis.metamodel.services.persistsession.ObjectAdapterService;
 
 import lombok.val;
 
-@Singleton
+@Service
 public class TitleServiceDefault implements TitleService {
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/user/UserServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/user/UserServiceDefault.java
index 990fa32..604ede0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/user/UserServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/user/UserServiceDefault.java
@@ -24,7 +24,8 @@ import java.util.List;
 import java.util.Stack;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
@@ -35,7 +36,7 @@ import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.security.authentication.AuthenticationSession;
 import org.apache.isis.security.authentication.AuthenticationSessionProvider;
 
-@Singleton
+@Service
 public class UserServiceDefault implements UserService {
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/InjectorMethodEvaluatorDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/InjectorMethodEvaluatorDefault.java
index 8f16938..bdd8195 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/InjectorMethodEvaluatorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/InjectorMethodEvaluatorDefault.java
@@ -21,11 +21,11 @@ package org.apache.isis.metamodel.specloader;
 
 import java.lang.reflect.Method;
 
-import javax.inject.Singleton;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.metamodel.spec.InjectorMethodEvaluator;
 
-@Singleton
+@Service
 public final class InjectorMethodEvaluatorDefault implements InjectorMethodEvaluator {
 
     //TODO[2112] cleanup comment
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/MetaModelValidatorServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/MetaModelValidatorServiceDefault.java
index 5727c43..eea4385 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/MetaModelValidatorServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/MetaModelValidatorServiceDefault.java
@@ -19,7 +19,8 @@
 package org.apache.isis.metamodel.specloader;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Lazy;
@@ -37,7 +38,7 @@ import lombok.extern.log4j.Log4j2;
 /**
  * @since 2.0
  */
-@Singleton @Log4j2
+@Service @Log4j2
 public class MetaModelValidatorServiceDefault implements MetaModelValidatorService {
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java
index 73620ea..34153b4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java
@@ -19,7 +19,8 @@
 package org.apache.isis.metamodel.specloader;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.config.IsisConfigurationLegacy;
@@ -31,7 +32,7 @@ import org.apache.isis.metamodel.progmodels.dflt.ProgrammingModelFacetsJava8;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Singleton @Log4j2
+@Service @Log4j2
 public class ProgrammingModelServiceDefault implements ProgrammingModelService {
 
     @Override
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 9ab2e70..afb2bb4 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
@@ -25,7 +25,8 @@ import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.context._Context;
@@ -73,7 +74,7 @@ import lombok.extern.log4j.Log4j2;
  * </ul>
  * </p>
  */
-@Singleton
+@Service
 @Log4j2
 public class SpecificationLoaderDefault implements SpecificationLoader {
 
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisPlatformTransactionManagerForJdo.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisPlatformTransactionManagerForJdo.java
index b75c76a..e5b18e4 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisPlatformTransactionManagerForJdo.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisPlatformTransactionManagerForJdo.java
@@ -19,8 +19,8 @@
 package org.apache.isis.jdo.persistence;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
+import org.springframework.stereotype.Service;
 import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.TransactionException;
 import org.springframework.transaction.support.AbstractPlatformTransactionManager;
@@ -38,7 +38,7 @@ import org.apache.isis.security.authentication.AuthenticationSession;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Singleton @Log4j2
+@Service @Log4j2
 public class IsisPlatformTransactionManagerForJdo extends AbstractPlatformTransactionManager {
 
     private static final long serialVersionUID = 1L;
diff --git a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/jdosupport/IsisJdoSupportDN5.java b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/jdosupport/IsisJdoSupportDN5.java
index eb2a8e5..78f5190 100644
--- a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/jdosupport/IsisJdoSupportDN5.java
+++ b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/jdosupport/IsisJdoSupportDN5.java
@@ -29,13 +29,14 @@ import java.util.Map;
 import java.util.stream.Collectors;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 import javax.jdo.Extent;
 import javax.jdo.JDOQLTypedQuery;
 import javax.jdo.PersistenceManager;
 import javax.jdo.datastore.JDOConnection;
 import javax.jdo.query.BooleanExpression;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.FatalException;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.collections._Lists;
@@ -53,7 +54,7 @@ import static org.apache.isis.commons.internal.base._NullSafe.stream;
  * This service provides a number of utility methods to supplement/support the capabilities of the JDO Objectstore.
  *
  */
-@Singleton
+@Service
 public class IsisJdoSupportDN5 implements IsisJdoSupport_v3_2 {
 
 
diff --git a/core/runtime-extensions/src/main/java/org/apache/isis/runtime/spring/IsisBoot.java b/core/runtime-extensions/src/main/java/org/apache/isis/runtime/spring/IsisBoot.java
index 5090489..e4307ba 100644
--- a/core/runtime-extensions/src/main/java/org/apache/isis/runtime/spring/IsisBoot.java
+++ b/core/runtime-extensions/src/main/java/org/apache/isis/runtime/spring/IsisBoot.java
@@ -29,14 +29,17 @@ import org.springframework.context.annotation.FilterType;
 import org.springframework.context.annotation.Import;
 
 import org.apache.isis.applib.IsisApplibModule;
+import org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring;
 import org.apache.isis.config.beans.IsisBeanScanInterceptorForSpring;
 import org.apache.isis.metamodel.IsisMetamodelModule;
+import org.apache.isis.metamodel.services.repository.RepositoryServiceJdo;
 import org.apache.isis.runtime.IsisRuntimeModule;
 import org.apache.isis.runtime.services.IsisRuntimeServicesModule;
 import org.apache.isis.wrapper.IsisWrapperModule;
 
 @Configuration
 @Import({
+    IsisBeanFactoryPostProcessorForSpring.class,
     IsisConfigModule.class,
 })
 @ComponentScan(
diff --git a/core/runtime-extensions/src/main/java/org/apache/isis/wrapper/WrapperFactoryDefault.java b/core/runtime-extensions/src/main/java/org/apache/isis/wrapper/WrapperFactoryDefault.java
index a03958e..666af89 100644
--- a/core/runtime-extensions/src/main/java/org/apache/isis/wrapper/WrapperFactoryDefault.java
+++ b/core/runtime-extensions/src/main/java/org/apache/isis/wrapper/WrapperFactoryDefault.java
@@ -29,7 +29,8 @@ import java.util.Map;
 import java.util.function.BiConsumer;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
@@ -68,7 +69,7 @@ import lombok.val;
  * be interacted with, while enforcing the hide/disable/validate rules as implied by
  * the Isis programming model.
  */
-@Singleton
+@Service
 public class WrapperFactoryDefault implements WrapperFactory {
 
     private final List<InteractionListener> listeners = new ArrayList<InteractionListener>();
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/authsess/AuthenticationSessionProviderDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/authsess/AuthenticationSessionProviderDefault.java
index 0e76433..f9b0940 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/authsess/AuthenticationSessionProviderDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/authsess/AuthenticationSessionProviderDefault.java
@@ -21,7 +21,8 @@ package org.apache.isis.runtime.services.authsess;
 import java.util.List;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.metamodel.services.user.UserServiceDefault;
 import org.apache.isis.runtime.system.session.IsisSessionFactory;
@@ -29,7 +30,7 @@ import org.apache.isis.security.authentication.AuthenticationSession;
 import org.apache.isis.security.authentication.AuthenticationSessionProvider;
 import org.apache.isis.security.authentication.standard.SimpleSession;
 
-@Singleton
+@Service
 public class AuthenticationSessionProviderDefault implements AuthenticationSessionProvider {
 
     /**
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java
index e3d0514..a1da625 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/background/CommandExecutorServiceDefault.java
@@ -25,7 +25,8 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
@@ -70,7 +71,7 @@ import org.apache.isis.schema.utils.CommonDtoUtils;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Singleton @Log4j2
+@Service @Log4j2
 public class CommandExecutorServiceDefault implements CommandExecutorService {
 
     @Override
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java
index 96f9b92..8c97e4e 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/bookmarks/BookmarkServiceInternalDefault.java
@@ -25,7 +25,8 @@ import java.util.List;
 import java.util.Set;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -45,7 +46,7 @@ import org.apache.isis.metamodel.services.persistsession.PersistenceSessionServi
  * This service enables a serializable 'bookmark' to be created for an entity.
  *
  */
-@Singleton
+@Service
 public class BookmarkServiceInternalDefault implements BookmarkService, SerializingAdapter {
 
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandServiceDefault.java
index 652cd87..3e5e06c 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/command/CommandServiceDefault.java
@@ -18,13 +18,13 @@
  */
 package org.apache.isis.runtime.services.command;
 
-import javax.inject.Singleton;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandDefault;
 import org.apache.isis.applib.services.command.spi.CommandService;
 
-@Singleton
+@Service
 public class CommandServiceDefault implements CommandService {
 
     @Override
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/eventbus/EventBusServiceSpring.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/eventbus/EventBusServiceSpring.java
index d645713..3abfe55 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/eventbus/EventBusServiceSpring.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/eventbus/EventBusServiceSpring.java
@@ -19,13 +19,13 @@
 package org.apache.isis.runtime.services.eventbus;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.eventbus.EventBusService;
 
-@Singleton
+@Service
 public class EventBusServiceSpring implements EventBusService {
 
     @Inject private ApplicationEventPublisher applicationEventPublisher;
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceInternalDefault.java
index 34ecce7..cb02a13 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceInternalDefault.java
@@ -23,7 +23,8 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.ViewModel;
@@ -43,7 +44,7 @@ import static org.apache.isis.commons.internal.base._With.requires;
 
 import lombok.val;
 
-@Singleton 
+@Service 
 public class FactoryServiceInternalDefault implements FactoryService {
 
     @Override
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 6839d1e..71418d0 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
@@ -20,7 +20,8 @@ package org.apache.isis.runtime.services.homepage;
 
 import javax.enterprise.inject.Vetoed;
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.HomePage;
@@ -46,7 +47,7 @@ import org.apache.isis.metamodel.spec.feature.ObjectAction;
 
 import lombok.val;
 
-@Singleton
+@Service
 public class HomePageResolverServiceDefault implements HomePageResolverService {
 
     @Inject FactoryService factoryService;
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java
index dfa38e4..708ad0b 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/i18n/po/TranslationServicePo.java
@@ -20,7 +20,8 @@ package org.apache.isis.runtime.services.i18n.po;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.i18n.LocaleProvider;
 import org.apache.isis.applib.services.i18n.TranslationService;
@@ -32,7 +33,7 @@ import org.apache.isis.runtime.system.context.IsisContext;
 
 import static org.apache.isis.config.internal._Config.getConfiguration;
 
-@Singleton
+@Service
 public class TranslationServicePo implements TranslationService {
 
     public static final String KEY_PO_MODE = "isis.services.translation.po.mode";
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java
index 07da33c..e7be9b7 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/MenuBarsLoaderServiceDefault.java
@@ -22,10 +22,10 @@ import java.nio.charset.StandardCharsets;
 import java.util.Optional;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.AbstractResource;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.layout.menubars.bootstrap3.BS3MenuBars;
 import org.apache.isis.applib.services.jaxb.JaxbService;
@@ -37,7 +37,7 @@ import org.apache.isis.config.beans.WebAppConfigBean;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Singleton @Log4j2
+@Service @Log4j2
 public class MenuBarsLoaderServiceDefault implements MenuBarsLoaderService {
 
     @Override
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java
index 0065192..47b8e14 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/menubars/bootstrap3/MenuBarsServiceBS3.java
@@ -26,7 +26,8 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
@@ -61,7 +62,7 @@ import org.apache.isis.metamodel.spec.feature.ObjectAction;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Singleton @Log4j2
+@Service @Log4j2
 public class MenuBarsServiceBS3 implements MenuBarsService {
 
     public static final String MB3_TNS = "http://isis.apache.org/applib/layout/menubars/bootstrap3";
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/message/MessageServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/message/MessageServiceDefault.java
index 611f04a..4b78e62 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/message/MessageServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/message/MessageServiceDefault.java
@@ -19,9 +19,9 @@
 package org.apache.isis.runtime.services.message;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.RecoverableException;
 import org.apache.isis.applib.services.i18n.TranslatableString;
@@ -30,7 +30,7 @@ import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.security.authentication.MessageBroker;
 
-@Singleton @Primary
+@Service @Primary
 public class MessageServiceDefault implements MessageService {
 
     @Override
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/persist/ObjectAdapterServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/persist/ObjectAdapterServiceDefault.java
index 373ac94..b03be5a 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/persist/ObjectAdapterServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/persist/ObjectAdapterServiceDefault.java
@@ -22,9 +22,9 @@ import java.io.Serializable;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.services.inject.ServiceInjector;
@@ -46,7 +46,7 @@ import static org.apache.isis.commons.internal.base._With.requires;
 
 import lombok.val;
 
-@Singleton @Primary
+@Service @Primary
 public class ObjectAdapterServiceDefault implements ObjectAdapterService {
 
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/routing/RoutingServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/routing/RoutingServiceDefault.java
index e29108e..630f48b 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/routing/RoutingServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/routing/RoutingServiceDefault.java
@@ -19,14 +19,15 @@
 package org.apache.isis.runtime.services.routing;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.routing.RoutingService;
 import org.apache.isis.metamodel.services.homepage.HomePageResolverService;
 
 import lombok.val;
 
-@Singleton
+@Service
 public class RoutingServiceDefault implements RoutingService {
 
     @Override
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sessmgmt/SessionManagementServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sessmgmt/SessionManagementServiceDefault.java
index 4c9071f..65fbbeb 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sessmgmt/SessionManagementServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sessmgmt/SessionManagementServiceDefault.java
@@ -20,7 +20,8 @@
 package org.apache.isis.runtime.services.sessmgmt;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.sessmgmt.SessionManagementService;
 import org.apache.isis.runtime.system.session.IsisSession;
@@ -28,7 +29,7 @@ import org.apache.isis.runtime.system.session.IsisSessionFactory;
 
 import lombok.val;
 
-@Singleton
+@Service
 public class SessionManagementServiceDefault implements SessionManagementService {
 
     @Override
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sse/EventStreamServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sse/EventStreamServiceDefault.java
index 7bfbbdf..a9a6483 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sse/EventStreamServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/sse/EventStreamServiceDefault.java
@@ -32,7 +32,8 @@ import java.util.concurrent.ForkJoinPool;
 import java.util.function.Predicate;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.events.sse.EventStream;
 import org.apache.isis.applib.events.sse.EventStreamService;
@@ -56,7 +57,7 @@ import lombok.extern.log4j.Log4j2;
  * @since 2.0
  *
  */
-@Singleton @Log4j2
+@Service @Log4j2
 public class EventStreamServiceDefault implements EventStreamService {
 
     @Inject TransactionService transactionService;
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xactn/TransactionServiceSpring.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xactn/TransactionServiceSpring.java
index 15bd24f..10ea5eb 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xactn/TransactionServiceSpring.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xactn/TransactionServiceSpring.java
@@ -22,8 +22,8 @@ package org.apache.isis.runtime.services.xactn;
 import java.util.function.Supplier;
 
 import javax.annotation.Nonnull;
-import javax.inject.Singleton;
 
+import org.springframework.stereotype.Service;
 import org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.support.TransactionCallback;
@@ -40,7 +40,7 @@ import org.apache.isis.runtime.system.transaction.IsisTransactionObject;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Singleton
+@Service
 @Log4j2
 public class TransactionServiceSpring implements TransactionService {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xmlsnapshot/XmlSnapshotServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xmlsnapshot/XmlSnapshotServiceDefault.java
index d91210c..dc086fc 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xmlsnapshot/XmlSnapshotServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/xmlsnapshot/XmlSnapshotServiceDefault.java
@@ -18,9 +18,8 @@
  */
 package org.apache.isis.runtime.services.xmlsnapshot;
 
-import javax.inject.Singleton;
+import org.springframework.stereotype.Service;
 
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.xmlsnapshot.XmlSnapshotService;
 import org.apache.isis.applib.services.xmlsnapshot.XmlSnapshotServiceAbstract;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
@@ -36,7 +35,7 @@ import org.apache.isis.runtime.system.context.IsisContext;
  * with {@link org.apache.isis.applib.annotation.DomainService}.  Because this class is implemented in core, this means
  * that it is automatically registered and available for use; no further configuration is required.
  */
-@Singleton
+@Service
 public class XmlSnapshotServiceDefault extends XmlSnapshotServiceAbstract {
 
     static class XmlSnapshotServiceDefaultBuilder implements XmlSnapshotService.Builder{
@@ -66,7 +65,6 @@ public class XmlSnapshotServiceDefault extends XmlSnapshotServiceAbstract {
     /**
      * Creates a simple snapshot of the domain object.
      */
-    @Programmatic
     @Override
     public XmlSnapshotService.Snapshot snapshotFor(final Object domainObject) {
         final ObjectAdapter adapter = IsisContext.pojoToAdapter().apply(domainObject);
@@ -78,7 +76,6 @@ public class XmlSnapshotServiceDefault extends XmlSnapshotServiceAbstract {
      * properties or collections (using {@link Builder#includePath(String)} and
      * {@link Builder#includePathAndAnnotation(String, String)}) - to be created.
      */
-    @Programmatic
     @Override
     public Builder builderFor(final Object domainObject) {
         return new XmlSnapshotServiceDefaultBuilder(domainObject);
diff --git a/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/h2console/WebModuleH2Console.java b/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/h2console/WebModuleH2Console.java
index 79b021a..9608a93 100644
--- a/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/h2console/WebModuleH2Console.java
+++ b/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/h2console/WebModuleH2Console.java
@@ -19,12 +19,12 @@
 package org.apache.isis.webapp.modules.h2console;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
 import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.value.LocalResourcePath;
 import org.apache.isis.commons.internal.base._Strings;
@@ -36,7 +36,7 @@ import org.apache.isis.webapp.modules.WebModuleContext;
 import lombok.Getter;
 import lombok.val;
 
-@Singleton @Order(0)
+@Service @Order(0)
 public class WebModuleH2Console implements WebModule  {
 
     @Inject private IsisConfigurationLegacy isisConfiguration;
diff --git a/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/logonlog/WebModuleLogOnExceptionLogger.java b/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/logonlog/WebModuleLogOnExceptionLogger.java
index 58c0d05..ef757bb 100644
--- a/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/logonlog/WebModuleLogOnExceptionLogger.java
+++ b/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/logonlog/WebModuleLogOnExceptionLogger.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.webapp.modules.logonlog;
 
-import javax.inject.Singleton;
 import javax.servlet.Filter;
 import javax.servlet.FilterRegistration.Dynamic;
 import javax.servlet.ServletContext;
@@ -27,6 +26,7 @@ import javax.servlet.ServletException;
 
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.webapp.modules.WebModule;
@@ -41,7 +41,7 @@ import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpected
  * 
  * @since 2.0
  */
-@Singleton @Order(Ordered.LOWEST_PRECEDENCE)
+@Service @Order(Ordered.LOWEST_PRECEDENCE)
 public final class WebModuleLogOnExceptionLogger implements WebModule  {
 
     private final static String LOGONLOGGER_FILTER_CLASS_NAME = 
diff --git a/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/resources/WebModuleStaticResources.java b/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/resources/WebModuleStaticResources.java
index 692b33a..2980095 100644
--- a/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/resources/WebModuleStaticResources.java
+++ b/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/resources/WebModuleStaticResources.java
@@ -18,13 +18,13 @@
  */
 package org.apache.isis.webapp.modules.resources;
 
-import javax.inject.Singleton;
 import javax.servlet.FilterRegistration.Dynamic;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
 import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.webapp.modules.WebModule;
 import org.apache.isis.webapp.modules.WebModuleContext;
@@ -34,7 +34,7 @@ import org.apache.isis.webapp.modules.WebModuleContext;
  * 
  * @since 2.0
  */
-@Singleton @Order(-100)
+@Service @Order(-100)
 public final class WebModuleStaticResources implements WebModule  {
 
     private final static String[] urlPatterns = { 
diff --git a/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/sse/WebModuleServerSentEvents.java b/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/sse/WebModuleServerSentEvents.java
index f791fc0..036bcdd 100644
--- a/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/sse/WebModuleServerSentEvents.java
+++ b/core/runtime-web/src/main/java/org/apache/isis/webapp/modules/sse/WebModuleServerSentEvents.java
@@ -18,12 +18,12 @@
  */
 package org.apache.isis.webapp.modules.sse;
 
-import javax.inject.Singleton;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
 import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.webapp.modules.WebModule;
 import org.apache.isis.webapp.modules.WebModuleContext;
@@ -35,7 +35,7 @@ import lombok.val;
  * 
  * @since 2.0
  */
-@Singleton @Order(-99)
+@Service @Order(-99)
 public final class WebModuleServerSentEvents implements WebModule  {
 
     private final static String SERVLET_NAME = "ServerSentEventsServlet";
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeEventService.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeEventService.java
index 193ccfa..feb80f6 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeEventService.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeEventService.java
@@ -20,7 +20,8 @@ package org.apache.isis.runtime.system.context.session;
 
 import javax.enterprise.event.Event;
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.runtime.system.persistence.JdoPersistenceLifecycleService;
 import org.apache.isis.runtime.system.session.IsisSession;
@@ -31,7 +32,7 @@ import org.apache.isis.runtime.system.session.IsisSession;
  * @implNote listeners to runtime events are hard-wired, because these events are already fired 
  * during bootstrapping, when event handling might not work properly yet.   
  */
-@Singleton
+@Service
 public class RuntimeEventService {
 
     @Inject JdoPersistenceLifecycleService listener; // dependsOn
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/JdoPersistenceLifecycleService.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/JdoPersistenceLifecycleService.java
index 8ab54ed..0f246f0 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/JdoPersistenceLifecycleService.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/JdoPersistenceLifecycleService.java
@@ -23,6 +23,7 @@ import javax.inject.Singleton;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
@@ -38,7 +39,7 @@ import static org.apache.isis.commons.internal.base._With.requires;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Singleton @Log4j2
+@Service @Log4j2
 public class JdoPersistenceLifecycleService {
 
     private PersistenceSessionFactory persistenceSessionFactory;
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/PersistenceEventService.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/PersistenceEventService.java
index 3869e26..b74e9c8 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/PersistenceEventService.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/events/PersistenceEventService.java
@@ -20,14 +20,15 @@ package org.apache.isis.runtime.system.persistence.events;
 
 import javax.enterprise.event.Event;
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 /**
  * 
  * @since 2.0
  *
  */
-@Singleton 
+@Service 
 public class PersistenceEventService {
     
     // -- MANAGED EVENTS
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java
index eeac91d..737b46e 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java
@@ -29,13 +29,10 @@ import java.util.stream.Stream;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
-import org.springframework.context.annotation.DependsOn;
+import org.springframework.stereotype.Service;
 
-import org.apache.isis.applib.services.grid.GridService;
 import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.title.TitleService;
 import org.apache.isis.commons.collections.Bin;
@@ -75,7 +72,7 @@ import lombok.extern.log4j.Log4j2;
  * </p>
  *
  */
-@Singleton @Log4j2 
+@Service @Log4j2 
 public class IsisSessionFactoryDefault implements IsisSessionFactory {
 
     @Inject private ServiceRegistry serviceRegistry;
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditingServiceInternal.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditingServiceInternal.java
index f15774d..e89b2db 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditingServiceInternal.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/AuditingServiceInternal.java
@@ -24,7 +24,8 @@ import java.util.Set;
 import java.util.UUID;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.audit.AuditerService;
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -41,7 +42,7 @@ import lombok.val;
 /**
  * Wrapper around {@link org.apache.isis.applib.services.audit.AuditerService}.
  */
-@Singleton
+@Service
 public class AuditingServiceInternal {
 
     Boolean whetherCanAudit;
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/PersistenceSessionServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/PersistenceSessionServiceInternalDefault.java
index ff42acb..07dfa1f 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/PersistenceSessionServiceInternalDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/PersistenceSessionServiceInternalDefault.java
@@ -21,7 +21,8 @@ package org.apache.isis.runtime.system.transaction;
 import java.util.List;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.query.Query;
@@ -42,7 +43,7 @@ import org.apache.isis.runtime.system.session.IsisSessionFactory;
 import static org.apache.isis.commons.internal.base._With.acceptIfPresent;
 import static org.apache.isis.commons.internal.base._With.mapIfPresentElse;
 
-@Singleton
+@Service
 public class PersistenceSessionServiceInternalDefault 
 implements PersistenceSessionServiceInternal {
 
diff --git a/core/security/api/src/main/java/org/apache/isis/security/authentication/manager/AuthorizationManagerStandard.java b/core/security/api/src/main/java/org/apache/isis/security/authentication/manager/AuthorizationManagerStandard.java
index 937ea6b..b48c5fc 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/authentication/manager/AuthorizationManagerStandard.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/authentication/manager/AuthorizationManagerStandard.java
@@ -24,13 +24,15 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.sudo.SudoService;
 import org.apache.isis.security.authentication.AuthenticationSession;
 import org.apache.isis.security.authorization.manager.AuthorizationManager;
 import org.apache.isis.security.authorization.standard.Authorizor;
 
-@Singleton
+@Service
 public class AuthorizationManagerStandard implements AuthorizationManager {
 
 
diff --git a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/WebModuleShiro.java b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/WebModuleShiro.java
index 4a5012a..7af096c 100644
--- a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/WebModuleShiro.java
+++ b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/WebModuleShiro.java
@@ -33,6 +33,7 @@ import org.apache.shiro.web.env.WebEnvironment;
 import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.webapp.modules.WebModule;
@@ -50,7 +51,7 @@ import lombok.val;
  * Can be customized via static {@link WebModuleShiro#setShiroEnvironmentClass(Class)}
  * @since 2.0
  */
-@Singleton @Order(Ordered.HIGHEST_PRECEDENCE)
+@Service @Order(Ordered.HIGHEST_PRECEDENCE)
 public final class WebModuleShiro implements WebModule  {
 
     private final static String SHIRO_LISTENER_CLASS_NAME = 
diff --git a/core/viewer-restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java b/core/viewer-restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java
index 2eab6c8..7072aa7 100644
--- a/core/viewer-restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java
+++ b/core/viewer-restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceContentNegotiator.java
@@ -23,10 +23,11 @@ import java.util.function.Function;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
-import javax.inject.Singleton;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.ResponseBuilder;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ActionResultReprRenderer.SelfLink;
@@ -38,7 +39,7 @@ import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndPr
 import org.apache.isis.viewer.restfulobjects.rendering.service.conneg.ContentNegotiationService;
 import org.apache.isis.viewer.restfulobjects.rendering.service.conneg.ContentNegotiationServiceForRestfulObjectsV1_0;
 
-@Singleton
+@Service
 public class RepresentationServiceContentNegotiator implements RepresentationService {
 
 
diff --git a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/WebModuleRestfulObjects.java b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/WebModuleRestfulObjects.java
index e3b33e9..1533bf0 100644
--- a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/WebModuleRestfulObjects.java
+++ b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/WebModuleRestfulObjects.java
@@ -18,13 +18,13 @@
  */
 package org.apache.isis.viewer.restfulobjects;
 
-import javax.inject.Singleton;
 import javax.servlet.FilterRegistration.Dynamic;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
 import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.webapp.modules.WebModule;
 import org.apache.isis.webapp.modules.WebModuleContext;
@@ -42,7 +42,7 @@ import static org.apache.isis.commons.internal.resources._Resources.putRestfulPa
  * 
  * @since 2.0
  */
-@Singleton @Order(-80)
+@Service @Order(-80)
 public final class WebModuleRestfulObjects implements WebModule  {
 
     public static final String KEY_RESTFUL_BASE_PATH = "isis.viewer.restfulobjects.basePath";
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/WebModuleWicket.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/WebModuleWicket.java
index 2a33036..2d01fb6 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/WebModuleWicket.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/WebModuleWicket.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.viewer.wicket.viewer;
 
-import javax.inject.Singleton;
 import javax.servlet.Filter;
 import javax.servlet.FilterRegistration.Dynamic;
 import javax.servlet.ServletContext;
@@ -26,6 +25,7 @@ import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
 import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.webapp.modules.WebModule;
@@ -42,7 +42,7 @@ import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpected
  * WebModule that provides the Wicket Viewer.
  * @since 2.0
  */
-@Singleton @Order(-80)
+@Service @Order(-80)
 public final class WebModuleWicket implements WebModule  {
 
     private final static String WICKET_FILTER_CLASS_NAME = 
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/imagecache/ImageResourceCacheClassPath.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/imagecache/ImageResourceCacheClassPath.java
index c8e1e5e..7b3266c 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/imagecache/ImageResourceCacheClassPath.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/imagecache/ImageResourceCacheClassPath.java
@@ -24,12 +24,11 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
-import javax.inject.Singleton;
-
 import com.google.common.collect.Maps;
 
 import org.apache.wicket.request.resource.PackageResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
@@ -45,7 +44,7 @@ import images.Images;
  * <p>
  * Searches for a fixed set of suffixes: <code>png, gif, jpeg, jpg, svg</code>.
  */
-@Singleton
+@Service
 public class ImageResourceCacheClassPath implements ImageResourceCache {
 
     private static final long serialVersionUID = 1L;
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index 7280c0c..1c8ed50 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -21,7 +21,7 @@ package org.apache.isis.viewer.wicket.viewer.registries.components;
 
 import java.util.ServiceLoader;
 
-import javax.inject.Singleton;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.context._Plugin;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
@@ -94,7 +94,7 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.Enti
  * implementations loaded using {@link ServiceLoader} (ie from
  * <tt>META-INF/services</tt>).
  */
-@Singleton
+@Service
 public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistrar {
 
     @Override
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistryDefault.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistryDefault.java
index fc2b221..c6d4e12 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistryDefault.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistryDefault.java
@@ -25,7 +25,6 @@ import java.util.Iterator;
 import java.util.List;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import com.google.common.base.Supplier;
 import com.google.common.collect.Multimap;
@@ -34,6 +33,7 @@ import com.google.common.collect.Multimaps;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.model.IModel;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
@@ -47,7 +47,7 @@ import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
  * Implementation of {@link ComponentFactoryRegistry} that delegates to a
  * provided {@link ComponentFactoryRegistrar}.
  */
-@Singleton
+@Service
 public class ComponentFactoryRegistryDefault implements ComponentFactoryRegistry {
 
     private final Multimap<ComponentType, ComponentFactory> componentFactoriesByType;
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassListDefault.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassListDefault.java
index 083b7e7..d96289e 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassListDefault.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassListDefault.java
@@ -19,9 +19,8 @@
 
 package org.apache.isis.viewer.wicket.viewer.registries.pages;
 
-import javax.inject.Singleton;
-
 import org.apache.wicket.Page;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.viewer.wicket.model.models.PageType;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassList;
@@ -42,7 +41,7 @@ import org.apache.isis.viewer.wicket.ui.pages.voidreturn.VoidReturnPage;
  * Default implementation of {@link PageClassList}, specifying the default pages
  * for each of the {@link PageType}s.
  */
-@Singleton
+@Service
 public class PageClassListDefault implements PageClassList {
 
     private static final long serialVersionUID = 1L;
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java
index b564503..a209c19 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageClassRegistryDefault.java
@@ -23,11 +23,11 @@ import java.util.Map;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import com.google.common.collect.Maps;
 
 import org.apache.wicket.Page;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.viewer.wicket.model.models.PageType;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassList;
@@ -38,7 +38,7 @@ import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistrySpi;
  * Default implementation of {@link PageClassRegistry}; just delegates to an
  * underlying {@link PageClassList}.
  */
-@Singleton
+@Service
 public class PageClassRegistryDefault implements PageClassRegistry, PageClassRegistrySpi {
 
     private static final long serialVersionUID = 1L;
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageNavigationServiceDefault.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageNavigationServiceDefault.java
index 9f07f14..9016edf 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageNavigationServiceDefault.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/pages/PageNavigationServiceDefault.java
@@ -20,13 +20,13 @@
 package org.apache.isis.viewer.wicket.viewer.registries.pages;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.apache.wicket.Page;
 import org.apache.wicket.RestartResponseAtInterceptPageException;
 import org.apache.wicket.RestartResponseException;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.viewer.wicket.model.models.PageType;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
@@ -35,7 +35,7 @@ import org.apache.isis.viewer.wicket.ui.pages.PageNavigationService;
 /**
  * Default implementation of {@link org.apache.isis.viewer.wicket.ui.pages.PageNavigationService}
  */
-@Singleton
+@Service
 public class PageNavigationServiceDefault implements PageNavigationService {
 
     private static final long serialVersionUID = 1L;
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/DeepLinkServiceWicket.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/DeepLinkServiceWicket.java
index aa8ddf1..6083915 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/DeepLinkServiceWicket.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/DeepLinkServiceWicket.java
@@ -22,12 +22,12 @@ import java.net.URI;
 import java.net.URISyntaxException;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.apache.wicket.Page;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.linking.DeepLinkService;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
@@ -40,7 +40,7 @@ import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
  * An implementation of {@link org.apache.isis.applib.services.linking.DeepLinkService}
  * for Wicket Viewer
  */
-@Singleton
+@Service
 public class DeepLinkServiceWicket implements DeepLinkService {
 
     @Inject private PageClassRegistry pageClassRegistry;
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
index 99afa47..e71ef81 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
@@ -20,11 +20,10 @@ package org.apache.isis.viewer.wicket.viewer.services;
 
 import java.util.Locale;
 
-import javax.inject.Singleton;
-
 import org.apache.wicket.Application;
 import org.apache.wicket.Session;
 import org.apache.wicket.request.cycle.RequestCycle;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.i18n.LocaleProvider;
 
@@ -32,7 +31,7 @@ import org.apache.isis.applib.services.i18n.LocaleProvider;
 /**
  * An implementation that provides the locale of the current session.
  */
-@Singleton
+@Service
 public class LocaleProviderWicket implements LocaleProvider {
 
     @Override
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
index 6de7d43..43bafa6 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/TranslationsResolverWicket.java
@@ -26,7 +26,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.regex.Pattern;
 
-import javax.inject.Singleton;
 import javax.servlet.ServletContext;
 
 import com.google.common.base.Charsets;
@@ -37,6 +36,8 @@ import com.google.common.io.CharSource;
 import com.google.common.io.Files;
 import com.google.common.io.Resources;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.i18n.TranslationsResolver;
 import org.apache.isis.commons.internal.collections._Lists;
@@ -49,7 +50,7 @@ import lombok.extern.log4j.Log4j2;
 /**
  * An implementation that reads from /WEB-INF/...
  */
-@Singleton @Log4j2
+@Service @Log4j2
 public class TranslationsResolverWicket implements TranslationsResolver {
 
     @Override
diff --git a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/settings/WicketViewerSettingsDefault.java b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/settings/WicketViewerSettingsDefault.java
index 58781ab..c304af7 100644
--- a/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/settings/WicketViewerSettingsDefault.java
+++ b/core/viewer-wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/settings/WicketViewerSettingsDefault.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.viewer.wicket.viewer.settings;
 
-import javax.inject.Singleton;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.config.IsisConfigurationLegacy;
@@ -27,7 +27,7 @@ import org.apache.isis.metamodel.facets.object.promptStyle.PromptStyleConfigurat
 import org.apache.isis.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 
-@Singleton
+@Service
 public class WicketViewerSettingsDefault implements WicketViewerSettings {
 
     private static final long serialVersionUID = 1L;
diff --git a/examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java b/examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java
index 8dbcece..b11191e 100644
--- a/examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java
+++ b/examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java
@@ -18,9 +18,9 @@
  */
 package domainapp.dom.jee;
 
-import javax.inject.Singleton;
+import org.springframework.stereotype.Service;
 
-@Singleton
+@Service
 public class JeeDemoService {
 
     public String getMessage() {
diff --git a/examples/apps/demo/src/main/java/domainapp/dom/types/blob/DemoBlobStore.java b/examples/apps/demo/src/main/java/domainapp/dom/types/blob/DemoBlobStore.java
index 4d7466f..776fa1b 100644
--- a/examples/apps/demo/src/main/java/domainapp/dom/types/blob/DemoBlobStore.java
+++ b/examples/apps/demo/src/main/java/domainapp/dom/types/blob/DemoBlobStore.java
@@ -21,16 +21,17 @@ package domainapp.dom.types.blob;
 import java.util.UUID;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 import javax.servlet.http.HttpSession;
 import javax.xml.bind.annotation.adapters.XmlAdapter;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.runtime.system.context.IsisContext;
 
 import lombok.val;
 
-@Singleton
+@Service
 public class DemoBlobStore {
 
     @Inject HttpSession session;
diff --git a/examples/apps/demo/src/main/java/domainapp/utils/LibraryPreloadingService.java b/examples/apps/demo/src/main/java/domainapp/utils/LibraryPreloadingService.java
index 859e62d..daee95f 100644
--- a/examples/apps/demo/src/main/java/domainapp/utils/LibraryPreloadingService.java
+++ b/examples/apps/demo/src/main/java/domainapp/utils/LibraryPreloadingService.java
@@ -19,7 +19,8 @@
 package domainapp.utils;
 
 import javax.annotation.PostConstruct;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.concurrent._ConcurrentContext;
 import org.apache.isis.commons.internal.concurrent._ConcurrentTaskList;
@@ -27,7 +28,7 @@ import org.apache.isis.extensions.asciidoc.AsciiDoc;
 
 import lombok.val;
 
-@Singleton
+@Service
 public class LibraryPreloadingService {
 
     @PostConstruct
diff --git a/examples/smoketests/src/main/java/org/apache/isis/testdomain/conf/Configuration_usingStereotypes.java b/examples/smoketests/src/main/java/org/apache/isis/testdomain/conf/Configuration_usingStereotypes.java
new file mode 100644
index 0000000..b1cd8bd
--- /dev/null
+++ b/examples/smoketests/src/main/java/org/apache/isis/testdomain/conf/Configuration_usingStereotypes.java
@@ -0,0 +1,15 @@
+package org.apache.isis.testdomain.conf;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+import org.apache.isis.testdomain.model.stereotypes.MyService;
+
+@Configuration
+@ComponentScan(
+        basePackageClasses= {               
+                MyService.class
+        })
+public class Configuration_usingStereotypes {
+
+}
diff --git a/examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java b/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/stereotypes/MyObject.java
similarity index 78%
copy from examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java
copy to examples/smoketests/src/main/java/org/apache/isis/testdomain/model/stereotypes/MyObject.java
index 8dbcece..18e1cf9 100644
--- a/examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java
+++ b/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/stereotypes/MyObject.java
@@ -16,15 +16,12 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package domainapp.dom.jee;
+package org.apache.isis.testdomain.model.stereotypes;
 
-import javax.inject.Singleton;
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
 
-@Singleton
-public class JeeDemoService {
-
-    public String getMessage() {
-        return "Hello World from JEE";
-    }
+@DomainObject(nature = Nature.INMEMORY_ENTITY)
+public class MyObject {
 
 }
diff --git a/examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java b/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/stereotypes/MyObject_mixin.java
similarity index 70%
copy from examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java
copy to examples/smoketests/src/main/java/org/apache/isis/testdomain/model/stereotypes/MyObject_mixin.java
index 8dbcece..74a6682 100644
--- a/examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java
+++ b/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/stereotypes/MyObject_mixin.java
@@ -16,15 +16,21 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package domainapp.dom.jee;
+package org.apache.isis.testdomain.model.stereotypes;
 
-import javax.inject.Singleton;
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.Mixin;
 
-@Singleton
-public class JeeDemoService {
+import lombok.RequiredArgsConstructor;
 
-    public String getMessage() {
-        return "Hello World from JEE";
+@Mixin @RequiredArgsConstructor
+public class MyObject_mixin {
+    
+    private final MyObject holder;
+    
+    @Action
+    public MyObject $$() {
+        return holder;
     }
 
 }
diff --git a/examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java b/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/stereotypes/MyService.java
similarity index 82%
copy from examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java
copy to examples/smoketests/src/main/java/org/apache/isis/testdomain/model/stereotypes/MyService.java
index 8dbcece..4998fcf 100644
--- a/examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java
+++ b/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/stereotypes/MyService.java
@@ -16,15 +16,11 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package domainapp.dom.jee;
+package org.apache.isis.testdomain.model.stereotypes;
 
-import javax.inject.Singleton;
+import org.apache.isis.applib.annotation.DomainService;
 
-@Singleton
-public class JeeDemoService {
-
-    public String getMessage() {
-        return "Hello World from JEE";
-    }
+@DomainService
+public class MyService {
 
 }
diff --git a/examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java b/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/stereotypes/MyView.java
similarity index 82%
copy from examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java
copy to examples/smoketests/src/main/java/org/apache/isis/testdomain/model/stereotypes/MyView.java
index 8dbcece..6f191b1 100644
--- a/examples/apps/demo/src/main/java/domainapp/dom/jee/JeeDemoService.java
+++ b/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/stereotypes/MyView.java
@@ -16,15 +16,11 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package domainapp.dom.jee;
+package org.apache.isis.testdomain.model.stereotypes;
 
-import javax.inject.Singleton;
+import org.apache.isis.applib.annotation.ViewModel;
 
-@Singleton
-public class JeeDemoService {
-
-    public String getMessage() {
-        return "Hello World from JEE";
-    }
+@ViewModel
+public class MyView {
 
 }
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/auditing/AuditerServiceTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/auditing/AuditerServiceTest.java
index a478f24..665215e 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/auditing/AuditerServiceTest.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/auditing/AuditerServiceTest.java
@@ -22,11 +22,11 @@ import java.sql.Timestamp;
 import java.util.UUID;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.stereotype.Service;
 import org.springframework.test.context.TestPropertySource;
 
 import org.apache.isis.applib.services.audit.AuditerService;
@@ -126,7 +126,7 @@ class AuditerServiceTest {
 
     // -- HELPER
 
-    @Singleton @Log4j2
+    @Service @Log4j2
     public static class AuditerServiceProbe implements AuditerService {
 
         private StringBuilder history = new StringBuilder();
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
new file mode 100644
index 0000000..18682ee
--- /dev/null
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java
@@ -0,0 +1,150 @@
+/*
+ *  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.testdomain.bootstrapping;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.inject.Inject;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+import org.springframework.test.context.TestPropertySource;
+
+import org.apache.isis.commons.internal.ioc.spring._Spring;
+import org.apache.isis.config.IsisPresets;
+import org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring;
+import org.apache.isis.config.registry.IsisBeanTypeRegistry;
+import org.apache.isis.testdomain.Incubating;
+//import org.apache.isis.testdomain.Incubating;
+import org.apache.isis.testdomain.Smoketest;
+import org.apache.isis.testdomain.conf.Configuration_usingStereotypes;
+import org.apache.isis.testdomain.model.stereotypes.MyObject;
+import org.apache.isis.testdomain.model.stereotypes.MyObject_mixin;
+import org.apache.isis.testdomain.model.stereotypes.MyService;
+import org.apache.isis.testdomain.model.stereotypes.MyView;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import lombok.val;
+
+@Smoketest
+@SpringBootTest(
+        classes = { 
+                //AutoConfigurationTest.BeanPostProcessor_forTesting.class,
+                IsisBeanFactoryPostProcessorForSpring.class,
+                Configuration_usingStereotypes.class
+        },
+        properties = {
+                "logging.config=log4j2-test.xml",
+                // "isis.reflector.introspector.parallelize=false",
+                // "logging.level.org.apache.isis.metamodel.specloader.specimpl.ObjectSpecificationAbstract=TRACE"
+        })
+@TestPropertySource({
+    IsisPresets.DebugDiscovery
+})
+@Incubating("under construction, not tested with surefire yet")
+class AutoConfigurationTest {
+    
+    @Inject private ApplicationContext applicationContext;
+
+    //XXX for debugging and experimenting
+    @Component
+    static class BeanPostProcessor_forTesting implements BeanPostProcessor {
+
+        // simply return the instantiated bean as-is
+        @Override
+        public Object postProcessBeforeInitialization(Object bean, String beanName) {
+            return bean; // we could potentially return any object reference here...
+        }
+
+        @Override
+        public Object postProcessAfterInitialization(Object bean, String beanName) {
+            System.out.println("Bean '" + beanName + "' created : " + bean.toString());
+            return bean;
+        }
+    }
+    
+    @BeforeEach
+    void beforeEach() {
+        assertNotNull(applicationContext);
+        if(!_Spring.isContextAvailable()) {
+            _Spring.init(applicationContext);
+        }
+    }
+    
+    @Test
+    void domainObjects_shouldBeDiscovered() {
+
+        //TODO  bad test, relying on implementation details
+        // clearly IsisBeanTypeRegistry needs refactoring!
+        val registry = IsisBeanTypeRegistry.current();
+        
+        val discoveredTypes = registry.streamAndClearInbox()
+        .map(Map.Entry::getKey)
+        .collect(Collectors.toSet());
+        discoveredTypes.addAll(registry.getEntityTypes());
+        discoveredTypes.addAll(registry.getBeanTypes());
+        
+        for(val cls : nonManaged()) {
+            assertTrue(discoveredTypes.contains(cls));
+        }
+        
+        //TODO @DomainObject with NATURE_NOT_SPECIFIED is getting ignored, is this correct behavior?
+        
+    }
+
+    @Test
+    void domainObjects_shouldNotBeManaged() {
+        
+        for(val cls : nonManaged()) {
+            assertThrows(NoSuchBeanDefinitionException.class, ()->{
+                applicationContext.getBean(cls);
+            });    
+        }
+        
+    }
+    
+    @Test
+    void domainServices_shouldBeManaged() {
+        
+        val myService = applicationContext.getBean(MyService.class);
+        assertNotNull(myService);
+        assertNotNull(_Spring.getSingletonElseFail(MyService.class));
+        
+    }
+    
+    
+    // we don't want those managed by Spring
+    private static Class<?>[] nonManaged() {
+        val nonManaged = new Class<?>[] {MyObject.class, MyObject_mixin.class, MyView.class};
+        return nonManaged;
+    }
+
+}
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/JdoBootstrappingTest_usingFixtures.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/JdoBootstrappingTest_usingFixtures.java
index bbb5451..517d0c2 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/JdoBootstrappingTest_usingFixtures.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/JdoBootstrappingTest_usingFixtures.java
@@ -27,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.config.IsisPresets;
+import org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring;
 import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts;
 import org.apache.isis.testdomain.Smoketest;
 import org.apache.isis.testdomain.conf.Configuration_usingJdo;
@@ -41,6 +42,7 @@ import lombok.val;
 @Smoketest
 @SpringBootTest(
         classes = { 
+                IsisBeanFactoryPostProcessorForSpring.class,
                 Configuration_usingJdo.class, 
         }, 
         properties = {
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/SpringServiceProvisioningTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/SpringServiceProvisioningTest.java
index b618d3f..2709ac9 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/SpringServiceProvisioningTest.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/SpringServiceProvisioningTest.java
@@ -25,10 +25,12 @@ import java.util.stream.Collectors;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.TestPropertySource;
 
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.ioc.BeanAdapter;
 import org.apache.isis.commons.internal.resources._Resources;
+import org.apache.isis.config.IsisPresets;
 import org.apache.isis.runtime.system.context.IsisContext;
 //import org.apache.isis.testdomain.Incubating;
 import org.apache.isis.testdomain.Smoketest;
@@ -51,6 +53,9 @@ import lombok.val;
                 // "isis.reflector.introspector.parallelize=false",
                 // "logging.level.org.apache.isis.metamodel.specloader.specimpl.ObjectSpecificationAbstract=TRACE"
         })
+@TestPropertySource({
+    IsisPresets.DebugDiscovery
+})
 //@Incubating("with development work on 'v2' the reference list of services constantly changes")
 class SpringServiceProvisioningTest {
 
@@ -60,7 +65,7 @@ class SpringServiceProvisioningTest {
     }
 
     @Test
-    void builtInServicesShouldBeSetUp() throws IOException {
+    void builtInServices_shouldBeSetUp() throws IOException {
 
         val serviceRegistry = IsisContext.getServiceRegistry();
         val managedServices = serviceRegistry.streamRegisteredBeans()
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/eventhandling/GenericEventPublishingTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/eventhandling/GenericEventPublishingTest.java
index 55b70ab..8f2c777 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/eventhandling/GenericEventPublishingTest.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/eventhandling/GenericEventPublishingTest.java
@@ -20,12 +20,12 @@ package org.apache.isis.testdomain.eventhandling;
 
 import javax.enterprise.event.Observes;
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.runtime.services.eventbus.EventBusServiceSpring;
@@ -65,7 +65,7 @@ class GenericEventPublishingTest {
         // no specific config required
     }
 
-    @Singleton
+    @Service
     public static class TestPublisher {
 
         @Inject EventBusService eventBusService;
@@ -76,7 +76,7 @@ class GenericEventPublishingTest {
 
     }
 
-    @Singleton 
+    @Service 
     public static class TestListener {
 
         @Getter
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/eventhandling/SpringEventPublishingTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/eventhandling/SpringEventPublishingTest.java
index 1ce2eba..53e3ee4 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/eventhandling/SpringEventPublishingTest.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/eventhandling/SpringEventPublishingTest.java
@@ -20,7 +20,6 @@ package org.apache.isis.testdomain.eventhandling;
 
 import javax.enterprise.event.Event;
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -28,6 +27,7 @@ import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.ioc.spring._Spring;
 
@@ -70,7 +70,7 @@ class SpringEventPublishingTest {
 
     }
 
-    @Singleton
+    @Service
     public static class TestPublisher {
 
         @Inject
@@ -82,7 +82,7 @@ class SpringEventPublishingTest {
 
     }
 
-    @Singleton
+    @Service
     public static class TestListener {
 
         @Getter
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/publishing/PublisherServiceTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/publishing/PublisherServiceTest.java
index 6f13596..81a3c37 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/publishing/PublisherServiceTest.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/publishing/PublisherServiceTest.java
@@ -27,6 +27,7 @@ import org.junit.jupiter.api.Order;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestMethodOrder;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.background.BackgroundService;
 import org.apache.isis.applib.services.iactn.Interaction.Execution;
@@ -121,7 +122,7 @@ class PublisherServiceTest {
 
     // -- HELPER
 
-    @Singleton
+    @Service
     public static class PublisherServiceProbe implements PublisherService {
 
         private StringBuilder history = new StringBuilder();
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/transactions/TransactionRollbackTest_withTransactional.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/transactions/TransactionRollbackTest_usingTransactional.java
similarity index 98%
rename from examples/smoketests/src/test/java/org/apache/isis/testdomain/transactions/TransactionRollbackTest_withTransactional.java
rename to examples/smoketests/src/test/java/org/apache/isis/testdomain/transactions/TransactionRollbackTest_usingTransactional.java
index 2145dd5..06608fb 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/transactions/TransactionRollbackTest_withTransactional.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/transactions/TransactionRollbackTest_usingTransactional.java
@@ -54,7 +54,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
         })
 @Transactional
 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
-class TransactionRollbackTest_withTransactional {
+class TransactionRollbackTest_usingTransactional {
     
     @Inject private FixtureScripts fixtureScripts;
     @Inject private RepositoryService repository;
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesEventService.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesEventService.java
index 4ab1068..422cc56 100644
--- a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesEventService.java
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesEventService.java
@@ -20,10 +20,10 @@ package org.apache.isis.extensions.fixtures;
 
 import javax.enterprise.event.Event;
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.ioc.spring._Spring;
 import org.apache.isis.extensions.fixtures.events.FixturesInstalledEvent;
@@ -32,7 +32,7 @@ import org.apache.isis.extensions.fixtures.events.FixturesInstallingEvent;
 /**
  * @since 2.0
  */
-@Singleton
+@Service
 public class FixturesEventService {
 
     @Inject Event<FixturesInstallingEvent> fixturesInstallingEvents;
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecyleService.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecyleService.java
index 2351327..63b02bd 100644
--- a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecyleService.java
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/FixturesLifecyleService.java
@@ -21,14 +21,15 @@ package org.apache.isis.extensions.fixtures;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
-import javax.inject.Singleton;
+
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.extensions.fixtures.legacy.FixtureClock;
 import org.apache.isis.runtime.system.session.IsisSessionFactory;
 
-@Singleton
+@Service
 public class FixturesLifecyleService {
 
     @Inject IsisSessionFactory isisSessionFactory; // depends on  
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/ExecutionParametersService.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/ExecutionParametersService.java
index fce4eb2..a6d65b2 100644
--- a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/ExecutionParametersService.java
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/ExecutionParametersService.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.extensions.fixtures.fixturescripts;
 
-import javax.inject.Singleton;
+import org.springframework.stereotype.Service;
 
 
 /**
@@ -31,7 +31,7 @@ import javax.inject.Singleton;
  *     need refinement in the future).
  * </p>
  */
-@Singleton
+@Service
 public class ExecutionParametersService {
 
     public ExecutionParameters newExecutionParameters(final String parameters) {
diff --git a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlInternal.java b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlInternal.java
index d5f1114..f62fde9 100644
--- a/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlInternal.java
+++ b/extensions/fixtures/src/main/java/org/apache/isis/extensions/fixtures/legacy/queryresultscache/QueryResultsCacheControlInternal.java
@@ -18,9 +18,8 @@
  */
 package org.apache.isis.extensions.fixtures.legacy.queryresultscache;
 
-import javax.inject.Singleton;
-
 import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.queryresultscache.QueryResultCacheControl;
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
@@ -31,7 +30,7 @@ import org.apache.isis.extensions.fixtures.events.FixturesInstallingEvent;
 /**
  * In separate class because {@link QueryResultsCache} itself is request-scoped
  */
-@Singleton
+@Service
 public class QueryResultsCacheControlInternal implements QueryResultCacheControl {
 
     @EventListener(FixturesInstallingEvent.class)
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/SeedSecurityModuleService.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/SeedSecurityModuleService.java
index 0db45e7..adc590d 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/SeedSecurityModuleService.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/SeedSecurityModuleService.java
@@ -22,11 +22,13 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import org.springframework.stereotype.Service;
+
 import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts;
 
 import lombok.extern.log4j.Log4j2;
 
-@Singleton @Log4j2
+@Service @Log4j2
 public class SeedSecurityModuleService {
 
     @Inject FixtureScripts fixtureScripts;