1.注解源码
@Autowired: 注解中仅仅有是否必需元素
@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:可以指定类型也可以指定名称
@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 "";
}
2.业务代码
service
@Service
public class RemarkServiceImpl implements IRemarkService {
}
@Service的使用有两种情况:
A.直接使用@Service进行注解:可通过IRemarkServic类型和RemarkServiceImpl类型进行注入,也可以通过remarkServiceImpl名称注入。
B.指定名称@Service("remarkService"),这是可通过注入IremarkService和RemarkServiceImpl类型,也可通过remarkService名称进行注入,不能使用remarkServiceImpl名称进行注入了。
虽然@Service会默认生成对应名称的实例,也可以推荐加上默认的名称。
controller
@RestController
@RequestMapping("/remark")
public class RemarkController {
@Autowired
@Qualifier("remarkService")
private RemarkServiceImpl remarkService;
}
@Autowired:首先按照类型进行注入,如果注入的类型是有多个实现并且注入到容器的类型,然后会按照变量名称进行注入。
@Qualifier("remarkService"):此注解同@Autowired一块使用,注入的类型匹配并且名称也匹配,注入的实例的类型可是要注入类型的子类或本身类型。
@Resource:该注解可以指定注解的名称或者类型,如果仅仅指定类型,使用同@Autowired;如果指定了名称,那么就必须按照名称进行注入。
3.具体使用
在开发过程中,注入的类型最好是基类,也体现了面向接口编程,也就是说变量类型使用基类类型,变量名使用基类首字母小写的形式。
如果一个基类仅仅有一个实现并且注入到容器中,那么使用@Autowired进行注解;如果一个基类有多个实现,并且注入到容器,那么使用@Resource注解指定要注入的名称。