You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2016/05/27 00:29:12 UTC

[3/7] isis git commit: ISIS-1416: new configuration properties to enable/disable inject...() and set...() style injection.

ISIS-1416: new configuration properties to enable/disable inject...() and set...() style injection.

Also updates to docs and migration notes.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/ba74043c
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/ba74043c
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/ba74043c

Branch: refs/heads/master
Commit: ba74043c5c055acbac349aad37627f2a18de7987
Parents: 90b6666
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu May 26 23:15:55 2016 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu May 26 23:15:55 2016 +0100

----------------------------------------------------------------------
 .../_migration-notes_1.12.0-to-1.13.0.adoc      |  19 +++-
 .../guides/_rgcfg_configuring-core.adoc         |  20 ++++
 .../isis/applib/AbstractContainedObject.java    |   6 +-
 .../metamodel/services/ServicesInjector.java    | 112 +++++++------------
 .../defaults/DefaultedFacetFactoryTest.java     |  13 +--
 .../encodable/EncodableFacetFactoryTest.java    |  17 ++-
 .../services/ServicesInjectorDefaultTest.java   |   4 +-
 ...ServicesInjectorDefaultTest_usingFields.java |   4 +-
 ...cesInjectorDefaultTest_validateServices.java |   8 +-
 .../SpecificationLoaderTestAbstract.java        |   6 +-
 .../testspec/ObjectSpecificationStub.java       |   6 +-
 .../isis/core/runtime/system/IsisSystem.java    |   2 +-
 .../IsisComponentProvider.java                  |   6 +-
 .../ObjectActionLayoutXmlDefaultTest.java       |   6 +-
 .../system/ObjectMemberAbstractTest.java        |   7 +-
 .../system/OneToManyAssociationDefaultTest.java |   5 +-
 .../src/main/webapp/WEB-INF/isis.properties     |  11 +-
 17 files changed, 144 insertions(+), 108 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/adocs/documentation/src/main/asciidoc/_migration-notes_1.12.0-to-1.13.0.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/_migration-notes_1.12.0-to-1.13.0.adoc b/adocs/documentation/src/main/asciidoc/_migration-notes_1.12.0-to-1.13.0.adoc
index 0c9fee8..16dbadf 100644
--- a/adocs/documentation/src/main/asciidoc/_migration-notes_1.12.0-to-1.13.0.adoc
+++ b/adocs/documentation/src/main/asciidoc/_migration-notes_1.12.0-to-1.13.0.adoc
@@ -19,10 +19,23 @@ issues here.
 
 == Faster startup times
 
-The new `isis.services.applicationFeatures.init` can be used to control whether the
-xref:rgsvc.adoc#_rgsvc_api_ApplicationFeatureRepository[`ApplicationFeatureRepository`] domain service lazily or
-eagerly initializes itself based on the framework's internal metamodel.
+Several new configuration settings influence application startup times:
 
+* `isis.services.applicationFeatures.init` +
++
+This setting can be used to control whether the
+xref:rgsvc.adoc#_rgsvc_api_ApplicationFeatureRepository[`ApplicationFeatureRepository`] domain service lazily or
+eagerly initializes itself based on the framework's internal metamodel. +
++
 Prior to `1.13.0` this service eagerly initialized itself, causing the framework to have to traverse the domain object
 model graph for all types.  This could add noticeable overhead.  For `1.13.0` this service now initializes itself
 lazily.  The previous behaviour (of eager initialization) can be re-enabled by setting this property to `eager`.
+
+* `isis.services.injector.injectPrefix` and `isis.services.injector.setPrefix` +
++
+These settings can be used to control the styles of injection of domain services that the framework supports. +
++
+Prior to `1.13.0` the framework supported the injection of fields using xref:rgant.adoc#_rgant-Inject[`@Inject`], and
+also injection to `set...()` setter methods and also `inject...()` methods.  In `1.13.0` the injection through `@Inject`
+remains, and injection through setters is enabled by default.  Injection through `inject...()` is disabled however.
+For faster start-up times still, consider disabling injection through `set...()`.

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc b/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc
index e612250..5415060 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc
@@ -312,6 +312,26 @@ This implementation provides a default set of recognizers to convert RDBMS const
 
 
 |`isis.services.` +
