内容总结
实例化
Spring 自行创建 Bean 的规则如下
- 默认使用无参构造方法, 只有一个有参时用有参, 有多个有参时报错
- 多个有参, 且其中一个上有 @Autowired 注解: 用有 @Autowired 注解的那个, 且 Spring 自动注入参数值. 注意 @Primary/@Order/Ordered 等无此效果
- 当类是延迟加载或原型作用域时, 可以使用 getBean(String name, Object… args) 或 BeanDefinition.getConstructorArgumentValues().addGenericArgumentValue(new XxxObject()) 手动指定构造方法, 找不到则报错
- 让 Spring 自动选择构造方法以及参数值
- XML 时, autowire=“constructor”
- Annotation 时, BeanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR)
选择构造方法
- 默认, 用无参构造方法, 如果没有无参构造方法, 但有一个其他的, 就用这一个
- 指定了构造方法入参值, 通过 getBean 或 BeanDefinition, 那就用参数匹配的构造方法
- 指定 autowire=constructor, 让 Spring 自动选择构造方法及入参值
- 指定 @Autowired 注解到某个构造方法, 希望 Spring 自动找该构造方法的入参值