Index: conf/test/TestFulcrumComponents.properties
===================================================================
--- conf/test/TestFulcrumComponents.properties	(revision 1820266)
+++ conf/test/TestFulcrumComponents.properties	(working copy)
@@ -151,3 +151,10 @@
 # Determines if the scheduler service should be initialized early.  This
 # Should always be set to true!!!!
 services.SchedulerService.earlyInit=true
+
+
+#
+# T E S T  S E R V I C E
+#
+services.TestService.classname=org.apache.turbine.services.DefaultTestService
+services.TestService.earlyInit=true
Index: src/java/org/apache/turbine/annotation/AnnotationProcessor.java
===================================================================
--- src/java/org/apache/turbine/annotation/AnnotationProcessor.java	(revision 1820266)
+++ src/java/org/apache/turbine/annotation/AnnotationProcessor.java	(working copy)
@@ -32,6 +32,8 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.turbine.Turbine;
 import org.apache.turbine.modules.Loader;
+import org.apache.turbine.services.InstantiationException;
+import org.apache.turbine.services.Service;
 import org.apache.turbine.services.ServiceManager;
 import org.apache.turbine.services.TurbineServices;
 import org.apache.turbine.services.assemblerbroker.AssemblerBrokerService;
@@ -389,6 +391,7 @@
         }
 
         Object service = manager.getService(serviceName); // throws Exception on unknown service
+        manager.getInjectedAfterInitServices().add( serviceName );
         field.setAccessible(true);
 
         try
Index: src/java/org/apache/turbine/services/BaseServiceBroker.java
===================================================================
--- src/java/org/apache/turbine/services/BaseServiceBroker.java	(revision 1820269)
+++ src/java/org/apache/turbine/services/BaseServiceBroker.java	(working copy)
@@ -33,6 +33,7 @@
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.turbine.annotation.AnnotationProcessor;
 
 /**
  * A generic implementation of a <code>ServiceBroker</code> which
@@ -118,6 +119,7 @@
      */
     private final ConcurrentHashMap<String, Service> serviceProviderInstanceMap = new ConcurrentHashMap<String, Service>();
 
+    private final Set<String> injectedAfterInit = new LinkedHashSet<String>();
     /**
      * Default constructor, protected as to only be usable by subclasses.
      *
@@ -331,6 +333,13 @@
     {
         return mapping.keySet().iterator();
     }
+    
+    public Set<String> getInjectedAfterInitServices()
+    {
+        return injectedAfterInit;
+    }
+    
+    
 
     /**
      * Returns an Iterator over all known service names beginning with
@@ -374,10 +383,45 @@
         if (!instance.getInit())
         {
             // this call might result in an indirect recursion
-            instance.init();
+            instance.init();   
+            try
+            {
+             // convenience annotation in Turbine services 
+                AnnotationProcessor.process(instance);
+            }
+            catch ( Exception e )
+            {
+                throw new InstantiationException( e.getMessage(), e );
+            }
+
+        } else {
         }
     }
 
+    private void injectServicesAfterInit()
+    {
+        while (injectedAfterInit.size() > 0 ) {
+            for ( Iterator<String> iterator = injectedAfterInit.iterator(); iterator.hasNext(); )
+            {
+                String serviceName = (String) iterator.next();
+                if (!mapping.containsKey( serviceName ) ) { // do not resolve annoatations in non turbine services 
+                    iterator.remove(); 
+                    continue;
+                }
+                try
+                {
+                    // remove before underlying collection might be changed in process
+                    iterator.remove();
+                    AnnotationProcessor.process(getServiceInstance(serviceName));
+                }
+                catch ( Exception e )
+                {
+                    throw new InstantiationException( e.getMessage(), e );
+                }
+            }
+        }
+    }
+
     /**
      * Performs early initialization of all services.  Failed early
      * initialization of a Service may be non-fatal to the system,
@@ -420,6 +464,7 @@
             {
                 doInitService(names.next());
             }
+            injectServicesAfterInit(); 
         }
         else
         {
@@ -441,6 +486,14 @@
                     log.error(e);
                 }
             }
+            try
+            {
+                injectServicesAfterInit(); 
+            } 
+            catch (InstantiationException e)
+            {
+                log.error(e);
+            }
         }
         log.info("Finished initializing all services!");
     }
Index: src/java/org/apache/turbine/services/security/DefaultSecurityService.java
===================================================================
--- src/java/org/apache/turbine/services/security/DefaultSecurityService.java	(revision 1820266)
+++ src/java/org/apache/turbine/services/security/DefaultSecurityService.java	(working copy)
@@ -40,6 +40,7 @@
 import org.apache.fulcrum.security.util.PermissionSet;
 import org.apache.fulcrum.security.util.RoleSet;
 import org.apache.fulcrum.security.util.UnknownEntityException;
+import org.apache.turbine.annotation.TurbineService;
 import org.apache.turbine.om.security.User;
 import org.apache.turbine.services.InitializationException;
 import org.apache.turbine.services.ServiceManager;
@@ -78,6 +79,7 @@
     private UserManager userManager = null;
 
     /** The instance of GroupManager the SecurityService uses */