+`injector.injectPrefix`
+| `true`,`false`  +
+(`false`)
+|(`1.13.0-SNAPSHOT`) Whether the framework should support `inject...()` as a prefix for injecting domain services into other domain objects.
++
+By default this is disabled.  The default prior to `1.13.0` was enabled.  If the setting is left as disabled then this may reduce application start-up times.
+
+
+|`isis.services.` +
+`injector.setPrefix`
+| `true`,`false`  +
+(`true`)
+|(`1.13.0-SNAPSHOT`) Whether the framework should support `set...()` as a prefix for injecting domain services into other domain objects.
++
+By default this is enabled (no change in `1.13.0`).  If the setting is changed to disabled then this may reduce application start-up times.
+
+
+
+
+|`isis.services.` +
 `publish.objects`
 | `all`, `none` +
 (`all`)

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/applib/src/main/java/org/apache/isis/applib/AbstractContainedObject.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/AbstractContainedObject.java b/core/applib/src/main/java/org/apache/isis/applib/AbstractContainedObject.java
index 99536b1..0e89af0 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/AbstractContainedObject.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/AbstractContainedObject.java
@@ -21,6 +21,8 @@ package org.apache.isis.applib;
 
 import java.util.List;
 
+import javax.inject.Inject;
+
 import com.google.common.base.Predicate;
 
 import org.apache.isis.applib.annotation.Programmatic;
