1.工程结构
依赖jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
2、将OrderService标注为一个bean
正常输出结果
3、接下来UserService也标注为一个bean
场景一、UserService有一个无参构造方法和一个参数的构造方法
这个时候我们去启动Spring容器,会调用上面的构造方法吗?会调用的话是调哪一个呢?
根据输出结果,可以看到调的是无参构造方法
场景二、UserService有一个无参构造方法、一个参数的构造方法、两个参数的构造方法
输出结果,仍然调的是无参构造方法
场景三、UserService有一个参数的构造方法和两个参数的构造方法
运行代码结果报错
这是为啥???主要是两个构造方法,Spring容器不知道调用哪一个,但是又没有找到无参的构造方法,所以报错
场景四、UserService有一个或者多个参数的构造方法
运行结果可以输出,调用一个参数的构造方法
因为只有一个构造方法,Spring默认是使用无参的,没有找到无参的,刚好有一个有参的,便拿来使用。但是有没有发现一个问题,orderService的值从哪里来的呢???
答案是从Spring容器中拿的,使用这个有参的构造方法时,Spring容器发现需要一个OrderService参数,于是便从容器中去找,看有没有,因为我们上面已经定义了一个单例的OrderService的bean,所以可以拿到。于是又有另外的问题了,如果OrderService是一个非单例、有多个OrderService类的的bean或者没有加@Component注解呢??下面我们就来测试下。
①去掉OrderService上的@Component注解
运行代码报错 ,提示没有找到一个OrderService的bean,因为我们去掉了@Component注解,Spring启动时不会去处理他,所以容器中不存在这样的一个bean
②非单例的OrderService
结果正常输出,因为在Spring容器中可以找到需要的这个OrderService的bean
③有多个类型的OrderService的bean,定义了三个OrderService类型的bean
运行代码正常输出,有3个OrderService类型的bean,为啥没报错呢???构造方法是先按照类型去找,发现找到了3个OrderService类型的bean,这个时候再根据beanName等于orderService去找,刚好有满足的。
④有多个类型的OrderService的bean,定义了三个OrderService类型的bean,但是UserService构造方法参数里的orderService名字修改成orderService4
运行结果报错,构造方法推断时,先根据类型,找到了三个OrderService,然后再根据beanName去找,发现没有名字叫orderService4的,所以就报错了
⑤去掉config里面定义的两个OrderService,只保留OrderServicel类,上面标有@Component注解
,但是UserService构造方法参数里的orderService名字修改成orderService444
运行结果成功,构造方法推断时,先根据类型,找到了一个OrderService就直接拿来使用了,不会再去根据beanName去找
期待后续的源码部分😀😀😀