+    // @TurbineService( "org.apache.fulcrum.security.GroupManager") // requires early init or a reference in early init service
     private GroupManager groupManager;
 
     /** The instance of RoleManager the SecurityService uses */
Index: src/java/org/apache/turbine/services/ServiceBroker.java
===================================================================
--- src/java/org/apache/turbine/services/ServiceBroker.java	(revision 1820266)
+++ src/java/org/apache/turbine/services/ServiceBroker.java	(working copy)
@@ -1,6 +1,8 @@
 package org.apache.turbine.services;
 
 
+import java.util.Set;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -70,7 +72,7 @@
      * Shutdowns a Service.
      *
      * This method is used to release resources allocated by a
-     * Service, and return it to initial (uninitailized) state.
+     * Service, and return it to initial (uninitialized) state.
      *
      * @param name The name of the Service to be uninitialized.
      */
@@ -102,4 +104,10 @@
      * @return Configuration of the requested service.
      */
     Configuration getConfiguration(String name);
+    
+    /**
+     * 
+     * @return The injected / annotated service names  
+     */
+    Set<String> getInjectedAfterInitServices();
 }
Index: src/test/org/apache/turbine/services/LoadingComponentsTest.java
===================================================================
--- src/test/org/apache/turbine/services/LoadingComponentsTest.java	(revision 1820266)
+++ src/test/org/apache/turbine/services/LoadingComponentsTest.java	(working copy)
@@ -32,6 +32,7 @@
 import org.apache.fulcrum.localization.LocalizationService;
 import org.apache.fulcrum.mimetype.MimeTypeService;
 import org.apache.turbine.services.avaloncomponent.AvalonComponentService;
+import org.apache.turbine.services.security.SecurityService;
 import org.apache.turbine.test.BaseTestCase;
 import org.apache.turbine.util.TurbineConfig;
 import org.junit.AfterClass;
@@ -104,6 +105,12 @@
         assertNotNull(fs);
         MimeTypeService mimetype = (MimeTypeService)serviceManager.getService(MimeTypeService.ROLE);
         assertNotNull(mimetype);
+        
+        TestService testService = (TestService) serviceManager.getService( TestService.SERVICE_NAME );
+        assertNotNull(testService);
+        assertNotNull(testService.getTestServiceGroupSet());
+        SecurityService securityService = (SecurityService) serviceManager.getService( SecurityService.SERVICE_NAME );
+        assertNotNull(securityService);
     }
 
     /**
Index: src/test/org/apache/turbine/services/DefaultTestService.java
===================================================================
--- src/test/org/apache/turbine/services/DefaultTestService.java	(nonexistent)
+++ src/test/org/apache/turbine/services/DefaultTestService.java	(working copy)
@@ -0,0 +1,70 @@
+package org.apache.turbine.services;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.fulcrum.security.util.DataBackendException;
+import org.apache.fulcrum.security.util.GroupSet;
+import org.apache.fulcrum.security.util.UnknownEntityException;
+import org.apache.turbine.annotation.TurbineService;
+import org.apache.turbine.om.security.User;
+import org.apache.turbine.services.security.SecurityService;
+import org.apache.turbine.util.TurbineException;
+
+/**
+ * Test Service.
+ *
+ * @author <a href="mailto:gk@apache.org">Georg Kallidis</a>
+ */
+public class DefaultTestService
+        extends TurbineBaseService implements TestService
+{
+    
+    /** Logging */
+    protected static Log log = LogFactory.getLog(DefaultTestService.class.getName());
+    
+    @TurbineService
+    private SecurityService security;
+
+    /**
+     * Initializes the TestService.
+     *
+     * @throws InitializationException Something went wrong in the init stage
+     */
+    @Override
+    public void init()
+            throws InitializationException
+    {
+        // security null
+        setInit(true);
+    }
+
+    /**
+     * Shutdowns the service.
+     *
+     * This methods interrupts the housekeeping thread.
+     */
+    @Override
+    public void shutdown()
+    {
+    }
+
+    /** 
+     * @see org.apache.turbine.services.TestService#getTestServiceUserDomain()
+     */
+    @Override
+    public GroupSet getTestServiceGroupSet() throws TurbineException
+    {
+        GroupSet groupSet = null;
+        try
+        {
+            groupSet = security.getAllGroups();
+        }
+        catch ( DataBackendException e )
+        {
+            throw new TurbineException("Could not get groupSet " + groupSet, e);
+        }
+        return groupSet;
+    }
+
+}
+

Property changes on: src/test/org/apache/turbine/services/DefaultTestService.java
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: src/test/org/apache/turbine/services/TestService.java
===================================================================
--- src/test/org/apache/turbine/services/TestService.java	(nonexistent)
+++ src/test/org/apache/turbine/services/TestService.java	(working copy)
@@ -0,0 +1,14 @@
+package org.apache.turbine.services;
+
+import org.apache.fulcrum.security.util.GroupSet;
+import org.apache.turbine.util.TurbineException;
+
+public interface TestService
+{
+
+    String SERVICE_NAME = "TestService";
+    
+    GroupSet getTestServiceGroupSet()
+        throws TurbineException;
+
+}
\ No newline at end of file

Property changes on: src/test/org/apache/turbine/services/TestService.java
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
