02-Spring基于XML的Bean属性注入

Posted on 2021-06-11 21:49  萌栈师  阅读(486)  评论(0编辑  收藏  举报

属性值注入:就是给属性赋值

  • 创建一个Account类:
public class Account implements Serializable {
    private int aid;
    private double balance;

    public int getAid() {
        return aid;
    }

    public void setAid(int aid) {
        this.aid = aid;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    @Override
    public String toString() {
        return "Account{" +
                "aid=" + aid +
                ", balance=" + balance +
                '}';
    }
}

  • 创建一个User类:
public class User implements Serializable {
    private String name;
    private int age;
    //引用数据类型
    private Account account;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", account=" + account +
                '}';
    }
}

1. 简单数据类型和引用数据类型的属性注入

1.1 写配置文件

​ 将User类交给Spring容器管理,在xml配置文件中添加<bean>

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 将User类交由Spring容器管理-->
    <bean id="user" class="com.yd.pojo.User">
        <!-- 给对象属性注入值-->
        <!-- 相当于:user.setName("王二");-->
        <property name="name" value="王二"></property>
        <!-- 相当于:user.setAge(20);-->
        <property name="age" value="20"></property>
        <!-- 给引用类型属性注入值-->
        <property name="account" ref="account"></property>
    </bean>
    
    <bean id="account" class="com.yd.pojo.Account">
        <property name="aid" value="101"></property>
        <property name="balance" value="1888"></property>
    </bean>

</beans>

1.2 运行代码

@Test
public void getUser(){
    //获取spring配置文件生成的对象
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
    //通过bean的id,获取bean对象
    User user = (User)ac.getBean("user");
    System.out.println(user);
}

运行结果:

2. 构造器注入

  • 给类加上无参构造和有参构造

2.1 配置文件注入

使用

  • 构造参数有几个就要写几个,要与构造方法匹配
<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="com.yd.pojo.User">
        <constructor-arg name="name" value="小丽"></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
        <constructor-arg name="account" ref="account"></constructor-arg>
    </bean>

    <bean id="account" class="com.yd.pojo.Account">
        <constructor-arg name="aid" value="201"></constructor-arg>
        <constructor-arg name="balance" value="9999.05"></constructor-arg>
    </bean>

</beans>

2.2 运行上面1.2的代码

运行结果:

3. 自动注入

3.1 根据类型 autowire="byType"(局部)

  • 将User类的构造方法添加一个两个参数的构造,与xml匹配
  • 在对应的bean标签上添加属性autowire="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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    
	<!--autowire="byType" 根据类型自动注入-->
    <bean id="user" class="com.yd.pojo.User" autowire="byType">
        <constructor-arg name="name" value="小丽"></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
    </bean>

    <bean id="account" class="com.yd.pojo.Account">
        <constructor-arg name="aid" value="201"></constructor-arg>
        <constructor-arg name="balance" value="8888.08"></constructor-arg>
    </bean>

</beans>

运行1.2代码结果:

3.2 根据属性名 autowire="byName"(局部)

  • 使用值注入,就不用带参构造(也可以同3.1使用构造注入)
  • 在对应的bean标签上添加属性autowire="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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!--autowire="byName" 根据属性名自动注入-->
    <bean id="user" class="com.yd.pojo.User" autowire="byName">
        <property name="name" value="小王"></property>
        <property name="age" value="23"></property>
    </bean>

    <bean id="account" class="com.yd.pojo.Account">
        <constructor-arg name="aid" value="201"></constructor-arg>
        <constructor-arg name="balance" value="8888.08"></constructor-arg>
    </bean>

</beans>

运行1.2代码结果:

3.3 全局设置自动注入

  • 在最大的<beans>标签中添加全局自动注入default-autowire="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
        https://www.springframework.org/schema/beans/spring-beans.xsd"
        default-autowire="byType">

    <bean id="user" class="com.yd.pojo.User">
        <property name="name" value="小李"></property>
        <property name="age" value="30"></property>
    </bean>

    <bean id="account" class="com.yd.pojo.Account">
        <constructor-arg name="aid" value="301"></constructor-arg>
        <constructor-arg name="balance" value="6666.08"></constructor-arg>
    </bean>

</beans>

运行1.2代码结果:

4. 总结

  • 局部注入只针对单个的bean对象;
  • 全局注入针对的是<beans>下所有的bean对象;
  • 开发中推荐使用autowire="byType",全局/局部根据实际情况选择。

4. 空值注入

  • <value/>

  • value = ""

  • <null/>表示的是null,空指针

  • value = "null" 表示的是“null”字符串

**** 注意:注意区分空指针和null字符串!

5. 集合属性注入(array、set、list、map、properties)(了解)

  • 建一个Data类放以上属性(需包含get/set/toString方法)

  • xml配置bean
<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
        https://www.springframework.org/schema/beans/spring-beans.xsd"
        default-autowire="byName">

    <bean id="data" class="com.yd.pojo.Data">
        <property name="array">
            <array>
                <value>苏州</value>
                <value>无锡</value>
                <value>常州</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>蒸羊羔</value>
                <value>蒸熊掌</value>
                <value>蒸鹿尾</value>
            </list>
        </property>
        <property name="set">
            <set>
                <value>北京</value>
                <value>北京</value>
                <value>天津</value>
                <value>河北</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="101" value="张三"/>
                <entry key="102" value="李四"/>
                <entry key="103" value="王五"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="user">root</prop>
                <prop key="pwd">123456</prop>
                <prop key="sex">male</prop>
            </props>
        </property>
    </bean>

</beans>
  • 运行代码
@Test
public void getData(){
    //获取spring配置文件生成的对象
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
    Data data = (Data) ac.getBean("data");
    System.out.println(data);
}
  • 运行结果:

  • 注意:1. set集合存放不重复的数据

    ​ 2. default-autowire="byName",若是byType,properties会自动注入系统默认属性值(系统配置信息等)

Copyright © 2024 萌栈师
Powered by .NET 9.0 on Kubernetes