自动装配 01 @Autowired & @Qualifier & @Primary
自动装配:Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值
-
常用@Autowired
- 默认优先按照类型去容器中找对应的组件
- 若ioc中有多个同类型的bean,再将属性名称作组件id去容器中查找(会报错 )
-
也可以使用
@Qualifier("[beanName]")
来指定注入bean,这种情况下可以存在相同类型的多个bean‘ -
如果没有bean,会报错 自动装配默认一定要将属性赋值好,否则会报错
可以修改这种默认设置:
@Autowired(required=false)
多数据源的时候用的多 -
@Primary:让Spring进行自动装配的时候默认使用首选的bean,也可以继续使用
@Qulifier
指定需要装配的bean的名字优先级:@Qulifier > @Primary
@Primary测试
常用@Autowired
BookDao.java
@Repository
public class BookDao {
private Integer lable = 1;
public Integer getLable() {
return lable;
}
public void setLable(Integer lable) {
this.lable = lable;
}
@Override
public String toString() {
return "BookDao{" +
"lable=" + lable +
'}';
}
}
BookService.java
@Service
public class BookService {
@Autowired
private BookDao booKDao;
@Override
public String toString() {
return "BookService{" +
"booKDao=" + booKDao +
'}';
}
}
BookController.java
@Controller
public class BookController {
@Autowired
private BookService bookService;
}
配置类
MainConfig4Autowire.java
package com.example.annotations.config;
import com.example.annotations.dao.BookDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
@ComponentScan(value = {"com.example.annotations.service","com.example.annotations.dao","com.example.annotations.controller"})
public class MainConfig4Autowire {
@Bean("bookDao2")
public BookDao bookDao(){
BookDao bookDao = new BookDao();
bookDao.setLable(2);
return bookDao;
}
}
测试:
@Test
void autowiredTest(){
//配置类测试
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig4Autowire.class);
System.out.println("容器创建完毕");
//获取bean
System.out.println("准备获取bean");
BookService bookService = applicationContext.getBean(BookService.class);
System.out.println(bookService.toString());
System.out.println("获取完毕");
//关闭容器
applicationContext.close();
System.out.println("容器已关闭");
}
运行结果:
配置类不加 @Primary
的时候,启动测试会报错,因为有两个BookDao的bean;配置类如果不指定注入的话,运行结果如下:
@Qualifier测试
配置类:
@Configuration
@ComponentScan(value = {"com.example.annotations.service","com.example.annotations.dao","com.example.annotations.controller"})
public class MainConfig4Autowire {
// @Primary
@Bean("bookDao2")
public BookDao bookDao(){
BookDao bookDao = new BookDao();
bookDao.setLable(2);
return bookDao;
}
}
BookService.java
@Service
public class BookService {
@Autowired
@Qualifier("bookDao2")
private BookDao booKDao;
@Override
public String toString() {
return "BookService{" +
"booKDao=" + booKDao +
'}';
}
}
运行结果: