Java如何在Spring中定义内部bean?

内部bean是另一个bean内部的一个bean定义,可以看作一个内部类。换句话说,内部bean是在另一个bean范围内定义的bean。在这种情况下,内部bean只能由外部bean使用。Spring上下文中没有其他bean可以引用该bean。

因此,如果您确定仅在单个Bean中使用Bean,则最好改用内部Bean。可以通过setter注入或构造函数注入来注入内部bean。

这是内部bean注入的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="racer">
        <property name="car">
            <bean>
                <property name="maker" value="Ferrari"/>
                <property name="year" value="2019"/>
            </bean>
        </property>
    </bean>

</beans>

在此配置中,我们使用二传手注射。因此,我们使用property元素。我们没有使用ref属性来引用另一个bean,而是使用bean元素内部的property元素定义了bean 。然后,我们创建Carbean并设置其属性。

如果要构造函数注入,可以通过在bean元素内定义bean来将Carbean注入bean。Racerconstructor-argRacer

下面是我们的Racer和Car类。

package org.nhooo.example.spring.innerbean;

public class Racer {
    private Car car;

    public Racer() {
    }

    public Racer(Car car) {
        this.car = car;
    }

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

    @Override
    public String toString() {
        return "Racer{" +
            "car=" + car +
            '}';
    }
}
package org.nhooo.example.spring.innerbean;

public class Car {
    private String maker;
    private int year;

    public void setMaker(String maker) {
        this.maker = maker;
    }

    public void setYear(int year) {
        this.year = year;
    }

    @Override
    public String toString() {
        return "Car{" +
            "maker='" + maker + "'" +
            ", year=" + year +
            '}';
    }
}

让我们创建我们的Demo类来运行程序:

package org.nhooo.example.spring.innerbean;

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

public class Demo {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(
            new String[]{"inner-bean.xml"});

        Racer racer = (Racer) context.getBean("racer");
        System.out.println("Racer = " + racer);
    }
}

这是我们程序的输出:

Racer = Racer{car=Car{maker='Ferrari', year=2019}}