Spring之四:Spring的属性注入详解(maven idea)

set方法函数注入

构造函数注入


set方法函数注入:解决依赖问题

我们这里有两个类User和Car,其中Car在User类中,因为Spring不是怎么自己产生对象,而是容器产生,那么如何将car注入到User中了,我们用Set方法注入。将其注入。

先建立两个类,User和Car,并在User中申明Car.两个类的源代码如下:

car:

package com.lydetails.ssm.Test;

public class Car {
    private String name;
    private String color;

    public String getName() {
        return name;
    }

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

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Car() {
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", color='" + color + '\'' +
                '}';
    }
}

User:

package com.lydetails.ssm.Test;

public class User {
    private String name;
    private Integer age;
    private Car car;

    public User() {
        System.out.println("User构造函数");
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

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

    public void setCar(Car car) {
        this.car = car;
    }

    public Car getCar() {
        return car;
    }
}


然后在配置文件中将两个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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="com.lydetails.ssm.Test.User" >
        <property name="name" value="tom"></property>
        <property name="age" value="19"></property>
        <property name="car" ref="car"></property>
    </bean>

    <bean id="car" class="com.lydetails.ssm.Test.Car">
        <property name="name" value="SUV"></property>
        <property name="color" value="white"></property>
    </bean>

</beans>

关键代码就是:

<property name="car" ref="car"></property>

用ref将两个Bean连接起来。


然后进行测试,源代码如下:

@Test
//测试set注入
public void func4() {
    //加载配置文件
    ApplicationContext apl = new ClassPathXmlApplicationContext("ApplicationContext.xml");
    User users = (User) apl.getBean("user");
    System.out.println(users);
}

结果如下:




构造函数注入:

构造函数的注入就和set的构造函数相同,只需要在User类中生命构造函数

public User(String name, Integer age, Car car) {
    this.name = name;
    this.age = age;
    this.car = car;
}

然后在配置文件中进行配置

<bean id="user2" class="com.lydetails.ssm.Test.User" >
    <constructor-arg name="name" value="constour"></constructor-arg>
    <constructor-arg name="age" value="100"></constructor-arg>
    <constructor-arg name="car" ref="car"></constructor-arg>
</bean>

就可以使用了,但是问题来了,构造函数不止一种,比如如下

public User(Car car,String name, Integer age) {
    this.name = name;
    this.age = age;
    this.car = car;
}

构造函数中了逻辑发生了改变,那么你执行配置文件的时候,执行构造注入是没有顺序的,所以不能标明你使用的哪个构造函数,为了解决这个问题,就需要使用构造函数注入中的index属性,标识构造函数的顺序,源代码如下:

<bean id="user2" class="com.lydetails.ssm.Test.User" >
    <constructor-arg name="name" value="constour" index="1"></constructor-arg>
    <constructor-arg name="age" value="100" index="2"></constructor-arg>
    <constructor-arg name="car" ref="car" index="0"></constructor-arg>
</bean>

不过这时候问题又来了,就是参数的类型,你要对参数的类型进行控制啊,比如下面这个构造函数,第二个参数传入的是一个Integer类型:

public User(Car car,Integer name, Integer age) {
    this.name = name+"";
    this.age = age;
    this.car = car;
}

那么也需要在配置文件中标出:

<bean id="user2" class="com.lydetails.ssm.Test.User" >
    <constructor-arg name="name" value="8888" index="1" type="java.lang.Integer"></constructor-arg>
    <constructor-arg name="age" value="100" index="2"></constructor-arg>
    <constructor-arg name="car" ref="car" index="0"></constructor-arg>
</bean>
最终结果如下:



构造函数注入的总结:

index:表示参数位置

type:表示参数类型


其他类型注入基本不会用,就不介绍了


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值