Index: src/java/org/picocontainer/PicoContainer.java
===================================================================
--- src/java/org/picocontainer/PicoContainer.java	(revision 5434)
+++ src/java/org/picocontainer/PicoContainer.java	(working copy)
@@ -38,7 +38,7 @@
      */
     Object getComponent(Object componentKeyOrType);
 
-    Object getComponent(Object componentKeyOrType, Type into);
+    Object getComponent(Object componentKeyOrType, Type into, Object targetKey);
 
     /**
      * Retrieve a component keyed by the component type.
Index: src/java/org/picocontainer/DefaultPicoContainer.java
===================================================================
--- src/java/org/picocontainer/DefaultPicoContainer.java	(revision 5434)
+++ src/java/org/picocontainer/DefaultPicoContainer.java	(working copy)
@@ -132,6 +132,9 @@
 
 
     private transient IntoThreadLocal intoThreadLocal = new IntoThreadLocal();
+    
+    
+    private transient TargetKeyThreadLocal targetKeyThreadLocal = new TargetKeyThreadLocal();
 
 
     /**
@@ -560,13 +563,15 @@
         return getComponent(componentKeyOrType, null);
     }
 
-    public Object getComponent(final Object componentKeyOrType, Type into) {
+    public Object getComponent(final Object componentKeyOrType, Type into, Object targetKey) {
         synchronized (this) {
             if (intoThreadLocal == null) {
                 intoThreadLocal = new IntoThreadLocal();
+                targetKeyThreadLocal = new TargetKeyThreadLocal();
             }
         }
         intoThreadLocal.set(into);
+        targetKeyThreadLocal.set(targetKey);
         return getComponent(componentKeyOrType, (Class<? extends Annotation>) null);
     }
 
@@ -604,14 +609,16 @@
             Object instance;
             try {
                 if (componentAdapter instanceof FactoryInjector) {
-                    instance = ((FactoryInjector) componentAdapter).getComponentInstance(this, intoThreadLocal.get());
+                    instance = ((FactoryInjector) componentAdapter).getComponentInstance(this, intoThreadLocal.get(), targetKeyThreadLocal.get());
                 } else {
                     synchronized (this) {
                         if (intoThreadLocal == null) {
                             intoThreadLocal = new IntoThreadLocal();
+                            targetKeyThreadLocal = new TargetKeyThreadLocal();
                         }
                     }
                     intoThreadLocal.set(componentAdapter.getComponentImplementation());
+                    targetKeyThreadLocal.set(componentAdapter.getComponentKey());
                     instance = componentAdapter.getComponentInstance(this, ComponentAdapter.NOTHING.class);
                 }
             } catch (AbstractInjector.CyclicDependencyException e) {
@@ -1050,4 +1057,10 @@
             return ComponentAdapter.NOTHING.class;
         }
     }
+    
+    private static class TargetKeyThreadLocal extends ThreadLocal<Object> implements Serializable {
+        protected Object initialValue() {
+            return null;
+        }
+    }
 }
Index: src/java/org/picocontainer/injectors/FactoryInjector.java
===================================================================
--- src/java/org/picocontainer/injectors/FactoryInjector.java	(revision 5434)
+++ src/java/org/picocontainer/injectors/FactoryInjector.java	(working copy)
@@ -143,6 +143,11 @@
     }
 
     public abstract T getComponentInstance(PicoContainer container, Type into);
+    
+    public T getComponentInstance(PicoContainer container, Type into, Object targetKey)
+    {
+    	return getComponentInstance(container, into);
+    }
 
     public Object decorateComponentInstance(PicoContainer container, Type into, T instance) {
         return null;
Index: src/java/org/picocontainer/containers/EmptyPicoContainer.java
===================================================================
--- src/java/org/picocontainer/containers/EmptyPicoContainer.java	(revision 5434)
+++ src/java/org/picocontainer/containers/EmptyPicoContainer.java	(working copy)
@@ -35,7 +35,7 @@
         return null;
     }
 
-    public Object getComponent(Object componentKeyOrType, Type into) {
+    public Object getComponent(Object componentKeyOrType, Type into, Object targetKey) {
         return null;
     }
 
Index: src/java/org/picocontainer/containers/AbstractDelegatingPicoContainer.java
===================================================================
--- src/java/org/picocontainer/containers/AbstractDelegatingPicoContainer.java	(revision 5434)
+++ src/java/org/picocontainer/containers/AbstractDelegatingPicoContainer.java	(working copy)
@@ -54,8 +54,8 @@
 		return delegate.getComponent(componentKeyOrType);
 	}
 
-    public Object getComponent(Object componentKeyOrType, Type into) {
-        return delegate.getComponent(componentKeyOrType, into);
+    public Object getComponent(Object componentKeyOrType, Type into, Object targetKey) {
+        return delegate.getComponent(componentKeyOrType, into, targetKey);
     }
 
     public <T> ComponentAdapter<T> getComponentAdapter(Class<T> componentType,
Index: src/java/org/picocontainer/containers/ImmutablePicoContainer.java
===================================================================
--- src/java/org/picocontainer/containers/ImmutablePicoContainer.java	(revision 5434)
+++ src/java/org/picocontainer/containers/ImmutablePicoContainer.java	(working copy)
@@ -42,8 +42,8 @@
         return delegate.getComponent(componentKeyOrType);
     }
 
-    public Object getComponent(Object componentKeyOrType, Type into) {
-        return delegate.getComponent(componentKeyOrType, into);
+    public Object getComponent(Object componentKeyOrType, Type into, Object targetKey) {
+        return delegate.getComponent(componentKeyOrType, into, targetKey);
     }
 
     public <T> T getComponent(Class<T> componentType) {
Index: src/java/org/picocontainer/classname/DefaultClassLoadingPicoContainer.java
===================================================================
--- src/java/org/picocontainer/classname/DefaultClassLoadingPicoContainer.java	(revision 5434)
+++ src/java/org/picocontainer/classname/DefaultClassLoadingPicoContainer.java	(working copy)
@@ -454,8 +454,8 @@
             return DefaultClassLoadingPicoContainer.this.getComponent(componentKeyOrType);
         }
 
-        public Object getComponent(Object componentKeyOrType, Type into) {
-            return DefaultClassLoadingPicoContainer.this.getComponent(componentKeyOrType, into);
+        public Object getComponent(Object componentKeyOrType, Type into, Object targetKey) {
+            return DefaultClassLoadingPicoContainer.this.getComponent(componentKeyOrType, into, targetKey);
         }
 
         public <T> T getComponent(Class<T> componentType) {
Index: src/java/org/picocontainer/parameters/BasicComponentParameter.java
===================================================================
--- src/java/org/picocontainer/parameters/BasicComponentParameter.java	(revision 5434)
+++ src/java/org/picocontainer/parameters/BasicComponentParameter.java	(working copy)
@@ -187,7 +187,7 @@
                 if (componentAdapter instanceof DefaultPicoContainer.LateInstance) {
                     o = ((DefaultPicoContainer.LateInstance) componentAdapter).getComponentInstance();
                 } else {
-                    o = container.getComponent(componentAdapter.getComponentKey(), forAdapter.getComponentImplementation());
+                    o = container.getComponent(componentAdapter.getComponentKey(), forAdapter.getComponentImplementation(), forAdapter.getComponentKey());
                 }
                 if (o instanceof String && expectedType != String.class) {
                     Converter converter = stringConverters.get(expectedType);
Index: src/test/org/picocontainer/injectors/FactoryInjectorTestCase.java
===================================================================
--- src/test/org/picocontainer/injectors/FactoryInjectorTestCase.java	(revision 5434)
+++ src/test/org/picocontainer/injectors/FactoryInjectorTestCase.java	(working copy)
@@ -9,6 +9,7 @@
 package org.picocontainer.injectors;
 
 import org.junit.Test;
+import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertEquals;
 import org.picocontainer.MutablePicoContainer;
@@ -230,4 +231,36 @@
         Tree tree = pico.getComponent(Tree.class);
     }
 
+    private static class KeyAwareSwedeFactoryInjector extends FactoryInjector<Swede> {
+        public Swede getComponentInstance(PicoContainer container, final Type into) throws PicoCompositionException {
+        	return getComponentInstance(container, into, null);
+        }
+
+    	public Swede getComponentInstance(PicoContainer container, final Type into, final Object targetKey) throws PicoCompositionException {
+            // Mauro: you can do anything in here by way of startegy for injecting a specific logger :-)
+            return new Swede() {
+                public String toString() {
+                    return "Swede for " + ((Class) into).getName() + " " + targetKey;
+                }
+            };
+        }
+    }
+
+    @Test
+    public void testThatFactoryCanUseTargetComponentKey()
+    {
+        MutablePicoContainer container = new DefaultPicoContainer(new MultiInjection());
+        container.addComponent(String.class, "foo");
+        container.addComponent("turnip1", Turnip.class);
+        container.addComponent("turnip2", Turnip.class);
+        container.addAdapter(new KeyAwareSwedeFactoryInjector());
+        Turnip turnip1 = (Turnip)container.getComponent("turnip1");
+        Turnip turnip2 = (Turnip)container.getComponent("turnip2");
+        assertNotNull(turnip1);
+        assertNotNull(turnip2);
+        assertNotSame(turnip1, turnip2);
+        assertNotSame(turnip1.getSwede(), turnip2.getSwede());
+        assertEquals("Swede for " + Turnip.class.getName() + " turnip1", turnip1.getSwede().toString());
+        assertEquals("Swede for " + Turnip.class.getName() + " turnip2", turnip2.getSwede().toString());        
+    }
 }

