Spring4学习回顾之路04—配置Bean (中)

Posted DC红茶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring4学习回顾之路04—配置Bean (中)相关的知识,希望对你有一定的参考价值。

引用其他Bean

   组件应用程序的Bean经常需要相互协作以完成应用程序的功能,所以要求Bean能够相互访问,就必须在Bean配置文件中指定Bean的引用。在Bean的配置文件中可以用过<ref>元素或者ref属性为Bean的属性或构造器参数指定对Bean的引用。也可以在属性或者构造器里包含Bean的声明,这样的Bean称为内部Bean。具体看代码,在之前的Student类上新增Book类,(一个学生有一本书)。代码如下:

Book.java

package com.lql.spring01;

/**
 * @author: lql
 * @date: 2019.10.11
 * Description:
 * Created with IntelliJ IDEA
 */
public class Book {

    private String name;

    private double price;


    public String getName() {
        return name;
    }

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

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

Student.java 

package com.lql.spring01;/**
 * @author: lql
 * @date: 2019.09.24
 * Description:
 */
public class Student {

    private String name;

    private Integer age;

    private Book book;

    public Book getBook() {
        return book;
    }

    public void setBook(Book book) {
        this.book = book;
    }

    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;
    }
}

 

然后在applicationContext.xml的配置文件中配置Book类的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:标识  class:类路径   name:属性名,注意是针对set方法的属性名,不是变量的属性名    value:属性值  -->
    <bean id="student" class="com.lql.spring01.Student">
        <property name="name" value="lql"></property>
        <property name="age" value="18"></property>
        <property name="book" ref="book"></property>
        <!--<property name="book">
            <ref bean="book"></ref>
        </property>-->
    </bean>

    <bean id="book" class="com.lql.spring01.Book">
        <property name="name" value="三国演义"></property>
        <property name="price" value="79.9"></property>
    </bean>
</beans>

 

代码中就是使用<ref>元素或者ref属性来引用的示例,测试是没问题的:

public void Hello() {

        System.out.println("Hello :" + this.getName() + ",Book:" + this.book.getName());
    }

    public static void main(String[] args) {//创建IOC容器
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        Student student = app.getBean("student", Student.class);
        //调用方法
        student.Hello();
    }

//输出:Hello :lql,Book:三国演义

 

内部Bean

  当Bean的实例仅仅给一个特定的属性使用时,可以将其声明为内部Bean,内部Bean声明直接包含<property>或<constructor-arg>元素里,不需要设置任何的id或name属性,内部Bean不能使用在任何其他地方。

实际很简单,配置更改如下:

 <bean id="student" class="com.lql.spring01.Student">
        <property name="name" value="lql"></property>
        <property name="age" value="18"></property>
        <!--内部bean-->
        <property name="book">
            <bean class="com.lql.spring01.Book">
                <property name="price" value="100.0"></property>
                <property name="name" value="时间简史"></property>
            </bean>
        </property>
</bean>

 

测试也是没问题的,这里省略打印。

NULL值和级联属性

可以使用专用的<null/>元素标签为Bean的字符串或其它对象类型的属性注入null值(意义不大,了解知道有这么回事就行了),当然Spring也支持级联属性的配置。

<?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:标识  class:类路径   name:属性名,注意是针对set方法的属性名,不是变量的属性名    value:属性值  -->
    <bean id="student" class="com.lql.spring01.Student">
        <property name="name" value="lql"></property>
        <property name="age" value="18"></property>
        <property name="book">
            <null/>
        </property>
    </bean>
    <bean id="book" class="com.lql.spring01.Book">
        <property name="name" value="三国演义"></property>
        <property name="price" value="79.9"></property>
    </bean>
</bean>

 

这样一来,book的引用就是null。级联属性的代码如下:

<?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:标识  class:类路径   name:属性名,注意是针对set方法的属性名,不是变量的属性名    value:属性值  -->
    <bean id="student" class="com.lql.spring01.Student">
        <property name="name" value="lql"></property>
        <property name="age" value="18"></property>
        <property name="book" ref="book"></property>
        <property name="book.price" value="19.9"></property>
        <property name="book.name" value="java从入门到放弃"></property>
    </bean>
    <bean id="book" class="com.lql.spring01.Book">
        <property name="name" value="三国演义"></property>
        <property name="price" value="79.9"></property>
    </bean>
</bean>

 

打印结果为:Hello :lql,Book:java从入门到放弃而非三国演义了。需要注意的是一定要提供setter()。并且我先给book赋值的后调级联属性的,<property name="book" ref="book"></property>,如果没有先引用直接使用级联属性可行不可行呢?答案是否定的,在Struts2里面是支持的,但是Spring是不支持。它会报:Value of nested property ‘book‘ is null。(但是很多情况下也用不到级联属性,知道了解就行了)。

 

以上是关于Spring4学习回顾之路04—配置Bean (中)的主要内容,如果未能解决你的问题,请参考以下文章

Spring4学习回顾之路06- IOC容器中Bean的生命周期方法

Spring4学习笔记二:Bean相关

Spring4学习笔记2-配置Bean

Spring4.0学习笔记 —— 通过FactoryBean配置Bean

Spring4.0学习笔记005——Bean的配置三(基于XML文件)

Spring4.0学习笔记005——Bean的配置三(基于XML文件)