blob: 75bc81f7d5158f613ff350e6558ea38ba0bacd5d [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.tapestry5.ioc;
import org.apache.tapestry5.ioc.annotations.Inject;
import java.lang.annotation.Annotation;
/**
* Defines an object which can provide access to services defined within a {@link org.apache.tapestry5.ioc.Registry}, or
* to objects or object instances available by other means. Services are accessed via service id, or
* (when appropriate)
* by just service interface. The Registry itself implements this interface, as does
* {@link org.apache.tapestry5.ioc.ServiceResources}.
*/
public interface ObjectLocator
{
/**
* Obtains a service via its unique service id. Returns the service's proxy. The service proxy
* implements the same
* interface as the actual service, and is used to instantiate the actual service only as needed
* (this is
* transparent to the application).
*
* @param <T>
* @param serviceId unique Service id used to locate the service object (may contain <em>symbols</em>,
* which
* will be expanded), case is ignored
* @param serviceInterface the interface implemented by the service (or an interface extended by the service
* interface)
* @return the service instance
* @throws RuntimeException if the service is not defined, or if an error occurs instantiating it
*/
<T> T getService(String serviceId, Class<T> serviceInterface);
/**
* Locates a service given a service interface and (optionally) some marker annotation types. A single service must implement the service
* interface (which * can be hard to guarantee) and by marked by all the marker types. The search takes into account inheritance of the service interface
* (not the service <em>implementation</em>), which may result in a failure due to extra
* matches.
*
* @param serviceInterface the interface the service implements
* @return the service's proxy
* @throws RuntimeException if the service does not exist (this is considered programmer error), or multiple
* services directly implement, or extend from, the service interface
* @see org.apache.tapestry5.ioc.annotations.Marker
*/
<T> T getService(Class<T> serviceInterface);
/**
* Locates a service given a service interface and (optionally) some marker annotation types. A single service must implement the service
* interface (which * can be hard to guarantee) and by marked by all the marker types. The search takes into account inheritance of the service interface
* (not the service <em>implementation</em>), which may result in a failure due to extra
* matches. The ability to specify marker annotation types was added in 5.3
*
* @param serviceInterface the interface the service implements
* @param markerTypes Markers used to select a specific service that implements the interface
* @return the service's proxy
* @throws RuntimeException if the service does not exist (this is considered programmer error), or multiple
* services directly implement, or extend from, the service interface
* @see org.apache.tapestry5.ioc.annotations.Marker
* @since 5.3
*/
<T> T getService(Class<T> serviceInterface, Class<? extends Annotation>... markerTypes);
/**
* Obtains an object indirectly, using the {@link org.apache.tapestry5.ioc.services.MasterObjectProvider} service.
*
* @param objectType the type of object to be returned
* @param annotationProvider provides access to annotations on the field or parameter for which a value is to
* be
* obtained, which may be utilized in selecting an appropriate object, use
* <strong>null</strong> when annotations are not available (in which case, selection
* will
* be based only on the object type)
* @param <T>
* @return the requested object
* @see ObjectProvider
*/
<T> T getObject(Class<T> objectType, AnnotationProvider annotationProvider);
/**
* Autobuilds a class by finding the public constructor with the most parameters. Services and other resources or
* dependencies will be injected into the parameters of the constructor and into private fields marked with the
* {@link Inject} annotation. There are two cases: constructing a service implementation, and constructing
* an arbitrary object. In the former case, many <em>service resources</em> are also available for injection, not
* just dependencies or objects provided via the MasterObjectProvider service.
*
* @param <T>
* @param clazz the type of object to instantiate
* @return the instantiated instance
* @throws RuntimeException if the autobuild fails
*/
<T> T autobuild(Class<T> clazz);
/**
* Preferred version of {@link #autobuild(Class)} that tracks the operation using
* {@link org.apache.tapestry5.ioc.OperationTracker#invoke(String, org.apache.tapestry5.ioc.Invokable)}.
*
* @param <T>
* @param description description used with {@link org.apache.tapestry5.ioc.OperationTracker}
* @param clazz the type of object to instantiate
* @return the instantiated instance
* @throws RuntimeException if the autobuild fails
* @since 5.2.0
*/
<T> T autobuild(String description, Class<T> clazz);
/**
* Creates a proxy. The proxy will defer invocation of {@link #autobuild(Class)} until
* just-in-time (that is, first method invocation). In a limited number of cases, it is necessary to use such a
* proxy to prevent service construction cycles, particularly when contributing (directly or indirectly) to the
* {@link org.apache.tapestry5.ioc.services.MasterObjectProvider} (which is itself at the heart
* of autobuilding).
*
* If the class file for the class is a file on the file system (not a file packaged in a JAR), then the proxy will
* <em>autoreload</em>: changing the class file will result in the new class being reloaded and re-instantiated
* (with dependencies).
*
* @param <T>
* @param interfaceClass the interface implemented by the proxy
* @param implementationClass a concrete class that implements the interface
* @return a proxy
* @see #autobuild(Class)
*/
<T> T proxy(Class<T> interfaceClass, Class<? extends T> implementationClass);
}