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 *****************************************************************************/
008package org.picocontainer;
009
010/**
011 * An interface which specifies the lifecycle strategy on the component instance.
012 * Lifecycle strategies are used by component adapters to delegate the lifecycle
013 * operations on the component instances.
014 *
015 * @author Paul Hammant
016 * @author Peter Royal
017 * @author Jörg Schaible
018 * @author Mauro Talevi
019 * @see org.picocontainer.Startable
020 * @see org.picocontainer.Disposable
021 */
022public interface LifecycleStrategy {
023    
024    /**
025     * Invoke the "start" method on the component instance if this is startable.
026     * It is up to the implementation of the strategy what "start" and "startable" means.
027     * 
028     * @param component the instance of the component to start
029     */
030    void start(Object component);
031    
032    /**
033     * Invoke the "stop" method on the component instance if this is stoppable.
034     * It is up to the implementation of the strategy what "stop" and "stoppable" means.
035     * 
036     * @param component the instance of the component to stop
037     */
038    void stop(Object component);
039
040    /**
041     * Invoke the "dispose" method on the component instance if this is disposable.
042     * It is up to the implementation of the strategy what "dispose" and "disposable" means.
043     * 
044     * @param component the instance of the component to dispose
045     */
046    void dispose(Object component);
047
048    /**
049     * Test if a component instance has a lifecycle.
050     * @param type the component's type
051     * 
052     * @return <code>true</code> if the component has a lifecycle
053     */
054    boolean hasLifecycle(Class<?> type);
055
056    /**
057     * Is a component eager (not lazy) in that it should start when start() or equivalent is called,
058     * or lazy (it will only start on first getComponent() ).
059     * The default is the first of those two.
060     *
061     * @param adapter
062     * @return true if lazy, false if not lazy
063     */
064    boolean isLazy(ComponentAdapter<?> adapter);
065}