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 2013/11/21 13:23:00 UTC

[5/5] git commit: ISIS-598: can now use @Inject on field...

ISIS-598: can now use @Inject on field...

... for dependency injection


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

Branch: refs/heads/master
Commit: ff4f466c2294f5dc2db5b5d3ff74111e3e9808ed
Parents: 96b4b51
Author: Dan Haywood <da...@apache.org>
Authored: Thu Nov 21 12:19:43 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Thu Nov 21 12:19:43 2013 +0000

----------------------------------------------------------------------
 .../RestfulObjectsSpecEventSerializer.java      |  15 ++-
 core/applib/pom.xml                             |   4 +
 .../isis/applib/fixtures/AbstractFixture.java   |   3 +-
 .../services/ServicesInjectorDefault.java       |  80 ++++++++++---
 .../services/ServicesInjectorAbstractTest.java  |  97 ----------------
 .../services/ServicesInjectorDefaultTest.java   |  97 ++++++++++++++++
 ...ServicesInjectorDefaultTest_usingFields.java | 112 +++++++++++++++++++
 core/pom.xml                                    |   7 +-
 .../dom/src/main/java/app/ToDoAppDashboard.java |   6 +-
 .../main/java/app/ToDoAppDashboardService.java  |  13 ++-
 .../dom/src/main/java/app/ToDoItemAnalysis.java |  16 ++-
 .../java/app/ToDoItemAnalysisContributions.java |  13 +--
 .../java/app/ToDoItemsByCategoryViewModel.java  |   9 +-
 .../java/app/ToDoItemsByDateRangeViewModel.java |  10 +-
 .../dom/src/main/java/dom/todo/ToDoItem.java    |  19 +---
 .../java/dom/todo/ToDoItemContributions.java    |   8 +-
 .../dom/src/main/java/dom/todo/ToDoItems.java   |  11 +-
 .../main/java/fixture/LogonAsSvenFixture.java   |  30 -----
 .../java/fixture/todo/ToDoItemsFixture.java     |  15 +--
 .../src/main/java/dom/simple/SimpleObject.java  |   5 +-
 .../src/main/java/dom/simple/SimpleObjects.java |  19 +++-
 .../dom/simple/SimpleObjectsTest_create.java    |   2 +-
 .../dom/simple/SimpleObjectsTest_listAll.java   |  12 +-
 .../main/java/fixture/LogonAsSvenFixture.java   |  30 -----
 .../fixture/simple/SimpleObjectsFixture.java    |  13 +--
 25 files changed, 368 insertions(+), 278 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java
index 81edb1a..6bfcde8 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java
@@ -27,6 +27,7 @@ import java.util.Map;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import javax.inject.Inject;
 
 import org.codehaus.jackson.JsonGenerationException;
 import org.codehaus.jackson.map.JsonMappingException;
