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.METHOD;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
/**
* {@code @Inject}支持构造器、方法、字段,也可以是静态实例成员。一个可注入的成员有着以下修饰符:private, package-private,
* protected, public。注入的顺序:构造器 --> 字段 --> 方法。字段和方法上,超类的注入先于子类的注入。在相同的类中,
* 字段之间和方法之间注入的顺序不作要求。
*
* {@code @Inject}可以注解无参或有参构造器,每个类最多只能注解一个构造器。若果注入public且无参构造器而没有其他构造器,
* 则注入的是默认构造器。字段不能为final修饰;方法不能是abstract
* 例如:
* public class Car {
* // Injectable constructor
* @Inject public Car(Engine engine) { ... }
*
* // Injectable field
* @Inject private Provider<Seat> seatProvider;
*
* // Injectable package-private method
* @Inject void install(Windshield windshield, Trunk trunk) { ... }
* }
*
* {@code @Inject}被注解的方法覆写了已经被注解的方法,则注入是最终的实例;没有注解的方法覆写一个被注解的方法,则不能注入
*
* 带有任何访问修饰符(包括private)的成员都可以注入。
* 非public成员,在平台或注射器的局限性(像安全限制或缺少反射支持)可能阻止注入
*
* 1.Qualifiers:限定符
* 2.Injectable Values:可注入的值
* 3.Circular Dependencies:循环依赖(例如:A依赖B,B依赖A)
* 解决办法:a.平移:比如A和B互相依赖,那么可以将B依赖A的那部分代码,移动到B中
* b.下移,比如A和B互相依赖,同时它们都依赖C,那么可以将B和A相互依赖的那部分代码,移动到C中
* 参考资料:http://hck.iteye.com/blog/1728329
* @author TCM
* @create 2017年10月18日下午3:16:55
* @see javax.inject.Qualifier @Qualifier
* @see javax.inject.Provider
*/
@Target({ METHOD, CONSTRUCTOR, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Inject {
}
@Inject源码翻译
最新推荐文章于 2021-09-17 10:56:39 发布