一、@Autowired 自动注入说明:
1、默认优先按照类型去容器中找对应的组件:applicattionContext.getBean(ColorDao.class)
2、如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找applicationContext.getBean(“colorDao”) ,spring低版本不支持此方法。
3、@Qualifier(“colorDao”):使用@Qualifier指定需要装配的组件的id,而不是使用属性名称。
4、自动装配默认一定要将属性赋值好,没有就会报错
可以使用@Autowired(required=false),如果容器中没有,也不会报错。
5、@Primary:让Spring进行自动装配的时候,默认使用首选的bean;也可以继续使用@Qualifier指定需要装配的bean的名称。
@Autowired标注位置:构造器,参数,方法属性上都是从容器中获取组件值。
1、【标注在方法位置】,@Bean+方法参数,参数从容器中获取值
2、【标注在构造器】如果组件只有一个有参构造器,这个构造器上的@Autowired可以省略。
补充:除了@Autowired可以装配bean外,spring还支持@Resource(JSR250)和@Inject(JSR330)Java规范注解。
@Resource和@Inject:
默认按照组件名称进行装配,不支持@Primary和required=false,@Inject需要导入javax.inject包
二、代码示例
1、验证如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
1)、创建ColorDao.java
@Repository
@Slf4j
@Data
public class ColorDao {
public String label="1";
public void print(){
log.info("label为:"+label);
}
}
2)、创建ColorService.java
@Service
@Data
public class ColorService {
@Autowired
ColorDao colorDao;
}
3)、创建ColorConfigTest配置类,扫描上面两个类所在包,并再次声明一个ColorDao,id=colorDao2
@Configuration
@ComponentScan({"com.bussines.test"})
public class ColorConfigTest {
@Bean
public ColorDao colorDao2(){
ColorDao colorDao = new ColorDao();
colorDao.setLabel("2");
return colorDao;
}
}
4)、创建测试类
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class JuniterTestColor {
@Test
public void testAutoWiredBean(){
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(ColorConfigTest.class);
ColorService object1=(ColorService)annotationConfigApplicationContext.getBean("colorService");
log.info("数据结果:"+object1.toString());
}
}
执行结果为:
数据结果:ColorService(colorDao=ColorDao(label=1))
6)、结论当容器中有两个ColorDao.java时,@AutoWired将属性的名称作为组件的id去容器中查找。
源码分析:
1.入口是给ColorService.java 的属性赋值的时候,如下图。前面环节可以参照我的博客【spring BeanPostProcessor使用场景
】
2、继续往下执行
3、发现获取属性值从IOC容器值
4、继续执行
5、获取值的关键
其他情况可以自行测试。