程序员社区

【Spring学习及总结15】基于注解的自动装配(依赖注入)

之前我们讲过基于xml的依赖注入,也就是给属性赋值

  1. 给属性赋值的方式有两种:
    通过set方法
    通过构造函数
  2. 属性的类型:
    基本类型和String类型
    bean类型
    集合类型

文章目录

      • 1. @Autowired
      • 2. @Qualifier

今天要讲的是第三种给属性赋值的方式:通过注解的方式给属性赋值,注解是Spring的核心所在,给bean类型的属性赋值,主要用到下面的注解:

@Autowired

@Qualifier

1. @Autowired

 @Repository
public class BookDao {
    public void saveBook(){
        System.out.println("保存图书.....");
    }
}
@Service
public class BookService {
    @Autowired
    private BookDao bookDao;
    
    public void save(){
        System.out.println("BookService正在保存图书");
        bookDao.saveBook();
    }
}
@Controller
public class BookController {
    @Autowired
    private BookService bookService;
    public void doGet(){
        bookService.save();
    }
}
 @Test
 public void test2(){
     BookController bookController =
             context.getBean(BookController.class);
     bookController.doGet();
 }

在这里插入图片描述
原理分析:

  1. BookDao,BookService,BookController这三个类的对象都在IOC容器中被管理,通过注解的方式将组件交给IOC容器管理时,其组件的id默认为类名首字母小写(bookDao,bookService,bookController)。
  2. 使用Autowired注解时,会先根据类型找对应的组件进行匹配,如果类型匹配就直接赋值
    BookService bookService = new BookService();
  3. 如果找到的类型不止一个会接着按照id进行匹配

例如下面有两个BookService类型的类:
BookService和BookServiceExt都是BookService类型的类,因此如果按照类型找就会找到两个,此时就会接着按照这两个类的id(bookService,bookServiceExt)去匹配,可以匹配成功。

@Service
public class BookService {
    @Autowired
    private BookDao bookDao;
    public void save(){
        System.out.println("BookService正在保存图书");
        bookDao.saveBook();
    }
}
@Service
public class BookServiceExt extends BookService {
    @Autowired
    private BookDao bookDao;

    public void save(){
        System.out.println("BookServiceExt....");
        bookDao.saveBook();
    }
}
@Controller
public class BookController {
    @Autowired
    private BookService bookService;

    public void doGet(){
        bookService.save();
    }
}

在这里插入图片描述

@Controller
public class BookController {
    @Autowired
    private BookService bookServiceExt;

    public void doGet(){
        bookServiceExt.save();
    }
}

在这里插入图片描述

2. @Qualifier

上面分析可以看出 @Autowired这个注解会先按照byType来匹配,匹配的类不止一个时,接着按照byName匹配,即按照类的属性名作为id进项匹配。

但是如果属性名不是类名的首字母小写时就会报错。此时可以通过@Qualifier指定一个id名。

@Controller
public class BookController {
	//属性名为book,不是bookService,也不是bookServiceExt
    @Autowired
    private BookService book;
    
    public void doGet(){
        book.save();
    }
}

此时需要通过@Qualifier注解指定属性名

@Controller
public class BookController {

    @Autowired
    @Qualifier("bookService")
    private BookService book;

    public void doGet(){
        book.save();
    }
}

在这里插入图片描述

@Controller
public class BookController {
    @Autowired
    @Qualifier("bookServiceExt")
    private BookService book;

    public void doGet(){
        book.save();
    }
}

在这里插入图片描述

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 【Spring学习及总结15】基于注解的自动装配(依赖注入)

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区