1

我正在尝试实现FactoryBean。这是我的代码:

public class SkilledEmployee extends AbstractFactoryBean<Employee> {

    private Employee emp;
    private Skill skill;

    public SkilledEmployee(Employee emp, Skill skill) {
        this.emp = emp;
        this.skill = skill;
    }

    public Class<Employee> getObjectType() {
        return Employee.class;
    }

    protected Employee createInstance() throws Exception {
            Employee emp1 = new Employee(emp);
        emp1.addSkill(skill);
        return emp1;
    }

    public boolean isSingleton() {
        return true;
    }

}

以下是我声明我的 bean 的方式:

<bean id="skilledEmployee1" class="com.pramati.spring.SkilledEmployee">
                <constructor-arg ref="subordinate3"/>
                <constructor-arg ref="singing"/>
            </bean>
            <bean id="skilledEmployee2" class="com.pramati.spring.SkilledEmployee">
                <constructor-arg ref="subordinate2"/>
                <constructor-arg ref="singing"/>
            </bean>

当我从上下文中获取这些 bean 时,我看到我得到了不同的 bean,尽管我将对象声明为单例。

我正在尝试了解 FactoryBean,但我知道这不是一个有效的用例,而且是设计上的一个错误。但我想知道它为什么会这样?有人可以解释一下吗?

4

2 回答 2

1

这是两个不同的 bean,因为您分别声明了它们。更简单的例子:

<bean id="foo1" class="com.example.Foo"/>
<bean id="foo2" class="com.example.Foo"/>

在这里,我们声明了两个单例 bean,foo1并且foo2. 如果你从 Spring 中获取它们,你会得到两个不同的对象。但是,如果您再次获取它们,您将获得相同的对象。

同样在您的情况下:skilledEmployee1andskilledEmployee2是两个不同的单例 bean。如果您再次从上下文中获取它们,您将收到相同的实例 - 正如预期的那样。

于 2012-06-01T09:27:37.483 回答
0

只是对已经回答的内容的补充。在将工厂 bean 声明为单例时,它会在 bean 初始化本身上调用 createInstance()。对工厂 bean 的任何进一步调用都会导致相同的实例。如果 singleton() 未被覆盖,则默认值为 false。并且在 bean 初始化时,不会创建实例。它为每个获取工厂 bean 的调用创建一个新实例。

于 2012-07-01T10:02:15.990 回答