Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 理解有效的对象创建_Java_Spring - Fatal编程技术网

Java 理解有效的对象创建

Java 理解有效的对象创建,java,spring,Java,Spring,J.Bloch写了以下关于对象创建的内容: 相反,通过维护自己的对象来避免对象创建 池是个坏主意,除非池中的对象非常复杂 重量级 因此,如果我们开始声明性地创建太多的bean,那么在容器中使用正在创建的SpringBean可能会造成一些伤害。例如,我通过declration提供工厂对象的状态: <bean id="userFactory" class="com.foo.factory.UserFactory"> <property name="creatorMap"&g

J.Bloch写了以下关于对象创建的内容:

相反,通过维护自己的对象来避免对象创建 池是个坏主意,除非池中的对象非常复杂 重量级

因此,如果我们开始声明性地创建太多的bean,那么在容器中使用正在创建的SpringBean可能会造成一些伤害。例如,我通过declration提供
工厂
对象的状态:

<bean id="userFactory" class="com.foo.factory.UserFactory">
    <property name="creatorMap">
        <!-- map's declaration -->
    </property>
</bean>

public class UserFactory{
     Map<UserType, Creator> creators;

     public User create(UserType t){

         return creators.get(t).create();
     }
}

public enum UserType{
    VIP,
    GUEST,
    ACTIVE,
    //etc
}

public interface Creator{
    public User create();
}

公共类用户工厂{
地图创作者;
公共用户创建(用户类型t){
返回creators.get(t.create();
}
}
公共枚举用户类型{
贵宾,
嘉宾:,
活跃的,
//等
}
公共接口创建者{
公共用户创建();
}

在SpringBeans中声明这样的工厂不是一个坏主意吗?

我认为Joshua建议的上下文对于创建对象来说是非常昂贵的-
非常重要的
。您创建对象池是为了重用和避免昂贵的创建,例如
连接池等。您所指的框架(Spring)本身在其基础架构代码中使用了大量这样的工厂。所以在我看来它应该

归结起来,就是在应用程序中是否需要这样的工厂。使用此类工厂的每个应用程序线程都会创建自己的上下文对象,其数量取决于对工厂bean的请求。

您对创建此类工厂有何顾虑?@Ajan因为在项目中,我可能有数百个不同的工厂。因此,使用此类工厂不会有害,是吗?您的用例似乎没有创建非常昂贵的对象,所以这些应该是好的。如果您不在SpringContainer中创建这些工厂,您将在其他地方创建它,并将失去您可能从容器管理工厂中获得的任何好处。谢谢。事实上,我需要为不同的项目使用不同的工厂(包含不同的创建者地图)。这就是我决定这么做的原因。。。