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

网站建设和网页设计视频教程长沙建站公司做网站

网站建设和网页设计视频教程,长沙建站公司做网站,七牛云cdn加速wordpress,网络科技公司起名免费一、 前言 平常我们在使用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/566699/

相关文章:

  • 新手做亚马逊要逛哪些网站企业vi设计的几大特点
  • 网站 tag标签百度关键词优化大师
  • 网站建设上的新闻山东免费网站建设
  • 南通做网站推广的公司石家庄建站模板厂家
  • 分销网站怎么做手机端网站需要多少钱
  • 选择常州网站建设公司wordpress ftp没有权限
  • 手机号注册网站银河互联网电视有限公司
  • 如何创办网站个人网站怎么做视频
  • 网站域名列表怎么填写北京文化墙设计制作
  • 网站开发工程师薪酬待遇在门户网站中
  • 公司网站网址注册和备案哪里找中国企业信息
  • 潍坊哪个网站公司做优化好茶叶网站建设策划书
  • 建设部网站 信用诚信评分标准智能网站建设软件有哪些方面
  • 在网站建设会议上的讲话软文广告发稿
  • 全屋定制怎么样做网站永州seo快速排名
  • 中职 网站建设与管理筑成建设集团网站
  • 宁波市住房和城乡建设局网站微信h5页面制作免费软件
  • wordpress公众号授权登录网站优化百度
  • .mom域名可以做网站吗网上免费家装设计
  • 网站建设与维护中域名访问
  • 河间做网站的电话网站源码完整
  • wordpress能做分类信息网站湖南网站建设公司 干净磐石网络
  • wordpress 迁移 群晖成都网络优化网站建设
  • 齐河县城乡建设局网站通州网站制作
  • 营销网站设计上海天气建设网站要钱么
  • 024 网站推广五屏网站建设哪家好
  • 网站建设怎么选择MySQL数据库大小个人网站风格设计
  • 黄冈网站推广软件ios新的网站的建设步骤
  • 营销型企业网站建设包括什么上不了国外网站怎么做外贸
  • 买模板做网站网站开发投标文件