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

[isis] branch v2 updated: ISIS-2158: replace home-brew service injector with Spring's

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 f3e6029  ISIS-2158: replace home-brew service injector with Spring's
f3e6029 is described below

commit f3e6029dfdef1594d7e662cca226a6bbe9ffa2bc
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Oct 11 16:21:59 2019 +0200

    ISIS-2158: replace home-brew service injector with Spring's
---
 .../services/confview/ConfigurationMenu.java       |   1 +
 .../isis/schema/utils/InteractionDtoUtils.java     |   4 +-
 .../commons/internal/ioc/LifecycleContext.java     |  65 ------
 .../commons/internal/ioc/cdi/BeanAdapterCDI.java   |   2 -
 .../apache/isis/commons/internal/ioc/cdi/_CDI.java |   6 +-
 .../internal/ioc/spring/BeanAdapterSpring.java     |   3 -
 .../isis/commons/internal/ioc/spring/_Spring.java  |   9 +-
 .../isis/metamodel/ServiceInjector_forTesting.java |   4 +-
 ...ctionInvocationFacetForDomainEventAbstract.java |   3 +-
 .../metamodel/services/ServiceInjectorDefault.java | 259 ++-------------------
 ...ctorDefault.java => ServiceInjectorLegacy.java} |   9 +-
 11 files changed, 37 insertions(+), 328 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java b/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
index 6fefb67..a3a6ae7 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
@@ -56,6 +56,7 @@ public class ConfigurationMenu {
             )
     @MemberOrder(sequence = "500.900.1")
     public Set<ConfigurationProperty> configuration(){
+        System.out.println("############## CALL");
         return configurationService.allProperties();
     }
 
