001    /*
002     * ============================================================================
003     * GNU Lesser General Public License
004     * ============================================================================
005     *
006     * Beanlet - JSE Application Container.
007     * Copyright (C) 2006  Leon van Zantvoort
008     * 
009     * This library is free software; you can redistribute it and/or
010     * modify it under the terms of the GNU Lesser General Public
011     * License as published by the Free Software Foundation; either
012     * version 2.1 of the License, or (at your option) any later version.
013     * 
014     * This library is distributed in the hope that it will be useful,
015     * but WITHOUT ANY WARRANTY; without even the implied warranty of
016     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
017     * Lesser General Public License for more details.
018     * 
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
022     * 
023     * Leon van Zantvoort
024     * 243 Acalanes Drive #11
025     * Sunnyvale, CA 94086
026     * USA
027     *
028     * zantvoort@users.sourceforge.net
029     * http://beanlet.org
030     */
031    package org.beanlet;
032    
033    import java.lang.annotation.ElementType;
034    import java.lang.annotation.Retention;
035    import java.lang.annotation.RetentionPolicy;
036    import java.lang.annotation.Target;
037    
038    /**
039     * <p>Stateless beanlets do not share any state between subsequent method
040     * invocations. Stateless beanlet instances are pooled and methods called on
041     * stateless beanlet stubs are delegated to one of the pooled instances. 
042     * If multiple invocations are made on the same stub reference, different
043     * beanlet instances can be used to perform the call.<br>
044     * Beanlet instances are added and removed from the pool at the container's 
045     * discretion. Requesting a beanlet stub through the APIs, or dependency 
046     * injection does not necessarily result in the creation of a new beanlet 
047     * instance. In general, the number of pooled beanlet instances depends on the 
048     * number of concurrent requests made to these stubs.</br>
049     * Stateless beanlets can be configured to be {@code reentrant} and 
050     * {@code singleton}.</p>
051     *
052     * {@beanlet.annotation}
053     *
054     * @see Stateful
055     * @see ScopeAnnotation
056     * @author Leon van Zantvoort
057     */
058    @ScopeAnnotation
059    @Retention(RetentionPolicy.RUNTIME)
060    @Target(ElementType.TYPE)
061    public @interface Stateless {
062        
063        /**
064         * Set to {@code true} to declare this beanlet to be a singleton beanlet.
065         * Only one beanlet instance will exist at the same time for singleton 
066         * beanlets.
067         */
068        boolean singleton() default false;
069        
070        /**
071         * Specifies whether the beanlet instances should be reentrant or not. 
072         * Instances of reentrant beanlets can be invoked by multiple threads at
073         * the same time.
074         */
075        boolean reentrant() default false;
076    }