Spring推断构造方法和应用场景初步分析

18 篇文章 0 订阅

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去找

期待后续的源码部分😀😀😀

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值