001 /***************************************************************************** 002 * Copyright (C) PicoContainer Organization. All rights reserved. * 003 * ------------------------------------------------------------------------- * 004 * The software in this package is published under the terms of the BSD * 005 * style license a copy of which has been included with this distribution in * 006 * the LICENSE.txt file. * 007 * * 008 * Original code by * 009 *****************************************************************************/ 010 package org.picocontainer.injectors; 011 012 import org.picocontainer.ComponentAdapter; 013 import org.picocontainer.ComponentMonitor; 014 import org.picocontainer.LifecycleStrategy; 015 import org.picocontainer.Parameter; 016 import org.picocontainer.PicoCompositionException; 017 import static org.picocontainer.Characteristics.immutable; 018 019 import java.util.Properties; 020 021 /** 022 * A {@link org.picocontainer.InjectionFactory} for named fields. 023 * 024 * Use like so: pico.as(injectionFieldNames("field1", "field2")).addComponent(...) 025 * 026 * The factory creates {@link org.picocontainer.injectors.NamedFieldInjector}. 027 * 028 * @author Paul Hammant 029 */ 030 @SuppressWarnings("serial") 031 public class NamedFieldInjection extends AbstractInjectionFactory { 032 033 034 private static final String INJECTION_FIELD_NAMES = "injectionFieldNames"; 035 036 public <T> ComponentAdapter<T> createComponentAdapter(ComponentMonitor monitor, 037 LifecycleStrategy lifecycleStrategy, 038 Properties componentProperties, 039 Object componentKey, 040 Class<T> componentImplementation, 041 Parameter... parameters) throws PicoCompositionException { 042 String fieldNames = (String) componentProperties.remove(INJECTION_FIELD_NAMES); 043 if (fieldNames == null) { 044 fieldNames = ""; 045 } 046 return wrapLifeCycle(monitor.newInjector(new NamedFieldInjector(componentKey, componentImplementation, parameters, monitor, 047 fieldNames)), lifecycleStrategy); 048 } 049 050 public static Properties injectionFieldNames(String... fieldNames) { 051 StringBuilder sb = new StringBuilder(); 052 for (int i = 0; i < fieldNames.length; i++) { 053 sb.append(" ").append(fieldNames[i]); 054 } 055 Properties retVal = new Properties(); 056 return immutable(INJECTION_FIELD_NAMES, sb.toString().trim()); 057 } 058 059 }