@@ -702,6 +704,7 @@ public abstract class AbstractContainedObject {
 
     // //////////////////////////////////////
 
+    @Inject
     private DomainObjectContainer container;
 
     /**
@@ -712,8 +715,9 @@ public abstract class AbstractContainedObject {
     }
 
     /**
-     * Injected by the application container itself.
+     * @deprecated - will use the field to inject instead.
      */
+    @Deprecated
     @Programmatic
     public void setContainer(final DomainObjectContainer container) {
         this.container = container;

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
index c001fd5..cda5630 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
@@ -27,8 +27,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 
 import com.google.common.base.Predicate;
@@ -38,7 +36,6 @@ import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
-import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,14 +43,14 @@ import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.publish.PublishingService;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
-import org.apache.isis.core.commons.ensure.Assert;
-import org.apache.isis.core.commons.lang.ObjectExtensions;
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.commons.util.ToString;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
+import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
 import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.spec.InjectorMethodEvaluator;
 import org.apache.isis.core.metamodel.specloader.InjectorMethodEvaluatorDefault;
-import org.apache.isis.core.metamodel.specloader.ServiceInitializer;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 /**
@@ -69,6 +66,9 @@ public class ServicesInjector implements ApplicationScopedComponent {
 
     private static final Logger LOG = LoggerFactory.getLogger(ServicesInjector.class);
 
+    public static final String KEY_SET_PREFIX = "isis.services.injector.setPrefix";
+    public static final String KEY_INJECT_PREFIX = "isis.services.injector.injectPrefix";
+
     //region > constructor, fields
     /**
      * This is mutable internally, but only ever exposed (in {@link #getRegisteredServices()}) as immutable.
@@ -84,21 +84,46 @@ public class ServicesInjector implements ApplicationScopedComponent {
     private final Map<Class<?>, Object> serviceByConcreteType = Maps.newHashMap();
 
     private final InjectorMethodEvaluator injectorMethodEvaluator;
+    private final boolean autowireSetters;
+    private final boolean autowireInject;
+
+    public ServicesInjector(final List<Object> services, final IsisConfiguration configuration) {
+        this(services, null, configuration);
+    }
+
+    /**
+     * For testing.
+     */
+    public ServicesInjector(
+            final List<Object> services,
+            final IsisConfigurationDefault configuration,
+            final InjectorMethodEvaluator injectorMethodEvaluator) {
+        this(services, injectorMethodEvaluator, defaultAutowiring(configuration));
+    }
 
-    public ServicesInjector(final List<Object> services) {
-        this(services, null);
+    private static IsisConfiguration defaultAutowiring(final IsisConfigurationDefault configuration) {
+        configuration.put(KEY_SET_PREFIX, ""+true);
+        configuration.put(KEY_INJECT_PREFIX, ""+false);
+        return configuration;
     }
 
     /**
      * For testing.
      */
-    public ServicesInjector(final List<Object> services, final InjectorMethodEvaluator injectorMethodEvaluator) {
+    private ServicesInjector(
+            final List<Object> services,
+            final InjectorMethodEvaluator injectorMethodEvaluator,
+            final IsisConfiguration configuration) {
         this.services.addAll(services);
+
         this.injectorMethodEvaluator =
                 injectorMethodEvaluator != null
                         ? injectorMethodEvaluator
                         : new InjectorMethodEvaluatorDefault();
 
+        this.autowireSetters = configuration.getBoolean(KEY_SET_PREFIX, true);
+        this.autowireInject = configuration.getBoolean(KEY_INJECT_PREFIX, false);
+
         autowireServicesAndContainer();
     }
 
@@ -153,25 +178,13 @@ public class ServicesInjector implements ApplicationScopedComponent {
     }
 
     /**
-     * Validate domain service Ids are unique, and that the {@link PostConstruct} method, if present, must either
-     * take no arguments or take a {@link Map} object), and that the {@link PreDestroy} method, if present, must take
-     * no arguments.
-     *
-     * <p>
-     * TODO: there seems to be some duplication/overlap with {@link ServiceInitializer}.
+     * Validate domain service Ids are unique.
      */
     public void validateServices() {
         validate(getRegisteredServices());
     }
 
     private static void validate(List<Object> serviceList) {
-        for (Object service : serviceList) {
-            final Method[] methods = service.getClass().getMethods();
-            for (Method method : methods) {
-                validatePostConstructMethods(service, method);
-                validatePreDestroyMethods(service, method);
-            }
-        }
         ListMultimap<String, Object> servicesById = ArrayListMultimap.create();
         for (Object service : serviceList) {
             String id = ServiceUtil.id(service);
@@ -199,33 +212,6 @@ public class ServicesInjector implements ApplicationScopedComponent {
         return buf.toString();
     }
 
-    private static void validatePostConstructMethods(Object service, Method method) {
-        final PostConstruct postConstruct = method.getAnnotation(PostConstruct.class);
-        if(postConstruct == null) {
-            return;
-        }
-        final int numParams = method.getParameterTypes().length;
-        if(numParams == 0) {
-            return;
-        }
-        if(numParams == 1 && method.getParameterTypes()[0].isAssignableFrom(Map.class)) {
-            return;
-        }
-        throw new IllegalStateException("Domain service " + service.getClass().getName() + " has @PostConstruct method " + method.getName() + "; such methods must take either no argument or 1 argument of type Map<String,String>");
-    }
-
-    private static void validatePreDestroyMethods(Object service, Method method) {
-        final PreDestroy preDestroy = method.getAnnotation(PreDestroy.class);
-        if(preDestroy == null) {
-            return;
-        }
-        final int numParams = method.getParameterTypes().length;
-        if(numParams == 0) {
-            return;
-        }
-        throw new IllegalStateException("Domain service " + service.getClass().getName() + " has @PreDestroy method " + method.getName() + "; such methods must take no arguments");
-    }
-
 
     static boolean contains(final List<Object> services, final Class<?> serviceClass) {
         for (Object service : services) {
@@ -244,21 +230,6 @@ public class ServicesInjector implements ApplicationScopedComponent {
         return Collections.unmodifiableList(services);
     }
 
-    private void addServices(final List<Object> services) {
-        for (final Object service : services) {
-            if (service instanceof List) {
-                final List<Object> serviceList = ObjectExtensions.asListT(service, Object.class);
-                addServices(serviceList);
-            } else {
-                addService(service);
-            }
-        }
-    }
-
-    private boolean addService(final Object service) {
-        return services.add(service);
-    }
-
     //endregion
 
     //region > injectServicesInto
@@ -270,9 +241,7 @@ public class ServicesInjector implements ApplicationScopedComponent {
      * Called in multiple places from metamodel and facets.
      */
     public void injectServicesInto(final Object object) {
-        Assert.assertNotNull("no services", services);
-
-        injectServices(object, Collections.unmodifiableList(services));
+        injectServices(object, services);
     }
 
     /**
@@ -308,8 +277,13 @@ public class ServicesInjector implements ApplicationScopedComponent {
         final Class<?> cls = object.getClass();
 
         autowireViaFields(object, services, cls);
-        autowireViaPrefixedMethods(object, services, cls, "set");
-        autowireViaPrefixedMethods(object, services, cls, "inject");
+
+        if(autowireSetters) {
+            autowireViaPrefixedMethods(object, services, cls, "set");
+        }
+        if(autowireInject) {
+            autowireViaPrefixedMethods(object, services, cls, "inject");
+        }
     }
 
     private void autowireViaFields(final Object object, final List<Object> services, final Class<?> cls) {

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetFactoryTest.java
index 96d635c..86f65b7 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetFactoryTest.java
@@ -23,25 +23,24 @@ import java.util.Collections;
 
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.applib.annotation.Defaulted;
-import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
 import org.apache.isis.core.metamodel.facets.object.defaults.annotcfg.DefaultedFacetAnnotationElseConfigurationFactory;
-import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
 
 public class DefaultedFacetFactoryTest extends AbstractFacetFactoryTest {
 
     private DefaultedFacetAnnotationElseConfigurationFactory facetFactory;
-    private IsisConfigurationDefault isisConfigurationDefault;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
         facetFactory = new DefaultedFacetAnnotationElseConfigurationFactory();
-        ServicesInjector servicesInjector = new ServicesInjector(Collections.emptyList());
-        servicesInjector.addFallbackIfRequired(ConfigurationServiceInternal.class, isisConfigurationDefault = new IsisConfigurationDefault());
+
+        ServicesInjector servicesInjector = new ServicesInjector(Collections.emptyList(), stubConfiguration);
+        servicesInjector.addFallbackIfRequired(ConfigurationServiceInternal.class,  stubConfiguration);
         facetFactory.setServicesInjector(servicesInjector);
     }
 
@@ -190,7 +189,7 @@ public class DefaultedFacetFactoryTest extends AbstractFacetFactoryTest {
 
     public void testDefaultedProviderNameCanBePickedUpFromConfiguration() {
         final String className = "org.apache.isis.core.metamodel.facets.object.defaults.DefaultedFacetFactoryTest$MyDefaultedWithDefaultsProviderSpecifiedUsingConfiguration";
-        isisConfigurationDefault.add(DefaultsProviderUtil.DEFAULTS_PROVIDER_NAME_KEY_PREFIX + canonical(className) + DefaultsProviderUtil.DEFAULTS_PROVIDER_NAME_KEY_SUFFIX, className);
+        stubConfiguration.add(DefaultsProviderUtil.DEFAULTS_PROVIDER_NAME_KEY_PREFIX + canonical(className) + DefaultsProviderUtil.DEFAULTS_PROVIDER_NAME_KEY_SUFFIX, className);
         facetFactory.process(new ProcessClassContext(MyDefaultedWithDefaultsProviderSpecifiedUsingConfiguration.class, methodRemover, facetedMethod));
         final DefaultedFacetAbstract facet = (DefaultedFacetAbstract) facetedMethod.getFacet(DefaultedFacet.class);
         assertNotNull(facet);
@@ -213,7 +212,7 @@ public class DefaultedFacetFactoryTest extends AbstractFacetFactoryTest {
 
     public void testNonAnnotatedDefaultedCanBePickedUpFromConfiguration() {
         final String className = "org.apache.isis.core.metamodel.facets.object.defaults.DefaultedFacetFactoryTest$NonAnnotatedDefaultedDefaultsProviderSpecifiedUsingConfiguration";
-        isisConfigurationDefault.add(DefaultsProviderUtil.DEFAULTS_PROVIDER_NAME_KEY_PREFIX + canonical(className) + DefaultsProviderUtil.DEFAULTS_PROVIDER_NAME_KEY_SUFFIX, className);
+        stubConfiguration.add(DefaultsProviderUtil.DEFAULTS_PROVIDER_NAME_KEY_PREFIX + canonical(className) + DefaultsProviderUtil.DEFAULTS_PROVIDER_NAME_KEY_SUFFIX, className);
         facetFactory.process(new ProcessClassContext(NonAnnotatedDefaultedDefaultsProviderSpecifiedUsingConfiguration.class, methodRemover, facetedMethod));
         final DefaultedFacetAbstract facet = (DefaultedFacetAbstract) facetedMethod.getFacet(DefaultedFacet.class);
         assertNotNull(facet);

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/encodable/EncodableFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/encodable/EncodableFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/encodable/EncodableFacetFactoryTest.java
index 8c65066..0368b24 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/encodable/EncodableFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/encodable/EncodableFacetFactoryTest.java
@@ -23,30 +23,27 @@ import java.util.Collections;
 
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.annotation.Encodable;
-import org.apache.isis.core.commons.config.IsisConfigurationDefault;
+import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.core.metamodel.facets.object.encodeable.annotcfg.EncodableFacetAnnotationElseConfigurationFactory;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacetAbstract;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncoderDecoderUtil;
-import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
+import org.apache.isis.core.metamodel.facets.object.encodeable.annotcfg.EncodableFacetAnnotationElseConfigurationFactory;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
 
 public class EncodableFacetFactoryTest extends AbstractFacetFactoryTest {
 
     private EncodableFacetAnnotationElseConfigurationFactory facetFactory;
-    private IsisConfigurationDefault isisConfigurationDefault;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
         facetFactory = new EncodableFacetAnnotationElseConfigurationFactory();
-        isisConfigurationDefault = new IsisConfigurationDefault();
 
-        ServicesInjector servicesInjector = new ServicesInjector(Collections.emptyList());
-        servicesInjector.addFallbackIfRequired(ConfigurationServiceInternal.class, isisConfigurationDefault = new IsisConfigurationDefault());
+        ServicesInjector servicesInjector = new ServicesInjector(Collections.emptyList(), stubConfiguration);
+        servicesInjector.addFallbackIfRequired(ConfigurationServiceInternal.class, stubConfiguration);
         facetFactory.setServicesInjector(servicesInjector);
 
     }
@@ -186,7 +183,7 @@ public class EncodableFacetFactoryTest extends AbstractFacetFactoryTest {
 
     public void testEncoderDecoderNameCanBePickedUpFromConfiguration() {
         final String className = "org.apache.isis.core.metamodel.facets.object.encodable.EncodableFacetFactoryTest$MyEncodableWithEncoderDecoderSpecifiedUsingConfiguration";
-        isisConfigurationDefault.add(EncoderDecoderUtil.ENCODER_DECODER_NAME_KEY_PREFIX + canonical(className) + EncoderDecoderUtil.ENCODER_DECODER_NAME_KEY_SUFFIX, className);
+        stubConfiguration.add(EncoderDecoderUtil.ENCODER_DECODER_NAME_KEY_PREFIX + canonical(className) + EncoderDecoderUtil.ENCODER_DECODER_NAME_KEY_SUFFIX, className);
         facetFactory.process(new ProcessClassContext(MyEncodableWithEncoderDecoderSpecifiedUsingConfiguration.class, methodRemover, facetedMethod));
         final EncodableFacetAbstract facet = (EncodableFacetAbstract) facetedMethod.getFacet(EncodableFacet.class);
         assertNotNull(facet);
@@ -204,7 +201,7 @@ public class EncodableFacetFactoryTest extends AbstractFacetFactoryTest {
 
     public void testNonAnnotatedEncodeableCanPickUpEncoderDecoderFromConfiguration() {
         final String className = "org.apache.isis.core.metamodel.facets.object.encodable.EncodableFacetFactoryTest$NonAnnotatedEncodeableEncoderDecoderSpecifiedUsingConfiguration";
-        isisConfigurationDefault.add(EncoderDecoderUtil.ENCODER_DECODER_NAME_KEY_PREFIX + canonical(className) + EncoderDecoderUtil.ENCODER_DECODER_NAME_KEY_SUFFIX, className);
+        stubConfiguration.add(EncoderDecoderUtil.ENCODER_DECODER_NAME_KEY_PREFIX + canonical(className) + EncoderDecoderUtil.ENCODER_DECODER_NAME_KEY_SUFFIX, className);
         facetFactory.process(new ProcessClassContext(NonAnnotatedEncodeableEncoderDecoderSpecifiedUsingConfiguration.class, methodRemover, facetedMethod));
         final EncodableFacetAbstract facet = (EncodableFacetAbstract) facetedMethod.getFacet(EncodableFacet.class);
         assertNotNull(facet);

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
index 87e4958..4ee5a13 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
@@ -27,6 +27,7 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.specloader.InjectorMethodEvaluatorDefault;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
@@ -70,7 +71,8 @@ public class ServicesInjectorDefaultTest {
     public void setUp() throws Exception {
         final Object[] services = { mockContainer, mockService1, mockService2 };
 
-        injector = new ServicesInjector(Arrays.asList(services), new InjectorMethodEvaluatorDefault());
+        IsisConfigurationDefault stubConfiguration = new IsisConfigurationDefault();
+        injector = new ServicesInjector(Arrays.asList(services), stubConfiguration, new InjectorMethodEvaluatorDefault());
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
index b4e67bd..8aa8201 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
@@ -28,6 +28,7 @@ import org.junit.Rule;
 import org.junit.Test;
 
 import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
@@ -84,7 +85,8 @@ public class ServicesInjectorDefaultTest_usingFields {
         service1 = new SomeDomainService1();
         service3 = new SomeDomainService3();
         service2 = new SomeDomainService2();
-        injector = new ServicesInjector(Arrays.asList(container, service1, service3, service2));
+        final IsisConfigurationDefault stubConfiguration = new IsisConfigurationDefault();
+        injector = new ServicesInjector(Arrays.asList(container, service1, service3, service2), stubConfiguration);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_validateServices.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_validateServices.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_validateServices.java
index fa99e9e..7008a90 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_validateServices.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_validateServices.java
@@ -26,6 +26,8 @@ import com.google.common.collect.Lists;
 import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.isis.core.commons.config.IsisConfigurationDefault;
+
 public class ServicesInjectorDefaultTest_validateServices {
 
     ServicesInjector servicesInjector;
@@ -45,10 +47,12 @@ public class ServicesInjectorDefaultTest_validateServices {
     public static class ValidateServicesTestValidateServices extends ServicesInjectorDefaultTest_validateServices {
 
         List<Object> serviceList;
+        IsisConfigurationDefault stubConfiguration;
 
         @Before
         public void setUp() throws Exception {
             serviceList = Lists.newArrayList();
+            stubConfiguration = new IsisConfigurationDefault();
         }
 
         @Test(expected=IllegalStateException.class)
@@ -58,7 +62,7 @@ public class ServicesInjectorDefaultTest_validateServices {
             serviceList.add(new DomainServiceWithSomeId());
             serviceList.add(new DomainServiceWithDuplicateId());
 
-            servicesInjector = new ServicesInjector(serviceList, null);
+            servicesInjector = new ServicesInjector(serviceList, stubConfiguration, null);
 
             // when
             servicesInjector.validateServices();
@@ -70,7 +74,7 @@ public class ServicesInjectorDefaultTest_validateServices {
             serviceList.add(new DomainServiceWithSomeId());
             serviceList.add(new DomainServiceWithDifferentId());
 
-            servicesInjector = new ServicesInjector(serviceList, null);
+            servicesInjector = new ServicesInjector(serviceList, stubConfiguration, null);
 
             // when
             servicesInjector.validateServices();

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
index 06b7bd0..78a6654 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
@@ -103,7 +103,8 @@ public abstract class SpecificationLoaderTestAbstract {
         stubConfiguration = new IsisConfigurationDefault(null);
 
         stubServicesInjector =
-                new ServicesInjector(Lists.newArrayList(
+                new ServicesInjector(
+                    Lists.newArrayList(
                         mockAuthenticationSessionProvider,
                         stubConfiguration,
                         mockDeploymentCategoryProvider,
@@ -112,7 +113,8 @@ public abstract class SpecificationLoaderTestAbstract {
                         mockMessageBrokerServiceInternal,
                         mockTransactionStateProviderInternal,
                         mockGridService,
-                        mockDeploymentCategoryProvider));
+                        mockDeploymentCategoryProvider),
+                    stubConfiguration);
 
         final SpecificationLoader specificationLoader =
                 new SpecificationLoader(DeploymentCategory.PRODUCTION,

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
index 4c86911..6720a7e 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
@@ -71,9 +71,9 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
 
     public ObjectSpecificationStub(final Class<?> type) {
         this(type.getName());
-        this.servicesInjector = new ServicesInjector(Collections.emptyList());
-        servicesInjector.addFallbackIfRequired(
-                ConfigurationServiceInternal.class, new IsisConfigurationDefault(null));
+        IsisConfigurationDefault stubConfiguration = new IsisConfigurationDefault(null);
+        this.servicesInjector = new ServicesInjector(Collections.emptyList(), stubConfiguration);
+        servicesInjector.addFallbackIfRequired(ConfigurationServiceInternal.class, stubConfiguration);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystem.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystem.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystem.java
index d0c7241..2cf0654 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystem.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystem.java
@@ -146,7 +146,7 @@ public class IsisSystem implements ApplicationScopedComponent {
             final IsisConfigurationDefault configuration = componentProvider.getConfiguration();
 
             // services
-            ServicesInjector servicesInjector = componentProvider.provideServiceInjector();
+            ServicesInjector servicesInjector = componentProvider.provideServiceInjector(configuration);
             servicesInjector.addFallbackIfRequired(FixtureScripts.class, new FixtureScriptsDefault());
             servicesInjector.addFallbackIfRequired(ConfigurationServiceInternal.class, configuration);
             servicesInjector.validateServices();

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
index 6b41a5e..5b41613 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
@@ -265,8 +265,10 @@ public abstract class IsisComponentProvider {
         return authorizationManager;
     }
 
-    public ServicesInjector provideServiceInjector() {
-        return new ServicesInjector(services);
+    public ServicesInjector provideServiceInjector(final IsisConfiguration configuration) {
+        boolean autowireSetters = configuration.getBoolean(ServicesInjector.KEY_SET_PREFIX, false);
+        boolean autowireInject = configuration.getBoolean(ServicesInjector.KEY_INJECT_PREFIX, false);
+        return new ServicesInjector(services, configuration);
     }
 
     public FixturesInstaller provideFixturesInstaller()  {

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionLayoutXmlDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionLayoutXmlDefaultTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionLayoutXmlDefaultTest.java
index c3bfe80..29161b0 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionLayoutXmlDefaultTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionLayoutXmlDefaultTest.java
@@ -29,6 +29,7 @@ import org.junit.Test;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
@@ -69,16 +70,19 @@ public class ObjectActionLayoutXmlDefaultTest {
     private PersistenceSessionServiceInternal mockPersistenceSessionServiceInternal;
 
     private ServicesInjector stubServicesInjector;
+    private IsisConfigurationDefault stubConfiguration;
 
     @Before
     public void setUp() throws Exception {
 
+        stubConfiguration = new IsisConfigurationDefault();
+
         stubServicesInjector =
                 new ServicesInjector(Lists.newArrayList(
                         mockAuthenticationSessionProvider,
                         mockSpecificationLoader,
                         mockPersistenceSessionServiceInternal,
-                        mockMessageBrokerServiceInternal));
+                        mockMessageBrokerServiceInternal), stubConfiguration);
 
         context.checking(new Expectations() {
             {

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
index 1f52d76..16b0f1e 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
@@ -32,6 +32,7 @@ import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -85,9 +86,8 @@ public class ObjectMemberAbstractTest {
     @Mock
     private SpecificationLoader mockSpecificationLoader;
 
-    //    @Mock
-//    ServicesInjector mockServicesInjector;
     ServicesInjector stubServicesInjector;
+    private IsisConfigurationDefault stubConfiguration;
 
     @Mock
     private ObjectSpecification mockSpecForCustomer;
@@ -99,8 +99,9 @@ public class ObjectMemberAbstractTest {
     public void setUp() throws Exception {
         org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.OFF);
 
+        stubConfiguration = new IsisConfigurationDefault();
         stubServicesInjector = new ServicesInjector(Lists.<Object>newArrayList(
-                mockSpecificationLoader, mockSpecificationLoader));
+                mockSpecificationLoader, mockSpecificationLoader), stubConfiguration);
 
         context.checking(new Expectations() {{
             allowing(mockAuthenticationSessionProvider).getAuthenticationSession();

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationDefaultTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationDefaultTest.java
index 2924e88..70d1904 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationDefaultTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationDefaultTest.java
@@ -29,6 +29,7 @@ import org.junit.Test;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
@@ -85,16 +86,18 @@ public class OneToManyAssociationDefaultTest {
     private CollectionAddToFacet mockCollectionAddToFacet;
 
     private ServicesInjector stubServicesInjector;
+    private IsisConfigurationDefault stubConfiguration;
 
     private OneToManyAssociation association;
 
     @Before
     public void setUp() {
+        stubConfiguration = new IsisConfigurationDefault();
         stubServicesInjector = new ServicesInjector(Lists.newArrayList(
                 mockAuthenticationSessionProvider,
                 mockSpecificationLoader,
                 mockMessageBrokerServiceInternal,
-                mockPersistenceSessionServiceInternal));
+                mockPersistenceSessionServiceInternal), stubConfiguration);
 
         allowingPeerToReturnCollectionType();
         allowingPeerToReturnIdentifier();

http://git-wip-us.apache.org/repos/asf/isis/blob/ba74043c/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties
index dcff15a..f8c66ed 100644
--- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties
+++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties
@@ -211,12 +211,21 @@ isis.reflector.facet.domainObjectAnnotation.removingLifecycleEvent.postForDefaul
 
 
 #
-# Whether the ApplicationFeatureRepository should eagerly initialize itself (slowing start-up times)
+# Whether the ApplicationFeatureRepository should eagerly initialize itself (increasing start-up times)
 # or initialize itself lazily.  Default is lazy initialization.
 #
 #isis.services.applicationFeatures.init=lazy|eager
 
 
+#
+# Whether the framework supports inject...() and set...() styles of dependency injection.   By default the former
+# is disabled, the latter is enabled.  Disabling these settings can reduce application start-up times.
+#
+#isis.services.injector.injectPrefix=false|true
+#isis.services.injector.setPrefix=false|true
+isis.services.injector.setPrefix=false
+
+
 ################################################################################
 #
 # Policies