zoukankan      html  css  js  c++  java
  • Bean的自动装配

        再说自动装配之前,我们先聊一聊什么是手动装配。

        手动装配就是我们在先前讲的那些,要自己给定属性,然后赋值

        Spring IOC容器可以自动装配Bean,需要做的仅仅实在<bean>的autowire属性里指定自动装配的模式

        byType(根据类型自动装配):若IOC容器中有多个与目标Bean类型一致的Bean。在这种情况下,Spring将无法判断哪个Bean最合适该属性,所以不能执行自动配置。

        byName(根据名称自动装配):必须将目标Bean的名称和属性名设置的完全相同。

        constructor(通过构造器自动装配):当Bean中存在多个构造器时,此种自动装配方式会很复杂,不推荐使用

        

        重新写一个新的包,创建几个新的JavaBean,

    Address:

    private String city;
    private String street;

     

    Car:

    private String brand;
    private double price;

    Person:

    private String name;
    private Address address;
    private Car car;

     

    创建新的配置文件:beans-autowire.xml

    byname

        我们先按照先前的步骤溜一遍:

    1. <bean id="address" class="com.figsprite.bean.autowire.Address"  
    2.       p:city="上海" p:street="陆家嘴"></bean>  
    3.     
    4. <bean id="car" class="com.figsprite.bean.autowire.Car"  
    5.       p:brand="奥迪" p:price="233"></bean>  
    6.     
    7. <bean id="person" class="com.figsprite.bean.autowire.Person"  
    8.       p:name="小雨" p:car-ref="car" p:address-ref="address"></bean>  

    然后更改最后Person类的配置,让其中的Car和Address改成自动装配。

        先使用byName,我们此时Car和Address两个对象<bean>的id刚好和我们在Person.java里的setter风格的属性名保持一致,因此是没有问题的,

    <bean id="person" class="com.figsprite.bean.autowire.Person"
    p:name="
    小雨" autowire="byName"></bean>

        注意这里是setter风格的属性名一致,而不是与类名一致,我们可以试着改掉Person.java里的属性名

    private String name;

    private Address address;

    private Car mycar;

    同时也将setter方法改掉:

        发现car为空,如果仅仅只改属性名(字段名),不改setter风格的属性名,是没什么异样的。

        所以byName是根据bean的名字和当前bean的setter风格的属性名进行自动装配,若有匹配成功的,则进行自动装配,若匹配不成功,则不装配

    byType

        这个是根据类型配的,我们先把之前改过的Person.java还原成最初的模样:

    我们改一下Car的容器id

    <bean id="helloCar" class="com.figsprite.bean.autowire.Car"
    p:brand="
    奥迪" p:price="233"></bean>

    如果我们还是使用byName,结果可想而知

    Person{name='小雨', address=Address{city='上海', street='陆家嘴'}, car=null}

    接下来我们换成byType:

    Person{name='小雨', address=Address{city='上海', street='陆家嘴'}, car=Car{brand='奥迪', price=233.0}}

    意料之中,不过之前有说过byType的致命弱点,不可以出现两个相同类型的容器,这里,我们再加一个Car容器,优秀的IDEA已经自己报错了,我们还是强制运行一下:

    自动装配的缺点

    1. 属性要么都是用自动装配的形式,要么不用,不能部分使用,部分不使用
    2. 要么byName,要么byType,不能兼用

      所以其实我们很少用这个功能,弊大于利。

  • 相关阅读:
    国际关注,Panda 交易所获悉美银监机构批准特许银行托管加密资产
    Panda 交易所快报 央行数字货币测试进入C端流量入口
    Panda交易所获悉,五地股权市场获批参与「区块链建设试点」
    K2“拍了拍”你,这里有你想要的医药行业整体解决方案—K2 BPM
    K2 BPM 给你不一样的产品体验,有兴趣了解一下吗?
    BPM产品解读之规则设计器-K2 BPM-工作流引擎
    idea 使用Springboot 编译报错
    vue 表格中的下拉框单选、多选处理
    Kibana的安装和使用
    .net core 如何向elasticsearch中创建索引,插入数据。
  • 原文地址:https://www.cnblogs.com/figsprite/p/10758983.html
Copyright © 2011-2022 走看看