@Inject源码翻译

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 {
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值