diff --git a/core/applib/src/main/java/org/apache/isis/schema/utils/InteractionDtoUtils.java b/core/applib/src/main/java/org/apache/isis/schema/utils/InteractionDtoUtils.java
index f98cf42..e474535 100644
--- a/core/applib/src/main/java/org/apache/isis/schema/utils/InteractionDtoUtils.java
+++ b/core/applib/src/main/java/org/apache/isis/schema/utils/InteractionDtoUtils.java
@@ -367,7 +367,9 @@ public final class InteractionDtoUtils {
     public static void addReturn(
             final ActionInvocationDto invocationDto,
             final Class<?> returnType,
-            final Object result, final BookmarkService bookmarkService) {
+            final Object result, 
+            final BookmarkService bookmarkService) {
+        
         final ValueWithTypeDto returned = CommonDtoUtils
                 .newValueWithTypeDto(returnType, result, bookmarkService);
         invocationDto.setReturned(returned);
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/LifecycleContext.java b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/LifecycleContext.java
deleted file mode 100644
index 95277a8..0000000
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/LifecycleContext.java
+++ /dev/null
@@ -1,65 +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;
-
-import org.apache.isis.commons.internal.base._Strings;
-
-import lombok.extern.log4j.Log4j2;
-
-@Log4j2
-public enum LifecycleContext {
-    ApplicationScoped,
-    Singleton,
-    SessionScoped,
-    RequestScoped,
-    ConversationScoped,
-    Dependent,
-    NotSpecified,
-    ;
-
-    public boolean isApplicationScoped() {
-        return this == ApplicationScoped;
-    }
-
-    public boolean isSingleton() {
-        return this == Singleton;
-    }
-
-    public boolean isRequestScoped() {
-        return this == RequestScoped;
-    }
-
-    public static LifecycleContext parse(String scope) {
-
-        if(_Strings.isNullOrEmpty(scope)) {
-            return LifecycleContext.NotSpecified;
-        }
-
-        for(LifecycleContext candidate : LifecycleContext.values()) {
-            if(candidate.name().equalsIgnoreCase(scope)) {
-                return candidate;
-            }
-        }
-
-        log.warn("unrecogniced scope '{}'", scope);
-        return LifecycleContext.NotSpecified;
-
-    }
-
-}
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/cdi/BeanAdapterCDI.java b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/cdi/BeanAdapterCDI.java
index c53913c..276c588 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/cdi/BeanAdapterCDI.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/cdi/BeanAdapterCDI.java
@@ -21,7 +21,6 @@ package org.apache.isis.commons.internal.ioc.cdi;
 import javax.enterprise.inject.spi.Bean;
 
 import org.apache.isis.commons.collections.Bin;
-import org.apache.isis.commons.internal.ioc.LifecycleContext;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 
 import lombok.Value;
@@ -31,7 +30,6 @@ import lombok.val;
 final class BeanAdapterCDI implements ManagedBeanAdapter {
 
     private final String id;
-    private final LifecycleContext lifecycleContext;
     private final Bean<?> bean;
 
     @Override
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/cdi/_CDI.java b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/cdi/_CDI.java
index 14551f1..0b581dd 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/cdi/_CDI.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/cdi/_CDI.java
@@ -42,7 +42,6 @@ import org.apache.isis.commons.collections.Bin;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.functions._Functions.CheckedRunnable;
-import org.apache.isis.commons.internal.ioc.LifecycleContext;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 
 import static org.apache.isis.commons.internal.base._NullSafe.isEmpty;
@@ -203,10 +202,9 @@ public final class _CDI {
             return streamAllCDIBeans()
                     .map(bean->{
 
-                        val scope = bean.getScope().getSimpleName(); // also works for produced beans
-                        val lifecycleContext = LifecycleContext.valueOf(scope);
+                        //val scope = bean.getScope().getSimpleName(); // also works for produced beans
                         val id = beanNameProvider.apply(bean);
-                        val beanAdapter = BeanAdapterCDI.of(id, lifecycleContext, bean);
+                        val beanAdapter = BeanAdapterCDI.of(id, bean);
                         return beanAdapter;
                     });
 
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/BeanAdapterSpring.java b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/BeanAdapterSpring.java
index c266c0f..d2b5107 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/BeanAdapterSpring.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/BeanAdapterSpring.java
@@ -21,7 +21,6 @@ package org.apache.isis.commons.internal.ioc.spring;
 import org.springframework.beans.factory.ObjectProvider;
 
 import org.apache.isis.commons.collections.Bin;
-import org.apache.isis.commons.internal.ioc.LifecycleContext;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 
 import lombok.Value;
@@ -31,10 +30,8 @@ import lombok.val;
 final class BeanAdapterSpring implements ManagedBeanAdapter {
 
     private final String id;
-    private final LifecycleContext lifecycleContext;
     private final Class<?> beanClass;
     private final ObjectProvider<?> beanProvider;
-    //private final BeanSort managedObjectSort;
 
     @Override
     public Bin<?> getInstance() {
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/_Spring.java b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/_Spring.java
index c38c078..38d844f 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/_Spring.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/_Spring.java
@@ -35,7 +35,6 @@ import javax.inject.Qualifier;
 
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.ResolvableType;
 import org.springframework.core.env.ConfigurableEnvironment;
@@ -49,7 +48,6 @@ import org.apache.isis.commons.internal.collections._Maps;
 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.LifecycleContext;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 
 import static org.apache.isis.commons.internal.base._NullSafe.stream;
@@ -126,7 +124,7 @@ public class _Spring {
     public static Stream<ManagedBeanAdapter> streamAllBeans() {
 
         val context = context();
-        val beanFactory = ((ConfigurableApplicationContext)context).getBeanFactory();
+        //val beanFactory = ((ConfigurableApplicationContext)context).getBeanFactory();
 
         return Stream.of(context.getBeanDefinitionNames())
                 .map(name->{
@@ -134,13 +132,12 @@ public class _Spring {
                     val type = context.getType(name);
                     val id = name; // just reuse the bean's name
 
-                    val scope = beanFactory.getBeanDefinition(name).getScope();
-                    val lifecycleContext = LifecycleContext.parse(scope);
+                    //val scope = beanFactory.getBeanDefinition(name).getScope();
 
                     val resolvableType = ResolvableType.forClass(type);
                     val bean = context.getBeanProvider(resolvableType);
 
-                    val beanAdapter = BeanAdapterSpring.of(id, lifecycleContext, type, bean);
+                    val beanAdapter = BeanAdapterSpring.of(id, type, bean);
 
                     return beanAdapter;
                 });
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceInjector_forTesting.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceInjector_forTesting.java
index a361087..9e8bcab 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceInjector_forTesting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceInjector_forTesting.java
@@ -23,7 +23,7 @@ import java.util.function.Consumer;
 import org.springframework.beans.factory.InjectionPoint;
 
 import org.apache.isis.applib.services.inject.ServiceInjector;
-import org.apache.isis.metamodel.services.ServiceInjectorDefault;
+import org.apache.isis.metamodel.services.ServiceInjectorLegacy;
 import org.apache.isis.metamodel.specloader.InjectorMethodEvaluatorDefault;
 
 import static java.util.Objects.requireNonNull;
@@ -53,7 +53,7 @@ class ServiceInjector_forTesting implements ServiceInjector {
 
             //Note: when testing we don't report un-resolvable injection points.
 
-            delegate = ServiceInjectorDefault.getInstanceAndInit(
+            delegate = ServiceInjectorLegacy.getInstanceAndInit(
                     configuration, serviceRegistry, injectorMethodEvaluator);
 
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 5a4d969..21b9b6b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -303,7 +303,8 @@ implements ImperativeFacet {
             returnedAdapter = getObjectAdapterProvider().adapterFor(returnedPojo);
 
             // sync DTO with result
-            getInteractionDtoServiceInternal().updateResult(priorExecution.getDto(), owningAction, returnedPojo);
+            getInteractionDtoServiceInternal()
+            .updateResult(priorExecution.getDto(), owningAction, returnedPojo);
 
 
             // update Command (if required)
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 b059a1a..559a454 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
@@ -18,267 +18,48 @@
  */
 package org.apache.isis.metamodel.services;
 
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.Map;
 import java.util.function.Consumer;
-import java.util.function.Predicate;
 
-import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
 import org.springframework.beans.factory.InjectionPoint;
-import org.springframework.core.MethodParameter;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.inject.ServiceInjector;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.commons.internal._Constants;
-import org.apache.isis.commons.internal.base._NullSafe;
-import org.apache.isis.commons.internal.collections._Arrays;
-import org.apache.isis.commons.internal.collections._Collections;
-import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.config.IsisConfiguration;
-import org.apache.isis.metamodel.commons.ToString;
-import org.apache.isis.metamodel.exceptions.MetaModelException;
-import org.apache.isis.metamodel.spec.InjectorMethodEvaluator;
 
-import lombok.val;
-import lombok.extern.log4j.Log4j2;
-
-@Service @Log4j2
+/**
+ * 
+ * @since 2.0
+ *
+ */
+@Service
 public class ServiceInjectorDefault implements ServiceInjector {
 
-    @Inject private IsisConfiguration configuration;
-    @Inject private ServiceRegistry serviceRegistry;
-    @Inject private InjectorMethodEvaluator injectorMethodEvaluator;
-
-    private final Map<Class<?>, Method[]> methodsByClassCache = _Maps.newConcurrentHashMap();
-    private final Map<Class<?>, Field[]> fieldsByClassCache = _Maps.newConcurrentHashMap();
-
+    @Inject private AutowireCapableBeanFactory autowireCapableBeanFactory;
+    
+    
+//    @PostConstruct
+//    public void init() {
+//        if(autowireCapableBeanFactory==null) {
+//            autowireCapableBeanFactory = _Spring.context().getAutowireCapableBeanFactory();
+//        }
+//    }
+    
     @Override
     public <T> T injectServicesInto(T domainObject, Consumer<InjectionPoint> onNotResolvable) {
         injectServices(domainObject, onNotResolvable);
         return domainObject;
     }
 
-    @PostConstruct
-    public void init() {
-        autowireSetters = configuration.getServices().getInjector().isSetPrefix();
-        autowireInject = configuration.getServices().getInjector().isInjectPrefix();
-    }
-
     // -- HELPERS
 
-    boolean autowireSetters;
-    boolean autowireInject;    
-
     private void injectServices(final Object targetPojo, Consumer<InjectionPoint> onNotResolvable) {
 
-        val type = targetPojo.getClass();
-        if(serviceRegistry.isResolvableBean(type)) {
-            log.warn("Skipping call injectServices() on an already managed bean {}.", type);
-            return; // already managed
-        }
-
-        injectToFields(targetPojo, type, onNotResolvable);
-
-        if(autowireSetters) {
-            injectViaPrefixedMethods(targetPojo, type, "set", onNotResolvable);
-        }
-        if(autowireInject) {
-            injectViaPrefixedMethods(targetPojo, type, "inject", onNotResolvable);
-        }
-    }
-
-    private void injectToFields(final Object targetPojo, final Class<?> cls, Consumer<InjectionPoint> onNotResolvable) {
-
-        _NullSafe.stream(fieldsByClassCache.computeIfAbsent(cls, __->cls.getDeclaredFields()))
-        .filter(isAnnotatedForInjection())
-        .forEach(field->injectToField(targetPojo, field, onNotResolvable));
-
-        // recurse up the object's class hierarchy
-        final Class<?> superclass = cls.getSuperclass();
-        if(superclass != null) {
-            injectToFields(targetPojo, superclass, onNotResolvable);
-        }
-    }
-
-    private void injectToField(final Object targetPojo, final Field field, Consumer<InjectionPoint> onNotResolvable) {
-
-        final Class<?> typeToBeInjected = field.getType();
-        // don't think that type can ever be null,
-        // but Javadoc for java.lang.reflect.Field doesn't say
-        if(typeToBeInjected == null) {
-            return;
-        }
-
-        // inject matching services into a field of type Collection<T> if a generic type T is present
-        final Class<?> elementType = _Collections.inferElementTypeIfAny(field);
-        if(elementType!=null) {
-            injectToField_nonScalar(targetPojo, field, elementType, onNotResolvable);
-            return;
-        }
+        autowireCapableBeanFactory.autowireBeanProperties(
+                targetPojo,
+                AutowireCapableBeanFactory.AUTOWIRE_NO, false);
         
-        val beans = serviceRegistry.select(typeToBeInjected, field.getAnnotations());
-
-        if(beans.isEmpty()) {
-            onNotResolvable.accept(new InjectionPoint(field));
-        } else if(beans.isCardinalityOne()) {
-            val bean = beans.getSingleton().get();
-            invokeInjectorField(field, targetPojo, bean);
-        } else {
-            
-            val requiredAnnotations = _Arrays.combine(
-                    Annotation.class, 
-                    _Constants.ANNOTATION_PRIMARY, 
-                    field.getAnnotations());
-            
-            // look for primary
-            val primaryBean = serviceRegistry.select(typeToBeInjected, requiredAnnotations);
-            if(!primaryBean.isEmpty()) {
-                val bean = primaryBean.getFirst().get();
-                invokeInjectorField(field, targetPojo, bean);
-                return;
-            }
-            
-            // fallback: pick first in list
-            val bean = beans.getFirst().get();
-            invokeInjectorField(field, targetPojo, bean);    
-        }
-
-    }
-
-    @SuppressWarnings("unchecked")
-    private void injectToField_nonScalar(
-            final Object targetPojo, 
-            final Field field, 
-            final Class<?> elementType, 
-            final Consumer<InjectionPoint> onNotResolvable) {
-
-        final Class<? extends Collection<Object>> collectionTypeToBeInjected =
-                (Class<? extends Collection<Object>>) field.getType();
-
-        val beans = serviceRegistry.select(elementType, field.getAnnotations());
-        if(!beans.isEmpty()) {
-            final Collection<Object> collectionOfServices = beans.stream()
-                    .filter(isOfType(elementType))
-                    // javac does require an explicit type argument here, 
-                    // while eclipse compiler does not ...
-                    .collect(_Collections.<Object>toUnmodifiableOfType(collectionTypeToBeInjected));
-
-            invokeInjectorField(field, targetPojo, collectionOfServices);
-        } else {
-            onNotResolvable.accept(new InjectionPoint(field));
-        }
-
-    }
-
-    private void injectViaPrefixedMethods(
-            final Object targetPojo,
-            final Class<?> cls,
-            final String prefix, 
-            final Consumer<InjectionPoint> onNotResolvable) {
-
-        _NullSafe.stream(methodsByClassCache.computeIfAbsent(cls, __->cls.getMethods()))
-        .filter(nameStartsWith(prefix))
-        .forEach(prefixedMethod->injectIntoSetter(targetPojo, prefixedMethod, onNotResolvable));
-    }
-
-    private void injectIntoSetter(
-            final Object targetPojo,
-            final Method setter, 
-            final Consumer<InjectionPoint> onNotResolvable) {
-
-        final Class<?> typeToBeInjected = injectorMethodEvaluator.getTypeToBeInjected(setter);
-        if(typeToBeInjected == null) {
-            return;
-        }
-
-        val instance = serviceRegistry.select(typeToBeInjected, setter.getAnnotations());
-        if(instance.isCardinalityOne()) {
-            val bean = instance.getSingleton().get();
-            invokeInjectorMethod(setter, targetPojo, bean);    
-        } else {
-            onNotResolvable.accept(new InjectionPoint(new MethodParameter(setter, 0)));
-        }
-
-    }
-
-    private static void invokeMethod(final Method method, final Object target, final Object[] parameters) {
-        try {
-            method.invoke(target, parameters);
-        } catch (final SecurityException | IllegalAccessException e) {
-            throw new MetaModelException(String.format("Cannot access the %s method in %s", method.getName(), target.getClass().getName()));
-        } catch (final IllegalArgumentException e1) {
-            throw new MetaModelException(e1);
-        } catch (final InvocationTargetException e) {
-            final Throwable targetException = e.getTargetException();
-            if (targetException instanceof RuntimeException) {
-                throw (RuntimeException) targetException;
-            } else {
-                throw new MetaModelException(targetException);
-            }
-        }
-    }
-
-    private static void invokeInjectorField(final Field field, final Object target, final Object parameter) {
-        try {
-            field.setAccessible(true);
-            field.set(target, parameter);
-        } catch (final IllegalArgumentException e) {
-            throw new MetaModelException(e);
-        } catch (final IllegalAccessException e) {
-            throw new MetaModelException(String.format("Cannot access the %s field in %s", field.getName(), target.getClass().getName()));
-        }
-        if (log.isDebugEnabled()) {
-            log.debug("injected {} into {}", parameter, new ToString(target));
-        }
-    }
-
-    private static void invokeInjectorMethod(final Method method, final Object target, final Object parameter) {
-        final Object[] parameters = new Object[] { parameter };
-        invokeMethod(method, target, parameters);
-        if (log.isDebugEnabled()) {
-            log.debug("injected {} into {}", parameter, new ToString(target));
-        }
-    }
-
-    // -- REFLECTIVE PREDICATES
-
-    private static final Predicate<Object> isOfType(final Class<?> cls) {
-        return obj->cls.isAssignableFrom(obj.getClass());
-    }
-
-    private static final Predicate<Method> nameStartsWith(final String prefix) {
-        return method->method.getName().startsWith(prefix);
-    }
-
-    private static final Predicate<Field> isAnnotatedForInjection() {
-        return field->field.getAnnotation(javax.inject.Inject.class) != null;
-    }
-
-    // -- TESTING
-
-    /**
-     * JUnit Test support. 
-     */
-    public static ServiceInjectorDefault getInstanceAndInit(
-            IsisConfiguration configuration,
-            ServiceRegistry serviceRegistry,
-            InjectorMethodEvaluator injectorMethodEvaluator) {
-        val instance = new ServiceInjectorDefault();
-
-        instance.configuration = configuration;
-        instance.serviceRegistry = serviceRegistry;
-        instance.injectorMethodEvaluator = injectorMethodEvaluator;
-
-        instance.init();
-
-        return instance;
     }
 
 
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/ServiceInjectorLegacy.java
similarity index 97%
copy from core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorDefault.java
copy to core/metamodel/src/main/java/org/apache/isis/metamodel/services/ServiceInjectorLegacy.java
index b059a1a..0f1740b 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/ServiceInjectorLegacy.java
@@ -32,7 +32,6 @@ import javax.inject.Inject;
 
 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;
@@ -49,8 +48,8 @@ import org.apache.isis.metamodel.spec.InjectorMethodEvaluator;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-@Service @Log4j2
-public class ServiceInjectorDefault implements ServiceInjector {
+@Log4j2
+public class ServiceInjectorLegacy implements ServiceInjector {
 
     @Inject private IsisConfiguration configuration;
     @Inject private ServiceRegistry serviceRegistry;
@@ -266,11 +265,11 @@ public class ServiceInjectorDefault implements ServiceInjector {
     /**
      * JUnit Test support. 
      */
-    public static ServiceInjectorDefault getInstanceAndInit(
+    public static ServiceInjectorLegacy getInstanceAndInit(
             IsisConfiguration configuration,
             ServiceRegistry serviceRegistry,
             InjectorMethodEvaluator injectorMethodEvaluator) {
-        val instance = new ServiceInjectorDefault();
+        val instance = new ServiceInjectorLegacy();
 
         instance.configuration = configuration;
         instance.serviceRegistry = serviceRegistry;