内部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}}