首页 专题 文章 代码 归档
注解@AutoWired
2020.01.24 13:58 2020.01.24 13:58

@AutoWired原理

前面讲解了基于@AutoWired注解的自动装配,但其中还涉及一些问题,需要我们解决!

对于

@AutoWired
private BookService bookService; // 这里bookService即为默认id

来说,

@AutoWired的步骤:

先按照类型去找,即找BookService类型的,等价于:ap.getBean(BookService.class);

  • 找到一个:就赋值,进行其他步骤。

  • 没找到:抛异常。

  • 找到多个同类型:比如这里有一个BookServiceExt继承自BookService,

    • 按照变量名作为id,则有两个BookService(默认id: bookServicec)、BookServiceExt(默认id:bookServiceExt)等待你去查找,然后判断在这两个id中有没有与默认id相匹配的

      • 匹配上:皆大欢喜,注入成功!
      • 未匹配上:报错!
    • 没有相配的,解决办法:使用@Qualifier("自定义id")注解,让spring别使用默认的id(类名首字母小写),用我自定义的!

      代码如下:

      @AutoWired
      @Qualifier("bookServiceExt") // 代表我这里的变量要装配的类似是bookServiceExt,别装配错啦!
      private BookService bookService; // 这里bookService即为默认id
  • 是不是必须要找到?因为@AutoWired有个属性为required,默认是true,如果你的要求是可以找不到,那么赋值为false即可,那此时如果装配不上,就赋值为null。

@AutoWired范围

@AutoWired注解可在:

  • 构造器上
  • 方法上
  • 变量上
  • 注解上

加入!


A. 方法上:

这个方法的每一个参数都会自动装配。

代码:

BookController

@Autowired
public void hello(BookDao bookDao, BookService bookService1) {
    System.out.println("bookDao:" + bookDao);
    System.out.println("bookService1:" + bookService1);
}

Test01

@Test
public void test03() {
    BookController bookController = ap.getBean("bookController", BookController.class);

}

结果:

截图-1579842995

本节阅读完毕! (分享
二维码图片 扫描关注我们哟