spring自动装配 @Autowired使用

一、@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、获取值的关键
在这里插入图片描述
其他情况可以自行测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值