Springのフレームワークでは、特定の1つのプロパティに対してのみBeanが使用されるときは常に、それを内部Beanとして宣言することをお勧めします。内部beanは、セッターインジェクションの

property

とコンストラクターインジェクション

constructor-arg

の両方でサポートされています。

Spring内部Beanの使用方法を示すための詳細な例を参照してください。

package com.mkyong.common;

public class Customer
{
    private Person person;

    public Customer(Person person) {
        this.person = person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    @Override
    public String toString() {
        return "Customer[person=" + person + "]";
    }
}

package com.mkyong.common;

public class Person
{
    private String name;
    private String address;
    private int age;

   //getter and setter methods

    @Override
    public String toString() {
        return "Person[address=" + address + ",
                               age=" + age + ", name=" + name + "]";
    }
}

多くの場合、 “Person” Beanを以下のように “Customer” bean、personプロパティに参照するために

` ref

‘属性を使用することができます:

<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-2.5.xsd">

    <bean id="CustomerBean" class="com.mkyong.common.Customer">
        <property name="person" ref="PersonBean"/>
    </bean>

    <bean id="PersonBean" class="com.mkyong.common.Person">
        <property name="name" value="mkyong"/>
        <property name="address" value="address1"/>
        <property name="age" value="28"/>
    </bean>

</beans>

一般的に、このように参照するのは問題ありませんが、 ‘mkyong’の人のBeanはCustomer Beanにのみ使われるので、この ‘mkyong’の人を以下のように内部のBeanとして宣言する方が良いでしょう:

<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-2.5.xsd">

    <bean id="CustomerBean" class="com.mkyong.common.Customer">
        <property name="person">
            <bean class="com.mkyong.common.Person">
                <property name="name" value="mkyong"/>
                <property name="address" value="address1"/>
                <property name="age" value="28"/>
            </bean>
        </property>
    </bean>
</beans>

この内部Beanは、次のようにコンストラクタインジェクションでもサポートされました。

<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-2.5.xsd">

    <bean id="CustomerBean" class="com.mkyong.common.Customer">
        <constructor-arg>
            <bean class="com.mkyong.common.Person">
                <property name="name" value="mkyong"/>
                <property name="address" value="address1"/>
                <property name="age" value="28"/>
            </bean>
        </constructor-arg>
    </bean>
</beans>

それを実行します

package com.mkyong.common;

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

public class App
{
    public static void main( String[]args )
    {
        ApplicationContext context =
          new ClassPathXmlApplicationContext(new String[]{"Spring-Customer.xml"});

        Customer cust = (Customer)context.getBean("CustomerBean");
        System.out.println(cust);

    }
}


出力

Customer[person=Person[address=address1, age=28, name=mkyong]]....

link://tag/spring/[spring]