@Autowired: 註解中僅僅有是否必需元素java
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Autowired { boolean required() default true; }
@Qualifer:僅僅有一個value元素編程
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Qualifier { String value() default ""; }
@Resource:能夠指定類型也能夠指定名稱app
@Target({TYPE, FIELD, METHOD}) @Retention(RUNTIME) public @interface Resource { String name() default ""; //名稱 String lookup() default ""; Class<?> type() default java.lang.Object.class; //類型 enum AuthenticationType { CONTAINER, APPLICATION } AuthenticationType authenticationType() default AuthenticationType.CONTAINER; boolean shareable() default true; String mappedName() default ""; String description() default ""; }
serviceui
@Service public class RemarkServiceImpl implements IRemarkService { }
@Service的使用有兩種狀況:code
A.直接使用@Service進行註解:可經過IRemarkServic類型和RemarkServiceImpl類型進行注入,也能夠經過remarkServiceImpl名稱注入。
B.指定名稱@Service("remarkService"),這是可經過注入IremarkService和RemarkServiceImpl類型,也可經過remarkService名稱進行注入,不能使用remarkServiceImpl名稱進行注入了。接口
雖然@Service會默認生成對應名稱的實例,也能夠推薦加上默認的名稱。ip
controller開發
@RestController @RequestMapping("/remark") public class RemarkController { @Autowired @Qualifier("remarkService") private RemarkServiceImpl remarkService; }
@Autowired:首先按照類型進行注入,若是注入的類型是有多個實現而且注入到容器的類型,而後會按照變量名稱進行注入。
@Qualifier("remarkService"):此註解同@Autowired一塊使用,注入的類型匹配而且名稱也匹配,注入的實例的類型但是要注入類型的子類或自己類型。rem
@Resource:該註解能夠指定註解的名稱或者類型,若是僅僅指定類型,使用同@Autowired;若是指定了名稱,那麼就必須按照名稱進行注入。get
在開發過程當中,注入的類型最好是基類,也體現了面向接口編程,也就是說變量類型使用基類類型,變量名使用基類首字母小寫的形式。若是一個基類僅僅有一個實現而且注入到容器中,那麼使用@Autowired進行註解;若是一個基類有多個實現,而且注入到容器,那麼使用@Resource註解指定要注入的名稱。