@Autowired:注入依赖对象
实现依赖注入,spring容器会对bean中所有字段、方法进行遍历,标注有@Autowired注解的,都会进行注入
源码:
@Target({
ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
/**
* Declares whether the annotated dependency is required.
* <p>Defaults to {@code true}.
*/
boolean required() default true;
}
可以用在构造器、方法、方法参数、字段、注解上。
参数:
required:标注的对象是否必须注入,可能这个对象在容器中不存在,如果为true的时候,找不到匹配的候选者就会报错,为false的时候,找不到也没关系 。
-
将指定类型的所有bean注入到Collection中
如果被注入的对象是Collection类型的,可以指定泛型的类型,然后会按照上面的方式查找所有满足泛型类型所有的bean -
将指定类型的所有bean注入到Map中
如果被注入的对象是Map类型的,可以指定泛型的类型,key通常为String类型,value为需要查找的bean的类型,然后会按照上面方式查找所有注入value类型的bean,将bean的name作为key,bean对象作为value,放在HashMap中,然后注入。
@Autowired查找候选者可以简化为下面这样
按类型找->通过限定符@Qualifier过滤->@Primary->@Priority->根据名称找(字段名称或者参数名称)
@Autowired标注在构造器上,通过构造器注入依赖对象
在Service2有参有参构造器上面加上@Autowired注解,如下:
@Component
public class Service2 {
private Service1 service1;
public Service2() {
//@1
System.out.println(this.getClass() + "无参构造器");
}
@Autowired
public Service2(Service1 service1) {
//@2
System.out.println(this.getClass() + "有参构造器");
this.service1 = service1;
}
@Override
public String toString() {
//@2
return "Service2{" +
"service1=" + service1 +
'}';
}
}
@1:方法上标注了@Autowired,spring容器会调用这个方法,从容器中查找Service1类型的bean,然后注入
@Autowired标注在方法上,通过方法注入依赖的对象
@Component
public class Service2 {
private Service1 service1;
@Autowired
public void injectService1(Service1 service1) {
//@1
System.out.println(this.getClass().getName() + ".injectService1()");
this.service1 = service1;
}
@Override
public String toString() {
return "Service2{" +
"service1=" + service1 +
'}';
}
}
@1:方法上标注了@Autowired,spring容器会调用这个方法,从容器中查找Service1类型的bean,然后注入
@Autowired标注在setter方法上,通过setter方法注入
@Component
public class Service2 {
private Service1 service1;
@Autowired
public void setService1(Service1 service1) {
//@1
System.out.println(this.getClass().getName() + ".setService1方法");
this.service1 = service1;
}
@Override
public String toString() {
return "Service2{" +
"service1=" + service1 +
'}';
}
}
@1:标准的set方法,方法上使用了 @Autowired,会通过这个方法注入Service1类型的bean对象。
@Autowired标注在方法参数上
@Component
public class Service2 {
private Service1 service1;
@Autowired
public void injectService1(Service1 service1, String name) {
//@1
System.out.println(String.format("%s.injectService1(),{service1=%s,name=%s}", this.getClass().getName(), service1, name));
this.service1 = service1;
}
@Override
public String toString() {
return "Service2{" +
"service1=" + service1

本文详细介绍了Spring框架中的注解使用,包括@Autowired的多种注入方式,如构造器、方法、字段、参数等,并讲解了其查找候选者的规则。同时,解释了@Resource注解的注入逻辑,@Qualifier如何限定注入的bean,以及@Primary设置主要候选者。此外,还探讨了@Bean注解定义bean时注入依赖的几种方式和泛型注入的使用。
最低0.47元/天 解锁文章
1613

被折叠的 条评论
为什么被折叠?



