栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

1.工程结构

 依赖jar包


            org.springframework
            spring-context
            5.0.4.RELEASE
        

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/328568.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号