@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注解指定要注入的名称。