随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。
posts - 398,comments - 0,views - 13万

一般的方式需要配置bean或ref引用bean,自动注入会自动进行匹配,如果存在则创建。

匹配原则:使用Bean的id属性中的值去和相对应的值匹配

关键词autowire=""

  default:默认

  byType:根据类型自动匹配

  byName:根据名字自动匹配

  constructor: 根据构造器匹配

 

根据类型匹配

 比如在person中使用byType并注入了Wife的bean标签:

 

 

 

 在Person类中是有Wife这个类型的属性:

 

 已知ioc容器中的存在Wife类型的bean,那么就会自动将Wife这个bean注入到Persong的属性中

 

 测试方法:

复制代码
/**
     * 自动注入
     */
    @Test
    public void fun5(){
        System.out.println("begin!");
        Person person = app.getBean("person", Person.class);
        System.out.println(person);
    }
复制代码

 输出结果:

1
2
3
Wife加载
begin!
Person{id=null, name='null', gender='null', birth=null, ls=null, course=null, wife=Wife{id=null, name='妻子', gender='null', birth=null, ls=null, course=null}}

从结果可以发现注入Person中的Wife类型的bean就是我们配置的Wife类型的bean。

但是使用这个方式有一个问题:

 

 当我们创建两个相同Wife类型的bean时就会 报错。

 

根据名字匹配

 此时我将byType改为byName,然后注入两个Wife类型的bean -- wife 和 wife1:

 那么这个时候就会自动去匹配Person类中set()方法的值与哪一个Wife类型Bean的id相同,

 

 

 

 可以发现Person中setWife()方法与id="wife"的匹配,而不是与id="wife1"匹配,所以会将id="wife"的bean注入Person的wife属性中。

运行上面的测试代码:

1
2
3
4
Wife加载
Wife加载
begin!
Person{id=null, name='null', gender='null', birth=null, ls=null, course=null, wife=Wife{id=null, name='前妻', gender='null', birth=null, ls=null, course=null}}

结果也确实是与set()方法匹配的那个Wife类型的Bean被注入。

这里加载两次是因为配置了两个不同的Wife类型的Bean。

 

如果将set()方法改为:

 

 查看结果:

1
2
begin!
Person{id=null, name='null', gender='null', birth=null, ls=null, course=null, wife=Wife{id=null, name='妻子', gender='null', birth=null, ls=null, course=null}}

被注入的是与wife1匹配的bean。

 

 

根据构造器匹配

此时进行匹配需要构造函数中的参数只有ioc容器中注入的参数,例如ioc容器中只注入了Wife的Bean,那么构造函数只能有Wife类型的参数,如果有其它参数那么将无法匹配。

 此时将Person类中加入一个只有Wife参数的构造函数

这个方式会优先根据名字进行匹配:

比如下面:

参数为wife时输出结果:

参数为wife1时输出结果:

 

这和我们的配置的是一样的:

 

 

如果名字没有找到,那么就会根据类型进行匹配:

前面已知根据类型匹配只能注入一个Wife类型的bean,这里如果存在多个相同的Bean,那么会注入失败但是不会报错

在xml中并没有配置wife2这个bean:

此时的输出结果为:

结果注入的是id="wife"的bean。

 

如果在自动注入的时候有两个相同的Bean参与匹配,那么可以使用primary="true",表示该Bean为主要Bean,如果primary="false",表示不参与自动注入

输出结果:

存在相同的Bean也可以注入,并且为设置了优先的Bean,前面的byType也可以通过这个方式进行配置。

 

posted on   时间完全不够用啊  阅读(150)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示