在spring中创建bean的n个实例

时间:2016-06-03 10:56:47

标签: java spring spring-mvc

我在一次采访中得到一个问题,只创建任何bean的n(固定数量)实例。如果尝试在运行时创建多于n个实例,则抛出任何异常或打印消息。提前谢谢

2 个答案:

答案 0 :(得分:2)

通过提供自定义bean工厂,可以轻松控制bean的对象创建。您可以在其中配置限制,如固定数量的对象创建。

Example代码。

答案 1 :(得分:1)

您只需要管理创建的实例数量,您可以使用列表和非标准构造函数在同一个bean中执行此操作,但我将使用工厂模式:

发送此 bean

class BeanTest {
    String name;

    protected BeanTest(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return this.name;
    }

}

您可以像这样创建一个Factory(在相同的包中!)

class BeanFactory {
    private static final int LIMIT = 5;
    private static List<BeanTest> list = new ArrayList<BeanTest>();

    public static synchronized BeanTest getInstance(String name) {
        if (list.size() < LIMIT) {
            BeanTest beanTest = new BeanTest(name);
            list.add(beanTest);
            return beanTest;
        }
        System.out.println("Not giving instance");
        return null;
    }

}

测试:

public static void main(String[] args) {
    BeanTest a1 = BeanFactory.getInstance("a1");
    System.out.println(a1);
    BeanTest a2 = BeanFactory.getInstance("a2");
    System.out.println(a2);
    BeanTest a3 = BeanFactory.getInstance("a3");
    System.out.println(a3);
    BeanTest a4 = BeanFactory.getInstance("a4");
    System.out.println(a4);
    BeanTest a5 = BeanFactory.getInstance("a5");
    System.out.println(a5);
    BeanTest a6 = BeanFactory.getInstance("a6");
    System.out.println(a6);
}

输出:

a1
a2
a3
a4
a5
Not giving instance
null

注意:

  • 如果您需要更多安全性,只需将bean构造函数的getInstance方法添加到BeanTest类本身,并使instead的构造函数为protected
  • 您还可以制作方法destroyInstanceremoveInstance,以便更加动态Factory

    public static synchronized boolean removeInstance(BeanTest toRemove) {
        if (list.contains(toRemove)) {
            return list.remove(toRemove);
        }
        return false;
    }