之前我们讲过基于xml的依赖注入,也就是给属性赋值
- 给属性赋值的方式有两种:
通过set方法
通过构造函数 - 属性的类型:
基本类型和String类型
bean类型
集合类型
今天要讲的是第三种给属性赋值的方式:通过注解的方式给属性赋值,注解是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();
}
原理分析:
- BookDao,BookService,BookController这三个类的对象都在IOC容器中被管理,通过注解的方式将组件交给IOC容器管理时,其组件的id默认为类名首字母小写(bookDao,bookService,bookController)。
- 使用Autowired注解时,会先根据类型找对应的组件进行匹配,如果类型匹配就直接赋值
BookService bookService = new BookService(); - 如果找到的类型不止一个会接着按照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();
}
}