@Autowired注解详解

一、在构造函数上定义

关于在构造方法上加@Autowired注解,讲下面几点:
1.带有@Autowired注解(属性required默认为true)的构造方法,在Spring初始化对象实例时,会调用此构造函数,进行对象的实例化。
2.如果构造方法上带有了@Autowired注解,那么这个构造方法不是public修饰的,也可以被实例化。private修饰的,也可以被实例化出来。
3.当一个对象只有一个构造方法时,Spring实例化对象会默认选择这个构造方法进行实例化,无需加@Autowired注解。只有当多个构造方法存在时,才用加@Autowired注解,告诉Spring选择哪个构造方法进行实例化。
4.构造方法的@Autowired且required属性为true只允许存在一个。其他的@Autowired直接的required属性必须设置为false。
5.实例化带参数的构造方法时,Spring会先实例化构造方法中参数对象。

总结:当一个类中有多个构造方法,且我们要选择某一个构造方法进行Spring实例化时,可以在构造方法上加@Autowired注解。

二、在类属性上定义

这种用法是我们最常用的。字段在构造bean之后,在调用任何配置方法之前被注入。这样的配置字段不必是public的。private的也可以被赋值。

三、在方法上定义

定义在其他方法上,当Spring容器调用该类的构造方法实例化完成该类后,会调用@Autowired修饰的方法,并将方法的参数进行实例化。也就是说,我们如果想实例化完成一个类后,执行某个方法时,可以用@Autowired注解来修饰。Spring会自动给我们执行该方法,有点儿类似于init-method的用法。但是必须保证该方法的参数对象在Spring容器中也存在,否则会报错。

四、注意

  1. 在BeanPostProcessor类和BeanFactoryPostProcessor类中无法使用@Autowired注解。因为@Autowired注解的收集工作就是由BeanPostProcessor类来完成的,且BeanFactoryPostProcessor类的调用时机先于BeanPostProcessor类。所以这两个类无法使用@Autowired注解。

  2. @Autowired修饰方法时,如果方法的参数传入的是array,Collection或者Map类型的参数,那么Spring在自动注入这些参数时,Spring容器会把集合定义的泛型的所有实例化对象,放入集合中。所以,在这种情况下使用Map作为参数时,map的key必须为String类型,Spring会根据map的value值的对象类型,去实例化对象,最终map的key是value所对应对象类型的beanNames,value就是实例化的对象。

  • 21
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码的小小酥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值