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 2020/09/18 13:50:29 UTC

[isis] 03/03: ISIS-2435: Commons: cleanup IoC abstraction classes

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

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

commit a4f3656f14ab23ca36c8f469a8b195d9b1781b10
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Sep 18 15:50:13 2020 +0200

    ISIS-2435: Commons: cleanup IoC abstraction classes
---
 .../applib/services/registry/ServiceRegistry.java  |  10 +-
 .../ioc/{IocContainer.java => _IocContainer.java}  |  32 ++-
 ...tainerSpring.java => _IocContainer_Spring.java} |  68 ++++--
 ...edBeanAdapter.java => _ManagedBeanAdapter.java} |   2 +-
 ...Spring.java => _ManagedBeanAdapter_Spring.java} |   9 +-
 .../apache/isis/commons/internal/ioc/_Spring.java  |  93 +++++++++
 .../commons/internal/ioc/spring/EventSpring.java   |  75 -------
 .../isis/commons/internal/ioc/spring/_Spring.java  | 228 ---------------------
 .../config/environment/IsisSystemEnvironment.java  |   9 +-
 .../_testing/ServiceRegistry_forTesting.java       |  22 +-
 .../context/MetaModelContext_usingIoc.java         |  10 +-
 .../load/ObjectLoader_builtinHandlers.java         |   4 +-
 .../events/MetamodelEventSupport_Spring.java       |   2 +-
 .../services/registry/ServiceRegistryDefault.java  |  16 +-
 .../SpringServiceProvisioningTest.java             |   6 +-
 .../eventhandling/SpringEventPublishingTest.java   |   2 +-
 16 files changed, 211 insertions(+), 377 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/registry/ServiceRegistry.java b/api/applib/src/main/java/org/apache/isis/applib/services/registry/ServiceRegistry.java
index e94e27e..29d8f52 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/registry/ServiceRegistry.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/registry/ServiceRegistry.java
@@ -31,7 +31,7 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.base._Reduction;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
+import org.apache.isis.commons.internal.ioc._ManagedBeanAdapter;
 import org.apache.isis.commons.internal.reflection._Reflect;
 
 import lombok.val;
