Spring如何通过反射创建仅含单参构造器的Bean?
Spring构造器注入下的Bean创建流程(针对你的代码场景)
先看你的代码:
@Component public class A { } @Component public class B{ private A a; @Autowired public B( A a){ this.a = a; } }
针对这个场景,Spring通过反射创建B的Bean实例的步骤是这样的:
- 第一步:Spring启动时,会扫描所有带
@Component注解的类,把A和B都注册成容器里的Bean定义。 - 第二步:处理B的Bean定义时,Spring发现它的构造器被标记了
@Autowired,就确定用这个带参数的构造器来创建B的实例。 - 第三步:Spring解析构造器的参数——这里是
A类型,它会先检查容器里有没有A的Bean实例:如果还没创建,就先调用A的无参构造器(A只有默认的无参构造),通过反射创建A的实例并放入容器。 - 第四步:Spring通过Java反射API获取B的这个带
A参数的构造器对象,然后把已经准备好的A实例作为参数传入,调用构造器的newInstance()方法,直接创建出B的实例,同时完成了A的注入(不需要后续再给属性赋值)。 - 第五步:把创建好的B实例存入Spring容器,后续就可以被其他组件引用了。
补充个小知识点:从Spring 4.3版本开始,如果一个类只有一个带参数的构造器,哪怕你不加@Autowired注解,Spring也会自动用这个构造器做依赖注入,逻辑和上面完全一致。
内容的提问来源于stack exchange,提问作者Mostafa Abdelfatah
相关产品推荐
相关产品推荐

