Spring之Bean的三种自动装配方式

什么是Bean

        1、在我们的Java中是一种面向对象的语言,而对象由属性和行为组成,我们只有通过实例化对象才能操作该对象的属性和行为
        2、只要是我们带有属性和成员的类都要到Spring IOC容器中进行实例化
        3、我们Spring IOC容器对Bean的处理是通过工厂模式于反射的结合

Bean的装配

        Bean装配方式采用自动装配,是通过在Spring 配置文件得beans标签中引导项得default-autowire属性来设定,该属性对应属性值得含义如下表格

开启自动装配default-autowire属性值描述

属性值作用描述
byName根据我们得bean节点给定的id值与纯净类中属性名称进行匹配来自动注入
byType根据bean节点class属性值与纯净类中成员属性类型进行匹配来自动注入
constructor与byType类似,此处是根据构造方法来注入(底层还是采用byType方式)
no默认值,不开启Bean实例得自动装配模式

三种方式案例

纯净类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private String pwd;
    private Dog dog;

    public User(Dog dog) {
        this.dog = dog;
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dog {
    private String name;
}

byType方式

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">

   <!--Bean的自动装配方式一:byName-->
    <bean id="user" class="com.spring.pojo.User" scope="singleton">
        <property name="id" value="1"/>
        <property name="name" value="王麻子"/>
        <property name="pwd" value="123456"/>
    </bean>

    <!--狗:注意此处得id值与User类中的属性名称保持一致-->
    <bean id="dog" class="com.spring.pojo.Dog">
        <property name="name" value="拉布拉多"/>
    </bean>
</beans>

byName方式

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byType">

   <!--Bean的自动装配方式二:byType-->
    <bean id="user" class="com.spring.pojo.User" scope="singleton">
        <property name="id" value="2"/>
        <property name="name" value="王翠花"/>
        <property name="pwd" value="234567"/>
    </bean>

    <!--狗:注意此处class属性值与User类中的属性类型保持一致,id值可随意设定-->
    <bean id="dog1" class="com.spring.pojo.Dog">
        <property name="name" value="大金毛"/>
    </bean>
</beans>

constructor方式

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byType">
       
  <!--Bean的自动装配方式二:byType-->
    <bean id="user" class="com.spring.pojo.User" scope="singleton">
        <property name="id" value="3"/>
        <property name="name" value="王大锤"/>
        <property name="pwd" value="456789"/>
    </bean>

    <!--狗:注意此处class属性值与User类中的属性类型保持一致,id值可随意设定,且User类中必须给定对应得构造方法,否则报错-->
    <bean id="dog1" class="com.spring.pojo.Dog">
        <property name="name" value="二哈"/>
    </bean>
</beans>

三种方式得单元测试

    //Bean自动装配方式测试
    @Test
    public void demoBean(){
        //构建Spring IOC容器实例
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        //自动装配:byName
        //User beanByName = applicationContext.getBean("user", User.class);
        //System.out.println("byName方式:" + beanByName);
        
        //自动装配:byType
        //User beanByType = applicationContext.getBean("user", User.class);
        //System.out.println("byType方式:" + beanByType);
        
        //自动装配:constructor
        User beanConstructor = applicationContext.getBean("user", User.class);
        System.out.println("constructor方式:" + beanConstructor);
    }

三种装配方式注意点

  • 通过byName方式进行自动装配时,我们的bean节点得id属性值在纯净类中需要有一个属性名称能与之对应,否则无法进行注入
  • 通过byType方式进行自动装配时,bean节点class属性值是全限定类名要与纯净类中的一个属性名称得类型进行匹配,否则无法注入
  • 通过constructor方式进行自动装配时,有两个条件:①bean节点得class属性值要与纯净类中的属性类型进行对应(底层蚕蛹byType方式) ②需要装配得纯金类中必须存在相应得构造方法

         感谢大家的阅读,热爱分享的仓鼠,请大家多多指教,么么哒~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被风吹过的忧伤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值