@@ -76,7 +76,7 @@ public interface ServiceRegistry {
      * Streams all registered bean adapters implementing the requested type.
      */
     // tag::refguide[]
-    default Stream<ManagedBeanAdapter> streamRegisteredBeansOfType(Class<?> requiredType) {
+    default Stream<_ManagedBeanAdapter> streamRegisteredBeansOfType(Class<?> requiredType) {
         // end::refguide[]
 
         return streamRegisteredBeans()
@@ -91,7 +91,7 @@ public interface ServiceRegistry {
      * Returns all bean adapters that have been registered.
      */
     // tag::refguide[]
-    Stream<ManagedBeanAdapter> streamRegisteredBeans();
+    Stream<_ManagedBeanAdapter> streamRegisteredBeans();
 
     // end::refguide[]
     /**
@@ -100,7 +100,7 @@ public interface ServiceRegistry {
      * @param id - corresponds to the ObjectSpecificationId of the bean's type
      */
     // tag::refguide[]
-    Optional<ManagedBeanAdapter> lookupRegisteredBeanById(String id);
+    Optional<_ManagedBeanAdapter> lookupRegisteredBeanById(String id);
 
     // end::refguide[]
     /**
@@ -109,7 +109,7 @@ public interface ServiceRegistry {
      * @param id - corresponds to the ObjectSpecificationId of the bean's type
      */
     // tag::refguide[]
-    default ManagedBeanAdapter lookupRegisteredBeanByIdElseFail(String id) {
+    default _ManagedBeanAdapter lookupRegisteredBeanByIdElseFail(String id) {
         return lookupRegisteredBeanById(id).orElseThrow(
                 ()->_Exceptions.unrecoverable(
                         "Failed to lookup BeanAdapter by id '" + id + "'"));
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/ioc/IocContainer.java b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer.java
similarity index 79%
rename from commons/src/main/java/org/apache/isis/commons/internal/ioc/IocContainer.java
rename to commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer.java
index 980a113..d73beb4 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/ioc/IocContainer.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer.java
@@ -21,12 +21,13 @@ package org.apache.isis.commons.internal.ioc;
 import java.lang.annotation.Annotation;
 import java.util.NoSuchElementException;
 import java.util.Optional;
-import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
 
+import org.springframework.context.ApplicationContext;
+
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.exceptions.IsisException;
 import org.apache.isis.commons.internal.base._With;
@@ -35,13 +36,18 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
 import lombok.val;
 
 /**
- * 
- * @since 2.0
+ * <h1>- internal use only -</h1>
+ * <p>
+ * Framework internal IoC Container support.
+ * <p>
+ * <b>WARNING</b>: Do <b>NOT</b> use any of the classes provided by this package! <br/>
+ * These may be changed or removed without notice!
  *
+ * @since 2.0
  */
-public interface IocContainer {
+public interface _IocContainer {
 
-    Stream<ManagedBeanAdapter> streamAllBeans();
+    Stream<_ManagedBeanAdapter> streamAllBeans();
 
     Optional<?> lookupById(final String id);
 
@@ -57,7 +63,13 @@ public interface IocContainer {
     
     <T> Can<T> select(Class<T> requiredType);
     
-    <T> Can<T> select(Class<T> requiredType, Set<Annotation> qualifiersRequired);
+    /**
+     * @param <T>
+     * @param requiredType
+     * @param qualifiersRequired - if contains annotations, that are not qualifiers, these are just ignored
+     * @return
+     */
+    <T> Can<T> select(Class<T> requiredType, Annotation[] qualifiersRequired);
 
     /**
      * @return IoC managed singleton wrapped in an Optional
@@ -95,6 +107,14 @@ public interface IocContainer {
 
     }
 
+    // -- FACTORIES
+    
+    static _IocContainer spring(ApplicationContext springContext) {
+        return _IocContainer_Spring.of(springContext);
+    }
+
+    
+
 
 
 }
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/IocContainerSpring.java b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer_Spring.java
similarity index 65%
rename from commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/IocContainerSpring.java
rename to commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer_Spring.java
index cfe9a8c..400c08b 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/IocContainerSpring.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer_Spring.java
@@ -16,42 +16,43 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.commons.internal.ioc.spring;
+package org.apache.isis.commons.internal.ioc;
 
 import java.lang.annotation.Annotation;
+import java.util.Collections;
 import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
+import javax.inject.Qualifier;
 
 import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Primary;
 import org.springframework.core.ResolvableType;
 
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._NullSafe;
-import org.apache.isis.commons.internal.base._With;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.commons.internal.ioc.IocContainer;
-import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 /**
- * 
+ * Spring specific implementation of _IocContainer (package private)
  * @since 2.0
  *
  */
 @RequiredArgsConstructor(staticName = "of")
-public class IocContainerSpring implements IocContainer {
+final class _IocContainer_Spring implements _IocContainer {
     
     @NonNull private final ApplicationContext springContext;
 
     @Override
-    public <T> Optional<T> get(Class<T> requiredType) {
+    public <T> Optional<T> get(final @NonNull Class<T> requiredType) {
         val provider = springContext.getBeanProvider(requiredType);
         try {
             return Optional.ofNullable(provider.getIfUnique());
@@ -61,7 +62,7 @@ public class IocContainerSpring implements IocContainer {
     }
     
     @Override
-    public Stream<ManagedBeanAdapter> streamAllBeans() {
+    public Stream<_ManagedBeanAdapter> streamAllBeans() {
 
         val context = springContext;
 
@@ -76,12 +77,10 @@ public class IocContainerSpring implements IocContainer {
                     val resolvableType = ResolvableType.forClass(type);
                     val bean = context.getBeanProvider(resolvableType);
 
-                    val beanAdapter = BeanAdapterSpring.of(id, type, bean);
+                    val beanAdapter = _ManagedBeanAdapter_Spring.of(id, type, bean);
 
                     return beanAdapter;
                 });
-
-
     }
 
     @Override
@@ -92,23 +91,20 @@ public class IocContainerSpring implements IocContainer {
     }
 
     @Override
-    public <T> Can<T> select(final Class<T> requiredType) {
-        _With.requires(requiredType, "requiredType");
-
+    public <T> Can<T> select(final @NonNull Class<T> requiredType) {
         val allMatchingBeans = springContext.getBeanProvider(requiredType)
                 .orderedStream()
                 .collect(Can.toCan());
-        
         return allMatchingBeans;
     }
 
     @Override
     public <T> Can<T> select(
-            final Class<T> requiredType, 
-            @Nullable Set<Annotation> qualifiersRequired) {
-
-        _With.requires(requiredType, "requiredType");
+            final @NonNull Class<T> requiredType, 
+            final @Nullable Annotation[] qualifiers) {
 
+        val qualifiersRequired = filterQualifiers(qualifiers);
+        
         if(_NullSafe.isEmpty(qualifiersRequired)) {
             
             val allMatchingBeans = springContext.getBeanProvider(requiredType)
@@ -129,5 +125,39 @@ public class IocContainerSpring implements IocContainer {
         return allMatchingBeans;
         
     }
+    
+    // -- QUALIFIER PROCESSING
+
+    /**
+     * Filters the input array into a collection, such that only annotations are retained, 
+     * that are valid qualifiers for CDI.
+     * @param annotations
+     * @return non-null
+     */
+    private static Set<Annotation> filterQualifiers(@Nullable final Annotation[] annotations) {
+        if(_NullSafe.isEmpty(annotations)) {
+            return Collections.emptySet();
+        }
+        return _NullSafe.stream(annotations)
+                .filter(_IocContainer_Spring::isGenericQualifier)
+                .collect(Collectors.toSet());
+    }
+    
+    /**
+     * @param annotation
+     * @return whether or not the annotation is a valid qualifier for Spring
+     */
+    private static boolean isGenericQualifier(Annotation annotation) {
+        if(annotation==null) {
+            return false;
+        }
+        if(annotation.annotationType().getAnnotationsByType(Qualifier.class).length>0) {
+            return true;
+        }
+        if(annotation.annotationType().equals(Primary.class)) {
+            return true;
+        }
+        return false;
+    }
 
 }
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/ioc/ManagedBeanAdapter.java b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_ManagedBeanAdapter.java
similarity index 96%
rename from commons/src/main/java/org/apache/isis/commons/internal/ioc/ManagedBeanAdapter.java
rename to commons/src/main/java/org/apache/isis/commons/internal/ioc/_ManagedBeanAdapter.java
index 42ac32b..c2532fc 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/ioc/ManagedBeanAdapter.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_ManagedBeanAdapter.java
@@ -23,7 +23,7 @@ import org.apache.isis.commons.collections.Can;
 /**
  * @since 2.0
  */
-public interface ManagedBeanAdapter { 
+public interface _ManagedBeanAdapter { 
 
     String getId();
     Can<?> getInstance();
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/BeanAdapterSpring.java b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_ManagedBeanAdapter_Spring.java
similarity index 89%
rename from commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/BeanAdapterSpring.java
rename to commons/src/main/java/org/apache/isis/commons/internal/ioc/_ManagedBeanAdapter_Spring.java
index 769a3b3..c7be838 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/BeanAdapterSpring.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_ManagedBeanAdapter_Spring.java
@@ -16,18 +16,17 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.commons.internal.ioc.spring;
+package org.apache.isis.commons.internal.ioc;
 
 import org.springframework.beans.factory.ObjectProvider;
 
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 
 import lombok.Value;
 import lombok.val;
 
 @Value(staticConstructor="of")
-final class BeanAdapterSpring implements ManagedBeanAdapter {
+final class _ManagedBeanAdapter_Spring implements _ManagedBeanAdapter {
 
     private final String id;
     private final Class<?> beanClass;
@@ -46,7 +45,5 @@ final class BeanAdapterSpring implements ManagedBeanAdapter {
                 .map(Object::getClass)
                 .anyMatch(requiredType::isAssignableFrom);
     }
-
-
-
+    
 }
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/ioc/_Spring.java b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_Spring.java
new file mode 100644
index 0000000..a7ae96a
--- /dev/null
+++ b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_Spring.java
@@ -0,0 +1,93 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.commons.internal.ioc;
+
+import java.lang.annotation.Annotation;
+import java.util.concurrent.CompletionStage;
+
+import javax.enterprise.event.Event;
+import javax.enterprise.event.NotificationOptions;
+import javax.enterprise.util.TypeLiteral;
+
+import org.springframework.context.ApplicationEventPublisher;
+
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.log4j.Log4j2;
+
+/**
+ * <h1>- internal use only -</h1>
+ * <p>
+ * Framework internal Spring support.
+ * <p>
+ * <b>WARNING</b>: Do <b>NOT</b> use any of the classes provided by this package! <br/>
+ * These may be changed or removed without notice!
+ *
+ * @since 2.0
+ */
+public final class _Spring {
+
+    public static <T> Event<T> event(ApplicationEventPublisher publisher) {
+        return new EventSpring<T>(publisher);
+    }
+
+    @RequiredArgsConstructor
+    @Log4j2
+    private static final class EventSpring<T> implements Event<T> {
+
+        private final ApplicationEventPublisher publisher;
+
+        @Override
+        public void fire(T event) {
+
+            if(log.isDebugEnabled()) {
+                log.debug("{} fire({} ... {})",
+                        Thread.currentThread().getName(),
+                        event.getClass().getSimpleName(), 
+                        event.toString());
+            }
+
+            publisher.publishEvent(event);
+        }
+
+        @Override
+        public <U extends T> CompletionStage<U> fireAsync(U event) {
+            throw _Exceptions.notImplemented();
+        }
+
+        @Override
+        public <U extends T> CompletionStage<U> fireAsync(U event, NotificationOptions options) {
+            throw _Exceptions.notImplemented();    }
+
+        @Override
+        public Event<T> select(Annotation... qualifiers) {
+            throw _Exceptions.notImplemented();    }
+
+        @Override
+        public <U extends T> Event<U> select(Class<U> subtype, Annotation... qualifiers) {
+            throw _Exceptions.notImplemented();    }
+
+        @Override
+        public <U extends T> Event<U> select(TypeLiteral<U> subtype, Annotation... qualifiers) {
+            throw _Exceptions.notImplemented();    }
+
+    }
+    
+}
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/EventSpring.java b/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/EventSpring.java
deleted file mode 100644
index a7733c1..0000000
--- a/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/EventSpring.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.commons.internal.ioc.spring;
-
-import java.lang.annotation.Annotation;
-import java.util.concurrent.CompletionStage;
-
-import javax.enterprise.event.Event;
-import javax.enterprise.event.NotificationOptions;
-import javax.enterprise.util.TypeLiteral;
-
-import org.springframework.context.ApplicationEventPublisher;
-
-import org.apache.isis.commons.internal.exceptions._Exceptions;
-
-import lombok.RequiredArgsConstructor;
-import lombok.extern.log4j.Log4j2;
-
-@RequiredArgsConstructor
-@Log4j2
-class EventSpring<T> implements Event<T> {
-
-    private final ApplicationEventPublisher publisher;
-
-    @Override
-    public void fire(T event) {
-
-        if(log.isDebugEnabled()) {
-            log.debug("{} fire({} ... {})",
-                    Thread.currentThread().getName(),
-                    event.getClass().getSimpleName(), 
-                    event.toString());
-        }
-
-        publisher.publishEvent(event);
-    }
-
-    @Override
-    public <U extends T> CompletionStage<U> fireAsync(U event) {
-        throw _Exceptions.notImplemented();
-    }
-
-    @Override
-    public <U extends T> CompletionStage<U> fireAsync(U event, NotificationOptions options) {
-        throw _Exceptions.notImplemented();    }
-
-    @Override
-    public Event<T> select(Annotation... qualifiers) {
-        throw _Exceptions.notImplemented();    }
-
-    @Override
-    public <U extends T> Event<U> select(Class<U> subtype, Annotation... qualifiers) {
-        throw _Exceptions.notImplemented();    }
-
-    @Override
-    public <U extends T> Event<U> select(TypeLiteral<U> subtype, Annotation... qualifiers) {
-        throw _Exceptions.notImplemented();    }
-
-}
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/_Spring.java b/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/_Spring.java
deleted file mode 100644
index 224a121..0000000
--- a/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/_Spring.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.commons.internal.ioc.spring;
-
-import java.lang.annotation.Annotation;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import javax.annotation.Nullable;
-import javax.enterprise.event.Event;
-import javax.inject.Qualifier;
-
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.annotation.Primary;
-import org.springframework.core.env.ConfigurableEnvironment;
-import org.springframework.core.env.EnumerablePropertySource;
-import org.springframework.core.env.MapPropertySource;
-import org.springframework.core.env.PropertySource;
-
-import org.apache.isis.commons.internal.base._NullSafe;
-import org.apache.isis.commons.internal.collections._Maps;
-
-import static org.apache.isis.commons.internal.base._NullSafe.stream;
-
-import lombok.val;
-import lombok.extern.log4j.Log4j2;
-
-/**
- * <h1>- internal use only -</h1>
- * <p>
- * Framework internal Spring support.
- * <p>
- * <b>WARNING</b>: Do <b>NOT</b> use any of the classes provided by this package! <br/>
- * These may be changed or removed without notice!
- *
- * @since 2.0
- */
-@Log4j2
-public class _Spring {
-
-//    public static boolean isContextAvailable() {
-//        return _Context.getIfAny(ApplicationContext.class)!=null;
-//    }
-//
-//    public static void init(ApplicationContext context) {
-//        _Context.putSingleton(ApplicationContext.class, context);
-//    }
-//    
-//    /** JUnit support */
-//    public static void reinit(ApplicationContext applicationContext) {
-//        _Context.remove(ApplicationContext.class);
-//        _Spring.init(applicationContext);
-//    }
-
-//    public static ApplicationContext context() {
-//        return _Context.getElseFail(ApplicationContext.class);
-//    }
-
-//    public static <T> Bin<T> select(final Class<T> requiredType) {
-//        requires(requiredType, "requiredType");
-//
-//        val allMatchingBeans = context().getBeanProvider(requiredType).orderedStream();
-//        return Bin.ofStream(allMatchingBeans);
-//    }
-//
-//    public static <T> Bin<T> select(
-//            final Class<T> requiredType, 
-//            @Nullable Set<Annotation> qualifiersRequired) {
-//
-//        requires(requiredType, "requiredType");
-//
-//        val allMatchingBeans = context().getBeanProvider(requiredType)
-//                .orderedStream();
-//
-//        if(_NullSafe.isEmpty(qualifiersRequired)) {
-//            return Bin.ofStream(allMatchingBeans);
-//        }
-//
-//        final Predicate<T> hasAllQualifiers = t -> {
-//            val qualifiersPresent = _Sets.of(t.getClass().getAnnotations());
-//            return qualifiersPresent.containsAll(qualifiersRequired);
-//        };
-//
-//        return Bin.ofStream(allMatchingBeans
-//                .filter(hasAllQualifiers));
-//    }
-
-
-
-//    /**
-//     * @return Spring managed singleton wrapped in an Optional
-//     */
-//    public static <T> Optional<T> getSingleton(@Nullable Class<T> type) {
-//        if(type==null) {
-//            return Optional.empty();
-//        }
-//        return select(type).getSingleton();
-//    }
-//
-//    /**
-//     * @return Spring managed singleton
-//     * @throws NoSuchElementException - if the singleton is not resolvable
-//     */
-//    public static <T> T getSingletonElseFail(@Nullable Class<T> type) {
-//        return getSingleton(type)
-//                .orElseThrow(()->_Exceptions.noSuchElement("Cannot resolve singleton '%s'", type));
-//
-//    }
-
-    public static <T> Event<T> event(ApplicationEventPublisher publisher) {
-        return new EventSpring<T>(publisher);
-    }
-
-    // -- QUALIFIER PROCESSING
-
-    /**
-     * Filters the input array into a collection, such that only annotations are retained, 
-     * that are valid qualifiers for CDI.
-     * @param annotations
-     * @return non-null
-     */
-    public static Set<Annotation> filterQualifiers(@Nullable final Annotation[] annotations) {
-        if(_NullSafe.isEmpty(annotations)) {
-            return Collections.emptySet();
-        }
-        return _NullSafe.stream(annotations)
-                .filter(_Spring::isGenericQualifier)
-                .collect(Collectors.toSet());
-    }
-
-    /**
-     * @param annotation
-     * @return whether or not the annotation is a valid qualifier for Spring
-     */
-    public static boolean isGenericQualifier(Annotation annotation) {
-        if(annotation==null) {
-            return false;
-        }
-        if(annotation.annotationType().getAnnotationsByType(Qualifier.class).length>0) {
-            return true;
-        }
-        if(annotation.annotationType().equals(Primary.class)) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Returns a key/value pair copy of Spring's environment
-     * @see {@linkplain <a href="https://jira.spring.io/browse/SPR-10241">https://jira.spring.io/browse/SPR-10241</a>}
-     * @param configurableEnvironment
-     * @deprecated alternative solution {@linkplain <a href="https://stackoverflow.com/a/53950574/56880">stack-overflow</a>}
-     */
-    public static Map<String, String> copySpringEnvironmentToMap(
-            ConfigurableEnvironment configurableEnvironment) {
-
-        val map = _Maps.<String, String> newHashMap();
-
-        for(Iterator<PropertySource<?>> it = configurableEnvironment.getPropertySources().iterator(); it.hasNext(); ) {
-            val propertySource = it.next();
-            if (propertySource instanceof MapPropertySource) {
-
-                val mapPropertySource = (MapPropertySource) propertySource;
-
-                mapPropertySource.getSource().forEach((key, value) ->
-                putIfNewValuePresent_warnIfKeyAlreadyExists(key, value, map));
-
-            } else if(propertySource instanceof EnumerablePropertySource) {
-
-                val enumPropertySource = (EnumerablePropertySource<?>) propertySource;
-
-                for (String key : enumPropertySource.getPropertyNames()) {
-                    val value = enumPropertySource.getProperty(key);
-
-                    putIfNewValuePresent_warnIfKeyAlreadyExists(key, value, map);
-                }
-
-            } else {
-
-                log.warn("Ignoring PropertySource type '{}', "
-                        + "because we don't know how to iterate over its key/value pairs.",
-                        propertySource);
-            }
-
-        }
-
-        return map;
-    }
-
-    // -- HELPER
-
-    private static void putIfNewValuePresent_warnIfKeyAlreadyExists (
-            String key,
-            Object newValue,
-            Map<String, String> dest) {
-
-        if(newValue==null) {
-            return;
-        }
-        val oldValue = dest.put(key, newValue.toString());
-        if(oldValue!=null) {
-            log.warn("overriding exising config key {} with value {} -> {}", key, oldValue, newValue);    
-        }
-
-    }
-
-    
-
-}
diff --git a/core/config/src/main/java/org/apache/isis/core/config/environment/IsisSystemEnvironment.java b/core/config/src/main/java/org/apache/isis/core/config/environment/IsisSystemEnvironment.java
index 22bdd3d..3f9b33f 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/environment/IsisSystemEnvironment.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/environment/IsisSystemEnvironment.java
@@ -35,8 +35,7 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.commons.internal.ioc.IocContainer;
-import org.apache.isis.commons.internal.ioc.spring.IocContainerSpring;
+import org.apache.isis.commons.internal.ioc._IocContainer;
 
 import lombok.Getter;
 import lombok.val;
@@ -62,14 +61,14 @@ public class IsisSystemEnvironment {
     
     @Inject private ApplicationContext springContext;
     
-    @Getter private IocContainer iocContainer;
+    @Getter private _IocContainer iocContainer;
 
     // -- LIFE-CYCLE
     
     @PostConstruct
     public void postConstruct() {
         
-        this.iocContainer = IocContainerSpring.of(springContext);
+        this.iocContainer = _IocContainer.spring(springContext);
         
         log.info("postConstruct (hashCode = {})", this.hashCode());
         
@@ -118,7 +117,7 @@ public class IsisSystemEnvironment {
     
     // -- SHORTCUTS
     
-    public IocContainer ioc() {
+    public _IocContainer ioc() {
         return getIocContainer();
     }
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/ServiceRegistry_forTesting.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/ServiceRegistry_forTesting.java
index 9554f41..168a4c0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/ServiceRegistry_forTesting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/ServiceRegistry_forTesting.java
@@ -30,9 +30,8 @@ import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.commons.internal.ioc.IocContainer;
-import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
-import org.apache.isis.commons.internal.ioc.spring._Spring;
+import org.apache.isis.commons.internal.ioc._IocContainer;
+import org.apache.isis.commons.internal.ioc._ManagedBeanAdapter;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 
 import lombok.Builder;
@@ -48,15 +47,14 @@ class ServiceRegistry_forTesting implements ServiceRegistry {
 
     @NonNull private final MetaModelContext metaModelContext;
     
-    @Getter @Setter private IocContainer iocContainer;
-    private final Set<ManagedBeanAdapter> registeredBeans = _Sets.newHashSet();
+    @Getter @Setter private _IocContainer iocContainer;
+    private final Set<_ManagedBeanAdapter> registeredBeans = _Sets.newHashSet();
 
     @Override
     public <T> Can<T> select(Class<T> type, Annotation[] qualifiers) {
 
         if(iocContainer!=null) {
-            return iocContainer
-                    .select(type, _Spring.filterQualifiers(qualifiers));
+            return iocContainer.select(type, qualifiers);
         }
 
 // ignore        
@@ -84,12 +82,12 @@ class ServiceRegistry_forTesting implements ServiceRegistry {
     }
 
     @Override
-    public Stream<ManagedBeanAdapter> streamRegisteredBeans() {
+    public Stream<_ManagedBeanAdapter> streamRegisteredBeans() {
         return registeredBeans().stream();
     }
 
     @Override
-    public Optional<ManagedBeanAdapter> lookupRegisteredBeanById(String id) {
+    public Optional<_ManagedBeanAdapter> lookupRegisteredBeanById(String id) {
         throw _Exceptions.notImplemented();
     }
 
@@ -101,7 +99,7 @@ class ServiceRegistry_forTesting implements ServiceRegistry {
 
     // -- HELPER
 
-    private Set<ManagedBeanAdapter> registeredBeans() {
+    private Set<_ManagedBeanAdapter> registeredBeans() {
         synchronized(registeredBeans) {
             if(registeredBeans.isEmpty()) {
 
@@ -125,7 +123,7 @@ class ServiceRegistry_forTesting implements ServiceRegistry {
     }
 
     @Value @Builder
-    private static class PojoBeanAdapter implements ManagedBeanAdapter {
+    private static class PojoBeanAdapter implements _ManagedBeanAdapter {
 
         String id;
         Can<?> instance;
@@ -138,7 +136,7 @@ class ServiceRegistry_forTesting implements ServiceRegistry {
 
     }
 
-    private ManagedBeanAdapter toBeanAdapter(Object singleton) {
+    private _ManagedBeanAdapter toBeanAdapter(Object singleton) {
 
         return PojoBeanAdapter.builder()
                 .id(singleton.getClass().getName())
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java
index 3c2f8e9..147e7a7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java
@@ -35,8 +35,8 @@ import org.apache.isis.applib.services.xactn.TransactionState;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.core.config.environment.IsisSystemEnvironment;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.commons.internal.ioc.IocContainer;
-import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
+import org.apache.isis.commons.internal.ioc._IocContainer;
+import org.apache.isis.commons.internal.ioc._ManagedBeanAdapter;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.services.ServiceUtil;
@@ -52,8 +52,8 @@ import lombok.val;
 
 class MetaModelContext_usingIoc implements MetaModelContext {
 
-    private final IocContainer iocContainer;
-    public MetaModelContext_usingIoc(IocContainer iocContainer) {
+    private final _IocContainer iocContainer;
+    public MetaModelContext_usingIoc(_IocContainer iocContainer) {
         this.iocContainer = iocContainer;
     }
 
@@ -162,7 +162,7 @@ class MetaModelContext_usingIoc implements MetaModelContext {
                 .collect(Collectors.toMap(ServiceUtil::idOfAdapter, v->v, (o,n)->n, LinkedHashMap::new));
     }
     
-    private ManagedObject toManagedObject(ManagedBeanAdapter managedBeanAdapter) {
+    private ManagedObject toManagedObject(_ManagedBeanAdapter managedBeanAdapter) {
         
         val servicePojo = managedBeanAdapter.getInstance().getFirst()
                 .orElseThrow(()->_Exceptions.unrecoverableFormatted(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java
index 0ab0fd5..471b774 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java
@@ -23,7 +23,7 @@ import java.lang.reflect.Modifier;
 
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
+import org.apache.isis.commons.internal.ioc._ManagedBeanAdapter;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
@@ -94,7 +94,7 @@ final class ObjectLoader_builtinHandlers {
             
             val servicePojo = metaModelContext.getServiceRegistry()
                 .lookupRegisteredBeanById(beanName)
-                .map(ManagedBeanAdapter::getInstance)
+                .map(_ManagedBeanAdapter::getInstance)
                 .flatMap(Can::getFirst)
                 .orElseThrow(()->_Exceptions.noSuchElement(
                         "loader: %s loading beanName %s", 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventSupport_Spring.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventSupport_Spring.java
index d688b75..eaf857f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventSupport_Spring.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/events/MetamodelEventSupport_Spring.java
@@ -32,7 +32,7 @@ import org.apache.isis.applib.events.ui.CssClassUiEvent;
 import org.apache.isis.applib.events.ui.IconUiEvent;
 import org.apache.isis.applib.events.ui.LayoutUiEvent;
 import org.apache.isis.applib.events.ui.TitleUiEvent;
-import org.apache.isis.commons.internal.ioc.spring._Spring;
+import org.apache.isis.commons.internal.ioc._Spring;
 
 @Configuration
 @Named("isisMetaModel.MetamodelEventSupport_Spring")
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java
index afafb57..4f671d4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java
@@ -39,8 +39,8 @@ import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.config.environment.IsisSystemEnvironment;
-import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
-import org.apache.isis.commons.internal.ioc.spring._Spring;
+import org.apache.isis.commons.internal.ioc._ManagedBeanAdapter;
+import org.apache.isis.commons.internal.ioc._Spring;
 import org.apache.isis.core.config.beans.IsisBeanTypeRegistryHolder;
 
 import lombok.val;
@@ -57,7 +57,7 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
     @Inject private IsisBeanTypeRegistryHolder isisBeanTypeRegistryHolder;
     
     @Override
-    public Optional<ManagedBeanAdapter> lookupRegisteredBeanById(String id) {
+    public Optional<_ManagedBeanAdapter> lookupRegisteredBeanById(String id) {
         return Optional.ofNullable(managedBeansById.get().get(id));
     }
 
@@ -67,25 +67,25 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
     }
 
     @Override
-    public Stream<ManagedBeanAdapter> streamRegisteredBeans() {
+    public Stream<_ManagedBeanAdapter> streamRegisteredBeans() {
         return managedBeansById.get().values().stream();
     }
     
     @Override
     public <T> Can<T> select(Class<T> type, Annotation[] qualifiers) {
         return isisSystemEnvironment.getIocContainer()
-                .select(type, _Spring.filterQualifiers(qualifiers));
+                .select(type, qualifiers);
     }
     
     // -- HELPER
 
-    private final _Lazy<Map<String, ManagedBeanAdapter>> managedBeansById = 
+    private final _Lazy<Map<String, _ManagedBeanAdapter>> managedBeansById = 
             _Lazy.threadSafe(this::enumerateManagedBeans);
 
-    private Map<String, ManagedBeanAdapter> enumerateManagedBeans() {
+    private Map<String, _ManagedBeanAdapter> enumerateManagedBeans() {
         
         val beanTypeRegistry = isisBeanTypeRegistryHolder.getIsisBeanTypeRegistry();
-        val managedBeanAdapterByName = _Maps.<String, ManagedBeanAdapter>newHashMap();
+        val managedBeanAdapterByName = _Maps.<String, _ManagedBeanAdapter>newHashMap();
 
         isisSystemEnvironment.getIocContainer().streamAllBeans()
         .filter(_NullSafe::isPresent)
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/bootstrapping/SpringServiceProvisioningTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/bootstrapping/SpringServiceProvisioningTest.java
index 5b6da011..ab50f9a 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/bootstrapping/SpringServiceProvisioningTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/bootstrapping/SpringServiceProvisioningTest.java
@@ -37,7 +37,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.config.environment.IsisSystemEnvironment;
-import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
+import org.apache.isis.commons.internal.ioc._ManagedBeanAdapter;
 import org.apache.isis.commons.internal.resources._Resources;
 import org.apache.isis.core.config.presets.IsisPresets;
 import org.apache.isis.testdomain.Smoketest;
@@ -80,7 +80,7 @@ class SpringServiceProvisioningTest {
     void dump_all() throws IOException {
 
         final List<String> beans = isisSystemEnvironment.getIocContainer().streamAllBeans()
-                .map(ManagedBeanAdapter::getId)
+                .map(_ManagedBeanAdapter::getId)
                 .sorted()
                 .collect(Collectors.toList());
 
@@ -94,7 +94,7 @@ class SpringServiceProvisioningTest {
     void builtInServices_shouldBeSetUp() throws IOException {
 
         val managedServices = serviceRegistry.streamRegisteredBeans()
-                .map(ManagedBeanAdapter::getBeanClass)
+                .map(_ManagedBeanAdapter::getBeanClass)
                 .map(Class::getName)
                 .collect(Collectors.toCollection(TreeSet::new));
 
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/eventhandling/SpringEventPublishingTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/eventhandling/SpringEventPublishingTest.java
index 8e63bf8..15c4f14 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/eventhandling/SpringEventPublishingTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/eventhandling/SpringEventPublishingTest.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Service;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.apache.isis.commons.internal.ioc.spring._Spring;
+import org.apache.isis.commons.internal.ioc._Spring;
 
 import lombok.Getter;
 import lombok.Value;