package javax.inject;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.annotation.Documented;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
/**
* 标识@Qualifier注解,任何人都能够定义新的限定符
* 一个qualifier注解应该满足如下条件:
* a. 定义的注解类有@Qualifier,@Retention(RUNTIME)和@Documented
* b. 可以有属性
* c. 可以是公共API的一部分
* d. 可以用@Target注解限定使用范围
* @author TCM
* @create 2017年10月19日上午10:31:48
* @see javax.inject.Named @Named
*/
@Target(ANNOTATION_TYPE)
@Retention(RUNTIME)
@Documented
public @interface Qualifier {}
package javax.inject;
import java.lang.annotation.Retention;
import java.lang.annotation.Documented;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* 基于{@linkplain Qualifier qualifier},目的:可以注解有值的bean名(定义bean名称)
* public class Car {
* @Inject @Named("driver") Seat driverSeat;
* @Inject @Named("passenger") Seat passengerSeat;
* ...
* }
* 注意:@Named可以有值,如果没有值生成的Bean名称默认和类名相同。
* @author TCM
* @create 2017年10月19日下午3:33:08
*/
@Qualifier
@Documented
@Retention(RUNTIME)
public @interface Named {
/** 注入的bean名*/
String value() default "";
}
package javax.inject;
/**
* 目的:提供实例
* 通过注入实现获取T实例(泛型)
* 获取注入实例T,可以使用Provider<T>,或注解注入T,两者有什么区别:
* a. Provider<T>可以获取多个实例
* b. 实例可以延迟或可选的检索
* c. 阻断循环依赖
* d. 小范围内查看实例
* 例如:
* class Car {
* @Inject
* Car(Provider<Seat> seatProvider) {
* Seat driver = seatProvider.get();
* Seat passenger = seatProvider.get();
* ...
* }
* }
* @author TCM
* @create 2017年10月19日下午3:38:26
*/
public interface Provider<T> {
/**
* 提供构造器,注入一个实例T
* Provides a fully-constructed and injected instance of {@code T}.
* @throws RuntimeException
*/
T get();
}