当前位置: 首页 > news >正文

河南艾特网站建设公司网站免费进入窗口软件有哪些

河南艾特网站建设公司,网站免费进入窗口软件有哪些,126企业邮箱入口,手机做网站的网站一、 前言 平常我们在使用spring框架开发项目过程中,会使用Autowired注解进行属性依赖注入,一般我们都是声明接口类型来接收接口实现变量,那么使用父类类型接收子类变量,可以注入成功吗?答案是肯定可以的!…

一、 前言

平常我们在使用spring框架开发项目过程中,会使用@Autowired注解进行属性依赖注入,一般我们都是声明接口类型来接收接口实现变量,那么使用父类类型接收子类变量,可以注入成功吗?答案是肯定可以的!

二、结果验证

我们在项目中声明如下三个类:

1. 测试代码

  • TestParent
public class TestParent {protected void test() {System.out.println("I am TestParent...");}
}
  • TestSon
importorg.springframework.stereotype.Component;@Component
public class TestSon extends TestParent {publicvoidtest() {System.out.println("I am TestSon...");}
}
  • TestType
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importjavax.annotation.PostConstruct;@Component
public class TestType {@Autowiredprivate TestParent testParent;@PostConstructpublicvoidinit() {System.out.println("=========================");testParent.test();System.out.println("=========================");}
}

2. 验证测试

启动项目:

在这里插入图片描述

可以看到注入成功了,说明依赖注入使用父类类型接收子类变量是没有问题的。

3. @Autowired注解使用细节

还是上面的案例,我们修改一下TestParent类的代码,把TestParent也交由Spring容器管理:

importorg.springframework.stereotype.Component;@Component
public class TestParent {protected void test() {System.out.println("I am TestParent...");}
}

运行测试:

在这里插入图片描述

可以发现,此时也可以注入成功,但是执行对象变成了父类,有经验的大佬已经猜到是什么情况了,没猜到的也没有关系,我们再修改一下TestType类的代码:

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importjavax.annotation.PostConstruct;@Component
public class TestType {@Autowiredprivate TestParent test;@PostConstructpublic void init() {System.out.println("=========================");test.test();System.out.println("=========================");}

运行结果:

在这里插入图片描述

此时居然注入报错了,提示我们有两个bean冲突了,不能进行依赖注入!

三、原理分析

为什么会出现上面的现象呢,是由于@Autowired注入时,是先按照类型找到bean实例名称,再按照beanName去获取真正需要注入的bean,如果有多个实例时,会尝试通过需要注入的字段名称与按照类型筛选出来的beanName对比,如果能够对比出唯一beanName,也会按照此beanName去获取bean实例注入,如果不能够确定唯一bean实例,就会抛出异常了。

下面我们进行源码跟踪:

@Autowired注解解析的核心逻辑入口在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor后置处理器中,我们进入该类中进行断点调试。

通过阅读源码我们可以发现,依赖注入入口方法是postProcessProperties()方法:

在这里插入图片描述

进入org.springframework.beans.factory.annotation.InjectionMetadata#inject方法:

在这里插入图片描述

继续调试,由于我们目前是字段方式注入,所以选择org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement类:

在这里插入图片描述

查看方法细节:

在这里插入图片描述

我们继续跟踪org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#resolveFieldValue方法:

在这里插入图片描述

进入org.springframework.beans.factory.support.DefaultListableBeanFactory#resolveDependency方法:

在这里插入图片描述

继续进入org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveDependency方法:

在这里插入图片描述

继续进入org.springframework.beans.factory.support.DefaultListableBeanFactory#findAutowireCandidates方法:

在这里插入图片描述

进入org.springframework.beans.factory.BeanFactoryUtils#beanNamesForTypeIncludingAncestors(org.springframework.beans.factory.ListableBeanFactory, java.lang.Class, boolean, boolean)看一下bean的筛选逻辑:

在这里插入图片描述

跟踪进入org.springframework.beans.factory.support.DefaultListableBeanFactory#doGetBeanNamesForType方法:

在这里插入图片描述

查看类型匹配判断方法org.springframework.beans.factory.support.AbstractBeanFactory#isTypeMatch(java.lang.String, org.springframework.core.ResolvableType, boolean)

在这里插入图片描述

判断核心方法org.springframework.core.ResolvableType#isInstance

在这里插入图片描述

看到isAssignableFrom方法就知道为什么子类变量也可以成功注入父类类型了,此时子类变量也是可以成功匹配上的。

筛选出所有类型匹配的beanName以后,回到org.springframework.beans.factory.support.DefaultListableBeanFactory#findAutowireCandidates做一下是否可以进行依赖注入的判断,返回beanName信息:

在这里插入图片描述

然后回到org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveDependency方法中,如果有多个类型,会按照字段名称和beanName匹配再筛选:

在这里插入图片描述

最终确定获取到可以注入的bean实例。

四、写在最后

以上流程还是比较清晰的,分析过程中有一些分支流程没有过度关注,有兴趣的小伙伴也可以参考流程,自己进行debug调试分析。

http://www.yayakq.cn/news/818392/

相关文章:

  • 可以做婚礼视频的网站软件定制开发一般多少钱
  • 制作网站一年多少钱网易企业邮箱登录页
  • 机械网站建设开发东莞外贸网络推广
  • 企业形象型网站建设怎样申请自己企业的网站
  • 网站域名费怎么查询品牌网站建设方案
  • 苏州seo关键字优化站长工具seo综合查询
  • 做淘客网站需要营业执照吗南宁房产信息网
  • seo品牌优化整站优化公司网站销售平台建设费分录
  • 商城版网站制作修改wordpress模板
  • 东莞网站建设工作室淄博网站制作网页公司
  • 个人网站主页html5安卓搭载wordpress
  • 建设公司网站模版网站建设意见征求
  • 中文wordpress博客模板下载wordpress自动评论seo工具
  • 营销网站的推广网站建设分析报告
  • 天津网站优化建设清河网站建设
  • 企业网站源码怎么获取网站建设 任务分配表
  • 网站需要兼容哪些浏览器怀化二医院网站
  • 上海哪家网站建得好泽州县住房保障和城乡建设局网站
  • php wordpress 代码模板烟台seo关键词排名
  • 网站开发的调研内容做网站学哪方面知识
  • 河南网站建设推广运营网站建设经费管理
  • 市场网站建设泉州网站设计
  • 网站歌曲代码网站建设与管理维护 李建青
  • 怎么做网站页面免费的四川内江网站建设
  • 网站建设做得好的公司wordpress文章页尾添加信息
  • 西华县住房和城乡建设局网站一对一直播app开发定制
  • 网站规划和构成沈阳网站建设公司哪个好
  • 营销型网站建设公司方法和技巧wordpress后台在哪里设置段落间距
  • 网站开发工程师所需要的经验上海公司名字查询
  • 广告网站 源码怎么开一个属于自己的网店