- 什么是解耦
可以使用各种工具,不单单只限于一种。
- 代码
Config.java
@Configuration
@ComponentScan(basePackages = "cn.tedu.demo")
public class Config {
}
@Component
public class Worker {
private String name = "赵云";
@Autowired
@Qualifier("axe")
private Tool tool;
public void work(){
System.out.println(name +"使用"+tool);
}
}
- 自动注入tool组件,把tool写成接口,用两个方法实现接口。
- @Qualifier(“axe”)可用qualifier指定类型
public interface Tool {
}
@Component
public class Saw implements Tool {
private String name = "长枪";
@Override
public String toString() {
return name;
}
}
@Component
public class Axe implements Tool{
private String name = "龙胆";
@Override
public String toString() {
return name;
}
}
@Test
public void testAxe(){
Worker worker = ctx.getBean("worker",Worker.class);
worker.work();
}
- 注入规则
如果将两个类都加上@Component注解将出现运行错误,@Autowired和@Bean组件注入规则类似:
- 首先按照注入参数查找响应类型的bean组件,如果没有直接报错。
- 如果在Spring容器中能够匹配上唯一类型的bean组件,则注入成功。
- 如果匹配到两个,则查找组件ID和变量名是否匹配,匹配则注入成功。
- 如果组件类型和组件ID都不能很好匹配则报错。