package org.dayatang.domain;
import java.lang.annotation.Annotation;
import java.util.Set;
/**
* 实例提供者接口,其实现类以适配器的方式将Bean查找的任务委托给真正的IoC容器,如SpringIoC或Google Guice。
* @author yyang (<a href="mailto:gdyangyu@gmail.com">gdyangyu@gmail.com</a>)
*
*/
public interface InstanceProvider {
/**
* 根据类型获取对象实例。返回的对象实例所属的类是T或它的实现类或子类。如果找不到该类型的实例则抛出异常。
* @param <T> 类型参数
* @param beanType 实例的类型
* @return 指定类型的实例。
*/
<T> T getInstance(Class<T> beanType);
/**
* 根据类型和名称获取对象实例。返回的对象实例所属的类是T或它的实现类或子类。不同的IoC容器用不同的方式解释beanName。
* 具体的解释方式请参见各种InstanceProvider实现类的Javadoc。
* 如果找不到该类型的实例则抛出异常。
* @param <T> 类型参数
* @param beanName 实现类在容器中配置的名字
* @param beanType 实例的类型
* @return 指定类型的实例。
*/
<T> T getInstance(Class<T> beanType, String beanName);
/**
* 根据类型和Annotation获取对象实例。返回的对象实例所属的类是T或它的实现类或子类。不同的IoC容器用不同的方式解释annotation。
* 具体的解释方式请参见各种InstanceProvider实现类的Javadoc。
* 如果找不到该类型的实例则抛出异常。
* @param <T> 类型参数
* @param beanType 实例的类型
* @param annotationType 实现类的annotation类型
* @return 指定类型的实例。
*/
<T> T getInstance(Class<T> beanType, Class<? extends Annotation> annotationType);
/**
* 获取指定类型的实例的集合
* @param beanType 实例的类型
* @param <T> 类型参数
* @return 指定类型的实例的集合
*/
<T> Set<T> getInstances(Class<T> beanType);
}