注入参数详解:null值和级联属性

可以使用专用的<null/>元素标签为Bean的字符串或其它对象类型的属性注入null值,和Struts、Hiberante等框架一样,Spring支持级联属性的配置。

使用<null/>元素标签的例子:

Spring.xml配置文件:

<?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="person" class="Person">
        <constructor-arg value="for"></constructor-arg>
        <constructor-arg value="56"></constructor-arg>
        <constructor-arg>
            <null/>
            <!--<bean id="car" class="Car">
                <constructor-arg value="baoma" index="1"></constructor-arg>
                <constructor-arg value="12" index="0"></constructor-arg>
                <constructor-arg value="10000" index="2" type="double"></constructor-arg>
            </bean>-->
        </constructor-arg>
    </bean>
</beans>

其中,就是使用了<null/>元素为Bean的属性注入null值。

Person类的文件:

public class Person {
    public String name;
    public int age;
    public Car car;


    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 Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }
    public Person(String name,int age,Car car){
        this.name = name;
        this.age = age;
        this.car = car;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", car=" + car +
                '}';
    }
}

 

Car类的文件:

public class Person {
    public String name;
    public int age;
    public Car car;


    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 Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }
    public Person(String name,int age,Car car){
        this.name = name;
        this.age = age;
        this.car = car;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", car=" + car +
                '}';
    }
}

  

main方法:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class CarMain {
    public static void main(String [] mains){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext ("spring1.xml");
        Person person = (Person) applicationContext.getBean ("person");
        System.out.println (person);



    }
}

 

级联属性: Spring 级联属性是当两个bean 关联时  从一个bean 给 另一个bean 赋值。就是当一个bean中的值去引用了另外一个bean的值时,就是级联属性。级联,按照我的理解,就是一个Bean引用了另外一个bean,则是这个bean就是一级,而另外一个bean是二级,所以就是级联的了。

例子如下,Spring.xml的配置文件

<?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="car" class="Car">
        <constructor-arg value="baoma" ></constructor-arg>
        <constructor-arg value="12" ></constructor-arg>
        <constructor-arg value="red" ></constructor-arg>
    </bean>
    <!--用构造器去配置属性-->
    <bean id="person" class="Person">
        <constructor-arg value="for"></constructor-arg>
        <constructor-arg value="56"></constructor-arg>
        <constructor-arg ref="car"></constructor-arg>
        <property name="car.price" value="11111.00"></property>
    </bean>
</beans>

 

Person类:

public class Person {
    public String name;
    public int age;
    public Car car;


    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 Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }
    public Person(String name,int age,Car car){
        this.name = name;
        this.age = age;
        this.car = car;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", car=" + car +
                '}';
    }
}

 

car类:代码如下

public class Car {
    public String name;
    public int num;
    public String color;
    public double price;


    public String getName() {
        return name;
    }

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

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getColor() {
        return color;
    }

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

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
    public Car(String name,int num,String color){
        this.name = name;
        this.num = num;
        this.color = color;
    }
    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", num=" + num +
                ", color='" + color + '\'' +
                ", price=" + price +
                '}';
    }
}

注意点:如果要级联属性赋值,就得要在被赋值的bean的类文件(bean属于那个类的文件比如car 属于Car类,所以就是Car类的文件)添加set方法,比如 publilc void setPrice(double price){this.price = price}.

main方法:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class CarMain {
    public static void main(String [] mains){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext ("spring1.xml");
        Person person = (Person) applicationContext.getBean ("person");
        System.out.println (person);
    }
}

 

 注意点:属性需要先初始化才可以级联属性赋值,否则会有异常,和Struts2不同。Struts2是自动地为级联属性赋值,就是自动地初始化级联属性了的。

实例证明:

<?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="car" class="Car">
        <!--<constructor-arg value="baoma" ></constructor-arg>
        <constructor-arg value="12" ></constructor-arg>
        <constructor-arg value="red" ></constructor-arg>-->
        <property name="car.name" value="bentian"></property>
    </bean>
    <!--用构造器去配置属性-->
    <bean id="person" class="Person">
        <constructor-arg value="for"></constructor-arg>
        <constructor-arg value="56"></constructor-arg>
        <constructor-arg ref="car"></constructor-arg>
        <property name="car.price" value="11111.00"></property>
    </bean>
</beans>

如上的bean(car) 的配置,就是不为其属性赋值,而直接级联属性赋值。这样的话,这个bean(car)则是null的,因为,只是申请了一个对象car而已,也就是申请了一个bean而已,没有真正地赋过值,所以就是null的。而person这个bean引用的car这个Bean则是null的,所以最后会报空异常。

结果:

 上面报错的意思是:person这个Bean嵌套的car值是空的。

所以属性需要先初始化才可以级联属性赋值,否则会有异常。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值