@@ -120,16 +121,18 @@ public class RestfulObjectsSpecEventSerializer implements EventSerializer {
 
     // //////////////////////////////////////
 
+    @Inject
     @SuppressWarnings("unused")
     private DomainObjectContainer container;
-    public void setContainer(DomainObjectContainer container) {
-        this.container = container;
-    }
+//    public void setContainer(DomainObjectContainer container) {
+//        this.container = container;
+//    }
     
+    @Inject
     @SuppressWarnings("unused")
     private BookmarkService bookmarkService;
-    public void injectBookmarkService(BookmarkService bookmarkService) {
-        this.bookmarkService = bookmarkService;
-    }
+//    public void injectBookmarkService(BookmarkService bookmarkService) {
+//        this.bookmarkService = bookmarkService;
+//    }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/core/applib/pom.xml
----------------------------------------------------------------------
diff --git a/core/applib/pom.xml b/core/applib/pom.xml
index 2a6ce8e..4850dd0 100644
--- a/core/applib/pom.xml
+++ b/core/applib/pom.xml
@@ -87,6 +87,10 @@
 			<groupId>joda-time</groupId>
 			<artifactId>joda-time</artifactId>
 		</dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-atinject_1.0_spec</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.apache.isis.core</groupId>

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/core/applib/src/main/java/org/apache/isis/applib/fixtures/AbstractFixture.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixtures/AbstractFixture.java b/core/applib/src/main/java/org/apache/isis/applib/fixtures/AbstractFixture.java
index 9b49d6d..4db715b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixtures/AbstractFixture.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixtures/AbstractFixture.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.List;
 
 import com.google.common.base.Predicate;
+import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.annotation.Programmatic;
 
@@ -53,7 +54,7 @@ import org.apache.isis.applib.annotation.Programmatic;
  */
 public abstract class AbstractFixture extends BaseFixture implements CompositeFixture {
 
-    private final List<Object> fixtures = new ArrayList<Object>();
+    private final List<Object> fixtures = Lists.newArrayList();
 
     // ///////////////////////////////////////////////////////////////
     // Constructor

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
index ffe0564..d5c9730 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
@@ -24,6 +24,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.CoreMatchers.nullValue;
 
+import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Arrays;
@@ -31,6 +32,8 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import javax.inject.Inject;
+
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
@@ -59,10 +62,8 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
      */
     private final Map<Class<?>, List<Object>> servicesByType = Maps.newHashMap();
 
-    private final List<Object> services = Lists.newArrayList();
-    
     private DomainObjectContainer container;
-
+    private final List<Object> services = Lists.newArrayList();
 
     
     // /////////////////////////////////////////////////////////
@@ -169,27 +170,67 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
 
     private static void injectServices(final Object object, final List<Object> services) {
         final Class<?> cls = object.getClass();
+
+        autowireViaFields(object, services, cls);
+        autowireViaPrefixedMethods(object, services, cls, "set");
+        autowireViaPrefixedMethods(object, services, cls, "inject");
+    }
+
+    private static void autowireViaFields(final Object object, final List<Object> services, final Class<?> cls) {
+        final List<Field> fields = Arrays.asList(cls.getDeclaredFields());
+        final Iterable<Field> injectFields = Iterables.filter(fields, new Predicate<Field>() {
+            @Override
+            public boolean apply(Field input) {
+                final Inject annotation = input.getAnnotation(javax.inject.Inject.class);
+                return annotation != null;
+            }
+        });
+
+        for (final Field field : injectFields) {
+            for (final Object service : services) {
+                final Class<?> serviceClass = service.getClass();
+                boolean isInjectorField = isInjectorFieldFor(field, serviceClass);
+                if(isInjectorField) {
+                    field.setAccessible(true);
+                    invokeInjectorField(field, object, service);
+                }
+            }
+        }
         
+        // recurse up the hierarchy
+        final Class<?> superclass = cls.getSuperclass();
+        if(superclass != null) {
+            autowireViaFields(object, services, superclass);
+        }
+    }
+    
+    private static void autowireViaPrefixedMethods(final Object object, final List<Object> services, final Class<?> cls, final String prefix) {
         final List<Method> methods = Arrays.asList(cls.getMethods());
-        final Iterable<Method> setterAndInjectorMethods = Iterables.filter(methods, new Predicate<Method>(){
+        final Iterable<Method> prefixedMethods = Iterables.filter(methods, new Predicate<Method>(){
             public boolean apply(Method method) {
                 final String methodName = method.getName();
-                return methodName.startsWith("set") || methodName.startsWith("inject");
+                return methodName.startsWith(prefix);
             }
         });
         
-        for (final Method method : setterAndInjectorMethods) {
+        for (final Method prefixedMethod : prefixedMethods) {
             for (final Object service : services) {
                 final Class<?> serviceClass = service.getClass();
-                boolean isInjectorMethod = isInjectorMethodFor(method, serviceClass);
+                boolean isInjectorMethod = isInjectorMethodFor(prefixedMethod, serviceClass);
                 if(isInjectorMethod) {
-                    method.setAccessible(true);
-                    invokeSetMethod(method, object, service);
+                    prefixedMethod.setAccessible(true);
+                    invokeInjectorMethod(prefixedMethod, object, service);
                 }
             }
         }
     }
 
+    private static boolean isInjectorFieldFor(final Field field, final Class<?> serviceClass) {
+        final Class<?> type = field.getType();
+        // don't think that type can ever be null, but Javadoc for java.lang.reflect.Field doesn't say
+        return type != null && type.isAssignableFrom(serviceClass);
+    }
+
     public static boolean isInjectorMethodFor(Method method, final Class<?> serviceClass) {
         final String methodName = method.getName();
         if (methodName.startsWith("set") || methodName.startsWith("inject")) {
@@ -200,7 +241,7 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
         }
         return false;
     }
-
+    
     private static void invokeMethod(final Method method, final Object target, final Object[] parameters) {
         try {
             method.invoke(target, parameters);
@@ -220,14 +261,27 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
         }
     }
 
-    private static void invokeSetMethod(final Method set, final Object target, final Object parameter) {
-        final Object[] parameters = new Object[] { parameter };
-        invokeMethod(set, target, parameters);
+    private static void invokeInjectorField(final Field field, final Object target, final Object parameter) {
+        try {
+            field.set(target, parameter);
+        } catch (IllegalArgumentException e) {
+            throw new MetaModelException(e);
+        } catch (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 " + parameter + " into " + 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 " + parameter + " into " + new ToString(target));
+        }
+    }
+    
     private void autowireServicesAndContainer() {
         injectServicesInto(this.services);
         injectServicesInto(this.container);

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorAbstractTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorAbstractTest.java
deleted file mode 100644
index 360f530..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorAbstractTest.java
+++ /dev/null
@@ -1,97 +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.core.metamodel.services;
-
-import java.util.Arrays;
-
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-
-public class ServicesInjectorAbstractTest {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
-
-    @Mock
-    private DomainObjectContainerExtended mockContainer;
-    @Mock
-    private Service1 mockService1;
-    @Mock
-    private Service2 mockService2;
-    @Mock
-    private SomeDomainObject mockDomainObject;
-    
-    private ServicesInjectorSpi injector;
-
-    static interface Service1 {
-    }
-
-    static interface Service2 {
-    }
-
-    static interface Mixin {
-    }
-
-    static interface DomainObjectContainerExtended extends DomainObjectContainer, Mixin {
-    }
-
-    static interface SomeDomainObject {
-        public void setContainer(DomainObjectContainer container);
-        public void setMixin(Mixin mixin);
-        public void setService1(Service1 service);
-        public void setService2(Service2 service);
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        injector = new ServicesInjectorDefault();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-    }
-
-    @Test
-    public void shouldInjectContainer() {
-        injector.setContainer(mockContainer);
-        final Object[] services = { mockService1, mockService2 };
-        injector.setServices(Arrays.asList(services));
-
-        context.checking(new Expectations() {
-            {
-                one(mockDomainObject).setContainer(mockContainer);
-                one(mockDomainObject).setMixin(mockContainer);
-                one(mockDomainObject).setService1(mockService1);
-                one(mockDomainObject).setService2(mockService2);
-            }
-        });
-
-        injector.injectServicesInto(mockDomainObject);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/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
new file mode 100644
index 0000000..e3e2bcc
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
@@ -0,0 +1,97 @@
+/*
+ *  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.core.metamodel.services;
+
+import java.util.Arrays;
+
+import org.jmock.Expectations;
+import org.jmock.auto.Mock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+
+public class ServicesInjectorDefaultTest {
+
+    @Rule
+    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
+
+    @Mock
+    private DomainObjectContainerExtended mockContainer;
+    @Mock
+    private Service1 mockService1;
+    @Mock
+    private Service2 mockService2;
+    @Mock
+    private SomeDomainObject mockDomainObject;
+    
+    private ServicesInjectorSpi injector;
+
+    static interface Service1 {
+    }
+
+    static interface Service2 {
+    }
+
+    static interface Mixin {
+    }
+
+    static interface DomainObjectContainerExtended extends DomainObjectContainer, Mixin {
+    }
+
+    static interface SomeDomainObject {
+        public void setContainer(DomainObjectContainer container);
+        public void setMixin(Mixin mixin);
+        public void setService1(Service1 service);
+        public void setService2(Service2 service);
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        injector = new ServicesInjectorDefault();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void shouldInjectContainer() {
+        injector.setContainer(mockContainer);
+        final Object[] services = { mockService1, mockService2 };
+        injector.setServices(Arrays.asList(services));
+
+        context.checking(new Expectations() {
+            {
+                one(mockDomainObject).setContainer(mockContainer);
+                one(mockDomainObject).setMixin(mockContainer);
+                one(mockDomainObject).setService1(mockService1);
+                one(mockDomainObject).setService2(mockService2);
+            }
+        });
+
+        injector.injectServicesInto(mockDomainObject);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/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
new file mode 100644
index 0000000..1657249
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
@@ -0,0 +1,112 @@
+/*
+ *  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.core.metamodel.services;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+
+import javax.inject.Inject;
+
+import org.jmock.Expectations;
+import org.jmock.auto.Mock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.isis.applib.DomainObjectContainer;
+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;
+
+public class ServicesInjectorDefaultTest_usingFields {
+
+    @Rule
+    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
+
+    private DomainObjectContainer container;
+    
+    private SomeDomainService1 service1;
+    private SomeDomainService2 service2;
+    private SomeDomainService3 service3;
+    
+    private ServicesInjectorSpi injector;
+
+
+    static class SomeDomainService3 { }
+
+    static class SomeDomainService1 {
+        @Inject
+        private DomainObjectContainer container;
+        DomainObjectContainer getContainer() {
+            return container;
+        }
+        @Inject
+        private SomeDomainService2Abstract someDomainService2;
+        SomeDomainService2Abstract getSomeDomainService2() {
+            return someDomainService2;
+        }
+    }
+    static abstract class SomeDomainService2Abstract {
+        @Inject
+        private SomeDomainService1 someDomainService1;
+        SomeDomainService1 getSomeDomainService1() {
+            return someDomainService1;
+        }
+    }
+    static class SomeDomainService2 extends SomeDomainService2Abstract {
+        @Inject
+        private SomeDomainService3 someDomainService3;
+        SomeDomainService3 getSomeDomainService3() {
+            return someDomainService3;
+        }
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        container = new DomainObjectContainerDefault();
+        service1 = new SomeDomainService1();
+        service3 = new SomeDomainService3();
+        service2 = new SomeDomainService2();
+        injector = new ServicesInjectorDefault();
+    }
+
+    @Test
+    public void shouldInjectContainer() {
+        injector.setContainer(container);
+        injector.setServices(Arrays.asList(service1, service3, service2));
+
+        injector.injectServicesInto(container);
+        injector.injectServicesInto(service1);
+        injector.injectServicesInto(service2);
+        injector.injectServicesInto(service3);
+        
+        assertThat(service1.getContainer(), is(container));
+        assertThat(service1.getSomeDomainService2(), is((SomeDomainService2Abstract)service2));
+        
+        assertThat(service2.getSomeDomainService1(), is(service1));
+        
+        assertThat(service2.getSomeDomainService1(), is(service1));
+        assertThat(service2.getSomeDomainService3(), is(service3));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 4c049fb..14523b1 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -1477,7 +1477,12 @@ ${license.additional-notes}
                 <artifactId>geronimo-javamail_1.4_spec</artifactId>
                 <version>1.7.1</version>
             </dependency>
-        
+            <dependency>
+                <groupId>org.apache.geronimo.specs</groupId>
+                <artifactId>geronimo-atinject_1.0_spec</artifactId>
+                <version>1.0</version>
+            </dependency>
+
            <dependency>
                <groupId>org.picocontainer</groupId>
                <artifactId>picocontainer</artifactId>

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboard.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboard.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboard.java
index 4fea1b5..61141e5 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboard.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboard.java
@@ -80,11 +80,7 @@ public class ToDoAppDashboard extends AbstractViewModel {
     // injected services
     // //////////////////////////////////////
     
+    @javax.inject.Inject
     private ToDoItemAnalysis toDoItemAnalysis;
-    
-    public void injectToDoItemAnalysis(ToDoItemAnalysis toDoItemAnalysis) {
-        this.toDoItemAnalysis = toDoItemAnalysis;
-    }
-
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboardService.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboardService.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboardService.java
index 4b8e2772..95534dd 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboardService.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboardService.java
@@ -18,14 +18,14 @@
  */
 package app;
 
-import org.apache.isis.applib.AbstractService;
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.applib.annotation.Hidden;
 import org.apache.isis.applib.annotation.HomePage;
 
 @Hidden
-public class ToDoAppDashboardService extends AbstractService {
+public class ToDoAppDashboardService  {
 
     private static final String ID = "dashboard";
 
@@ -42,8 +42,15 @@ public class ToDoAppDashboardService extends AbstractService {
     @ActionSemantics(Of.SAFE)
     @HomePage
     public ToDoAppDashboard lookup() {
-        return newViewModelInstance(ToDoAppDashboard.class, ID);
+        return container.newViewModelInstance(ToDoAppDashboard.class, ID);
     }
 
+    
+    // //////////////////////////////////////
+    // Injected services
+    // //////////////////////////////////////
+
+    @javax.inject.Inject
+    private DomainObjectContainer container;
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysis.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysis.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysis.java
index 44475b4..a102c48 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysis.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysis.java
@@ -27,7 +27,7 @@ import com.google.common.collect.Lists;
 
 import dom.todo.ToDoItem.Category;
 
-import org.apache.isis.applib.AbstractFactoryAndRepository;
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.applib.annotation.Bookmarkable;
@@ -36,13 +36,12 @@ import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.Programmatic;
 
 @Named("Analysis")
-public class ToDoItemAnalysis extends AbstractFactoryAndRepository {
+public class ToDoItemAnalysis {
 
     // //////////////////////////////////////
     // Identification in the UI
     // //////////////////////////////////////
 
-    @Override
     public String getId() {
         return "analysis";
     }
@@ -69,7 +68,7 @@ public class ToDoItemAnalysis extends AbstractFactoryAndRepository {
              @Override
              public ToDoItemsByCategoryViewModel apply(final Category category) {
                  final ToDoItemsByCategoryViewModel byCategory = 
-                     getContainer().newViewModelInstance(ToDoItemsByCategoryViewModel.class, category.name());
+                     container.newViewModelInstance(ToDoItemsByCategoryViewModel.class, category.name());
                  byCategory.setCategory(category);
                  return byCategory;
              }
@@ -103,7 +102,7 @@ public class ToDoItemAnalysis extends AbstractFactoryAndRepository {
              @Override
              public ToDoItemsByDateRangeViewModel apply(final DateRange dateRange) {
                  final ToDoItemsByDateRangeViewModel byDateRange = 
-                     getContainer().newViewModelInstance(ToDoItemsByDateRangeViewModel.class, dateRange.name());
+                     container.newViewModelInstance(ToDoItemsByDateRangeViewModel.class, dateRange.name());
                  byDateRange.setDateRange(dateRange);
                  return byDateRange;
              }
@@ -121,4 +120,11 @@ public class ToDoItemAnalysis extends AbstractFactoryAndRepository {
     }
     
 
+    // //////////////////////////////////////
+    // Injected services
+    // //////////////////////////////////////
+
+    @javax.inject.Inject
+    private DomainObjectContainer container;
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysisContributions.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysisContributions.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysisContributions.java
index 158f113..c9b40a0 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysisContributions.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysisContributions.java
@@ -20,16 +20,15 @@ package app;
 
 import dom.todo.ToDoItem;
 
-import org.apache.isis.applib.AbstractFactoryAndRepository;
 import org.apache.isis.applib.annotation.ActionSemantics;
-import org.apache.isis.applib.annotation.NotContributed;
-import org.apache.isis.applib.annotation.NotInServiceMenu;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
-import org.apache.isis.applib.annotation.NotContributed.As;
 import org.apache.isis.applib.annotation.Hidden;
+import org.apache.isis.applib.annotation.NotContributed;
+import org.apache.isis.applib.annotation.NotContributed.As;
+import org.apache.isis.applib.annotation.NotInServiceMenu;
 
 @Hidden
-public class ToDoItemAnalysisContributions extends AbstractFactoryAndRepository {
+public class ToDoItemAnalysisContributions {
 
 
     // //////////////////////////////////////
@@ -48,8 +47,6 @@ public class ToDoItemAnalysisContributions extends AbstractFactoryAndRepository
     // injected services
     // //////////////////////////////////////
 
+    @javax.inject.Inject
     private ToDoItemAnalysis toDoAppAnalysis;
-    public void injectToDoAppAnalysis(ToDoItemAnalysis toDoAppAnalysis) {
-        this.toDoAppAnalysis = toDoAppAnalysis;
-    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java
index efc826d..a4c5f90 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java
@@ -32,10 +32,7 @@ import dom.todo.ToDoItem.Subcategory;
 import dom.todo.ToDoItems;
 
 import org.apache.isis.applib.AbstractViewModel;
-import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Bookmarkable;
-import org.apache.isis.applib.annotation.Bounded;
-import org.apache.isis.applib.annotation.Disabled;
 import org.apache.isis.applib.annotation.MultiLine;
 import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.Render;
@@ -178,11 +175,7 @@ public class ToDoItemsByCategoryViewModel
     // injected services
     // //////////////////////////////////////
     
+    @javax.inject.Inject
     private ToDoItems toDoItems;
 
-    public void injectedToDoItems(final ToDoItems toDoItems) {
-        this.toDoItems = toDoItems;
-    }
-
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java
index bf62ffc..947315e 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java
@@ -33,6 +33,7 @@ import dom.todo.ToDoItems;
 import org.joda.time.DateTime;
 
 import org.apache.isis.applib.AbstractViewModel;
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.Bookmarkable;
 import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.Render;
@@ -149,15 +150,10 @@ public class ToDoItemsByDateRangeViewModel
     // injected services
     // //////////////////////////////////////
     
+    @javax.inject.Inject
     private ToDoItems toDoItems;
 
-    public void injectedToDoItems(final ToDoItems toDoItems) {
-        this.toDoItems = toDoItems;
-    }
-
+    @javax.inject.Inject
     private ClockService clockService;
-    public void injectClockService(ClockService clockService) {
-        this.clockService = clockService;
-    }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
index 89e024a..7b96700 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
@@ -39,12 +39,10 @@ import com.google.common.collect.Ordering;
 import org.joda.time.LocalDate;
 
 import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.Audited;
 import org.apache.isis.applib.annotation.AutoComplete;
 import org.apache.isis.applib.annotation.Bookmarkable;
 import org.apache.isis.applib.annotation.Bulk;
-import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.applib.annotation.Bulk.InteractionContext;
 import org.apache.isis.applib.annotation.CssClass;
 import org.apache.isis.applib.annotation.Disabled;
@@ -64,7 +62,6 @@ import org.apache.isis.applib.annotation.SortedBy;
 import org.apache.isis.applib.annotation.TypicalLength;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.clock.Clock;
-import org.apache.isis.applib.services.xmlsnapshot.XmlSnapshotService;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.TitleBuffer;
 import org.apache.isis.applib.value.Blob;
@@ -704,22 +701,15 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     // Injected Services
     // //////////////////////////////////////
 
+    @javax.inject.Inject
     private DomainObjectContainer container;
 
-    public void injectDomainObjectContainer(final DomainObjectContainer container) {
-        this.container = container;
-    }
-
+    @javax.inject.Inject
     private ToDoItems toDoItems;
 
-    public void injectToDoItems(final ToDoItems toDoItems) {
-        this.toDoItems = toDoItems;
-    }
-
+    @javax.inject.Inject
+    @SuppressWarnings("unused")
     private ClockService clockService;
-    public void injectClockService(ClockService clockService) {
-        this.clockService = clockService;
-    }
     
     // //////////////////////////////////////
     // Extensions
@@ -739,6 +729,5 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
 //    public void setLocation(Location location) {
 //        this.location = location;
 //    }
-
     
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
index ed7eced..6f8152c 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
@@ -206,10 +206,12 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
         return getContainer().getUser().getName();
     }
 
+
+    // //////////////////////////////////////
+    // Injected services
     // //////////////////////////////////////
 
+    @javax.inject.Inject
     private ToDoItems toDoItems;
-    public void injectToDoItems(ToDoItems toDoItems) {
-        this.toDoItems = toDoItems;
-    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
index 57e7dfc..4643f12 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
@@ -38,7 +38,6 @@ import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.Optional;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RegEx;
-import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.applib.query.QueryDefault;
 
 import services.ClockService;
@@ -242,17 +241,11 @@ public class ToDoItems {
     // Injected Services
     // //////////////////////////////////////
 
-    
+    @javax.inject.Inject
     private DomainObjectContainer container;
 
-    public void injectDomainObjectContainer(final DomainObjectContainer container) {
-        this.container = container;
-    }
-
+    @javax.inject.Inject
     private ClockService clockService;
-    public void injectClockService(ClockService clockService) {
-        this.clockService = clockService;
-    }
 
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java b/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java
deleted file mode 100644
index 5bdc6fe..0000000
--- a/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java
+++ /dev/null
@@ -1,30 +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 fixture;
-
-import org.apache.isis.applib.fixtures.LogonFixture;
-
-public class LogonAsSvenFixture extends LogonFixture {
-
-    public LogonAsSvenFixture() {
-        super("sven");
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java b/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java
index 0ca9e02..10f12f3 100644
--- a/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java
+++ b/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java
@@ -88,20 +88,15 @@ public class ToDoItemsFixture extends AbstractFixture {
         return date.plusDays(i);
     }
 
-    
-    // //////////////////////////////////////
 
+    // //////////////////////////////////////
+    // Injected services
+    // //////////////////////////////////////
 
+    @javax.inject.Inject
     private ToDoItems toDoItems;
 
-    public void setToDoItems(final ToDoItems toDoItems) {
-        this.toDoItems = toDoItems;
-    }
-
-    
+    @javax.inject.Inject
     private IsisJdoSupport isisJdoSupport;
-    public void injectIsisJdoSupport(IsisJdoSupport isisJdoSupport) {
-        this.isisJdoSupport = isisJdoSupport;
-    }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java
index 0597341..b48b45d 100644
--- a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java
+++ b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java
@@ -69,10 +69,9 @@ public class SimpleObject implements Comparable<SimpleObject> {
     // Injected
     // //////////////////////////////////////
 
+
+    @javax.inject.Inject
     @SuppressWarnings("unused")
     private DomainObjectContainer container;
-    public void injectDomainObjectContainer(final DomainObjectContainer container) {
-        this.container = container;
-    }
     
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
index 5bca784..13cd192 100644
--- a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
+++ b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
@@ -20,20 +20,19 @@ package dom.simple;
 
 import java.util.List;
 
-import org.apache.isis.applib.AbstractFactoryAndRepository;
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.applib.annotation.Bookmarkable;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Named;
 
-public class SimpleObjects extends AbstractFactoryAndRepository {
+public class SimpleObjects {
 
     // //////////////////////////////////////
     // Identification in the UI
     // //////////////////////////////////////
 
-    @Override
     public String getId() {
         return "simple";
     }
@@ -50,7 +49,7 @@ public class SimpleObjects extends AbstractFactoryAndRepository {
     @ActionSemantics(Of.SAFE)
     @MemberOrder(sequence = "1")
     public List<SimpleObject> listAll() {
-        return allInstances(SimpleObject.class);
+        return container.allInstances(SimpleObject.class);
     }
 
 
@@ -61,10 +60,18 @@ public class SimpleObjects extends AbstractFactoryAndRepository {
     @MemberOrder(sequence = "2")
     public SimpleObject create(
             final @Named("Name") String name) {
-        final SimpleObject obj = newTransientInstance(SimpleObject.class);
+        final SimpleObject obj = container.newTransientInstance(SimpleObject.class);
         obj.setName(name);
-        persistIfNotAlready(obj);
+        container.persistIfNotAlready(obj);
         return obj;
     }
 
+    
+    // //////////////////////////////////////
+    // Injected services
+    // //////////////////////////////////////
+
+    @javax.inject.Inject 
+    DomainObjectContainer container;
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_create.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_create.java b/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_create.java
index d9b2031..f4ad5d3 100644
--- a/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_create.java
+++ b/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_create.java
@@ -44,7 +44,7 @@ public class SimpleObjectsTest_create {
     @Before
     public void setUp() throws Exception {
         simpleObjects = new SimpleObjects();
-        simpleObjects.setContainer(mockContainer);
+        simpleObjects.container = mockContainer;
     }
     
     @Test

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_listAll.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_listAll.java b/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_listAll.java
index a32515b..d970432 100644
--- a/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_listAll.java
+++ b/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_listAll.java
@@ -16,17 +16,14 @@
  */
 package dom.simple;
 
-import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
 import java.util.List;
 
 import com.google.common.collect.Lists;
 
-import dom.simple.SimpleObject;
-
 import org.jmock.Expectations;
-import org.jmock.Sequence;
 import org.jmock.auto.Mock;
 import org.junit.Before;
 import org.junit.Rule;
@@ -49,15 +46,14 @@ public class SimpleObjectsTest_listAll {
     @Before
     public void setUp() throws Exception {
         simpleObjects = new SimpleObjects();
-        simpleObjects.setContainer(mockContainer);
+        simpleObjects.container = mockContainer;
     }
     
     @Test
     public void happyCase() throws Exception {
         
-        
         // given
-        final List all = Lists.newArrayList();
+        final List<SimpleObject> all = Lists.newArrayList();
         
         context.checking(new Expectations() {
             {
@@ -67,7 +63,7 @@ public class SimpleObjectsTest_listAll {
         });
         
         // when
-        final List list = simpleObjects.listAll();
+        final List<SimpleObject> list = simpleObjects.listAll();
         
         // then
         assertThat(list, is(all));

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java b/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java
deleted file mode 100644
index 5bdc6fe..0000000
--- a/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java
+++ /dev/null
@@ -1,30 +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 fixture;
-
-import org.apache.isis.applib.fixtures.LogonFixture;
-
-public class LogonAsSvenFixture extends LogonFixture {
-
-    public LogonAsSvenFixture() {
-        super("sven");
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java b/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java
index 07317ea..148fc42 100644
--- a/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java
+++ b/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java
@@ -54,18 +54,13 @@ public class SimpleObjectsFixture extends AbstractFixture {
 
 
     // //////////////////////////////////////
+    // Injected services
+    // //////////////////////////////////////
 
-
+    @javax.inject.Inject
     private SimpleObjects simpleObjects;
 
-    public void injectSimpleObjects(final SimpleObjects simpleObjects) {
-        this.simpleObjects = simpleObjects;
-    }
-
-    
+    @javax.inject.Inject
     private IsisJdoSupport isisJdoSupport;
-    public void injectIsisJdoSupport(IsisJdoSupport isisJdoSupport) {
-        this.isisJdoSupport = isisJdoSupport;
-    }
 
 }