(三)自动装配

Spring中的自动装配

@Autowire、 @Qualifier、@Primary

@Autowire 注解标注在constructor, field, setter method 上,方便在Spring中进行依赖的注入(dependency injection)。和JSR-330标准javax.inject.Inject达到一样的效果,不过autowired时Spring持有的。

  • 默认使用Autowire是按照类型进行注入的,但是如果在容器中存在多个类型相同的bean时,@Autowired也会按照名称进行匹配。
  • 使用@Qualifier注解,在获取Bean时,指定要获取的bean的名称。
  • 使用@Primary注解,在声明Bean时,指定如果注入,则首选的bean。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Component
public class Person {
private String firstName;
private String lastName;

public Person(String firstName, String lastName) {
this.firstName = "w";
this.lastName = "y";
}

@Autowired
@Qualifier("abc")
private Pet pet;
// 省略getter setter
}


// 或者在声明Bean时,使用Primary进行指定。
@Bean("dotdot")
@Primary
public Pet pet2(){
return new Pet("dotdot");
}

需要注意的是:在同时指定Qualifier和Primary时,会以Qualifier为主。

@Inject、@Named

@Inject、@Named 都是Javax规范的注解,并不是Spring的注解。

使用 Inject 注解同样能够标注在constructor, field, setter method 上。基本能够代替 Autowired 注解,并且能够使用 Named 注解,指定名称进行实例的注入,可以代替 Qualifier 注解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Component
public class Person {
private String firstName;
private String lastName;

public Person(String firstName, String lastName) {
this.firstName = "w";
this.lastName = "y";
}

@Inject
@Named("abc")
private Pet pet;
// 省略getter setter
}

区别点在于 Autowired 注解支持 required() 属性。而 Inject 注解并不支持。可以使用java.util.Optional或者Spring Framework 5.0 后提供的 @Nullable 注解,标志在构造方法上。

1
2
3
4
public class SimpleMovieLister {
@Autowired public void setMovieFinder(@Nullable MovieFinder movieFinder) {
...
}

@Resource

使用 @Resource 同样能够达到自动装配的目的,与 @Autowire 的区别在于以下几点:

  • 处理这2个注解的BeanPostProcessor不一样
  • 匹配Bean的方式不同。
    • @Resource
      • 默认按照名称进行匹配注入。
      • 如果指定了 type,则按照类型进行匹配。当无法找到正确的类型或者找到多个时都会报错。如果都没有指定时,并且无法按照名称匹配到Bean时,会回退到按照类型寻找Bean。
    • @Autowire 默认就是按照类型进行匹配的,如果需要指定特定Bean,则需要使用 @Qualifier 注解进行指定。
-------------本文结束感谢您的阅读-------------