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 the committers * 009 *****************************************************************************/ 010 package org.picocontainer.alternatives; 011 012 import java.io.Serializable; 013 014 import org.picocontainer.MutablePicoContainer; 015 import org.picocontainer.PicoContainer; 016 import org.picocontainer.defaults.ComponentAdapterFactory; 017 import org.picocontainer.defaults.ConstructorInjectionComponentAdapterFactory; 018 import org.picocontainer.defaults.DefaultPicoContainer; 019 import org.picocontainer.defaults.ImplementationHidingComponentAdapterFactory; 020 021 /** 022 * This special MutablePicoContainer hides implementations of components if the key is an interface. 023 * It's very simple. Instances that are registered directly and components registered without key 024 * are not hidden. Hiding is achieved with dynamic proxies from Java's reflection api. 025 * 026 * @see CachingPicoContainer 027 * @see ImplementationHidingCachingPicoContainer 028 * @author Paul Hammant 029 * @version $Revision: 2424 $ 030 */ 031 public class ImplementationHidingPicoContainer extends AbstractDelegatingMutablePicoContainer implements Serializable { 032 private final ComponentAdapterFactory caf; 033 034 /** 035 * Creates a new container with a parent container. 036 */ 037 public ImplementationHidingPicoContainer(ComponentAdapterFactory caf, PicoContainer parent) { 038 super(new DefaultPicoContainer(makeComponentAdapterFactory(caf), parent)); 039 this.caf = caf; 040 } 041 042 private static ImplementationHidingComponentAdapterFactory makeComponentAdapterFactory(ComponentAdapterFactory caf) { 043 if (caf instanceof ImplementationHidingComponentAdapterFactory) { 044 return (ImplementationHidingComponentAdapterFactory) caf; 045 } 046 return new ImplementationHidingComponentAdapterFactory(caf, false); 047 } 048 049 /** 050 * Creates a new container with a parent container. 051 */ 052 public ImplementationHidingPicoContainer(PicoContainer parent) { 053 this(makeComponentAdapterFactory(new ConstructorInjectionComponentAdapterFactory()), parent); 054 } 055 056 /** 057 * Creates a new container with a parent container. 058 */ 059 public ImplementationHidingPicoContainer(ComponentAdapterFactory caf) { 060 this(makeComponentAdapterFactory(caf), null); 061 } 062 063 064 /** 065 * Creates a new container with no parent container. 066 */ 067 public ImplementationHidingPicoContainer() { 068 this((PicoContainer) null); 069 } 070 071 072 public MutablePicoContainer makeChildContainer() { 073 ImplementationHidingPicoContainer pc = new ImplementationHidingPicoContainer(caf, this); 074 getDelegate().addChildContainer(pc); 075 return pc; 076 } 077 078 }