@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就是实例化的对象。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论