Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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,一般说来,只选择那些没有状态的bean作为singleton。我刚接触Spring,并在Spring中阅读bean scope 我的第一个问题是这个状态对于Bean的实际含义是什么 其次,为什么建议只对无状态bean使用单例作用域?是否存在与线程安全相关的限制或其他原因 如果对方法的调用不仅依赖于给方法调用的参数,而且还依赖于以前的调用,那么对象(bean就是对象)就有一个状态 原则上,如果您有任何实例变量,您可能有一个状态。唯一的例外是,存储在实例(而不是静态)变量(这在spring编程中非常

一般说来,只选择那些没有状态的bean作为singleton。我刚接触Spring,并在Spring中阅读bean scope

我的第一个问题是这个状态对于Bean的实际含义是什么

其次,为什么建议只对无状态bean使用单例作用域?是否存在与线程安全相关的限制或其他原因

如果对方法的调用不仅依赖于给方法调用的参数,而且还依赖于以前的调用,那么对象(bean就是对象)就有一个状态

原则上,如果您有任何实例变量,您可能有一个状态。唯一的例外是,存储在实例(而不是
静态
)变量(这在spring编程中非常常见)中的单例不计入状态


使用多线程环境时,单线程中的状态可能会产生副作用。例如,一个线程设置状态(例如打开的连接),而另一个线程不期望此状态。然后一个线程可能会失败。

您希望在对象的哪个状态下运行程序。当您设计和编写类时,您不知道客户机是将其用作单例还是原型。容器配置对象。因此,它可能是singleton或prototype。例如TransactionWaredataSourceProxy spring framework的类被编写为以原型或单例运行。该类的编写方式确保它不会被多线程访问。由于所有线程共享的状态都是通过DI容器和一些setter方法实现的。因此,作为singleton的配置是在启动时通过容器进行的,它的公共值被所有线程或单个线程使用。实例变量的设置只使用一些setter方法进行一次。 例如,在TransactionWaredatasourceProxy类中,有REOBTAINTTRANSACTIONALCONNECTIONS作为实例变量

public TransactionAwareDataSourceProxy()
    {
        reobtainTransactionalConnections = false;
    }

    public TransactionAwareDataSourceProxy(DataSource targetDataSource)
    {
        super(targetDataSource);
        reobtainTransactionalConnections = false;
    }
    public void setReobtainTransactionalConnections(boolean reobtainTransactionalConnections)
    {
        this.reobtainTransactionalConnections = reobtainTransactionalConnections;
    }

这些是代码中reobtainTransactionalConnections未满足的地方。如果您决定通过DI容器将此类设置为单例,您可以使用构造函数注入或setter注入进行一次设置。因此,如果我们进行setter注入,那么setReobtainTransactionalConnections将是true或false,并在对象的整个生命周期内保持不变。我认为这就是使用容器配置对象的优点,对象状态控件可以很容易地进行

类的任何成员属性都称为其状态。

没有可变状态的类最适合成为Spring(singleton)bean。可变状态指的是那些在构建对象后可以为其分配新值的成员属性

具有成员属性(如jparespositionory)的bean(如DAO)可以被视为具有相当不可变的状态,因为一旦DAO对象被初始化,就没有人向jparespositionory属性分配新值

只有没有状态(没有成员属性)或具有不可变状态(成员变量的值在赋值后不会更新)的bean才是成为springbean的理想候选。这是因为大多数Springbean被配置为单例bean,并且由容器中的多个线程使用。想象一下,若您有可变状态,并且多个线程试图更新单例bean的状态,那个么您将永远不会得到可预测的结果


如果您的bean不是单例的,而是一个原型bean,那么,在我看来,这个问题更适合程序员。所以我可以说,对象的状态只不过是实例成员的引用和值。另外,我从您的回答中得到的信息是,spring内部不提供任何支持单例bean的线程安全。这是真的吗?状态存储在实例变量中。只要您没有实例变量,就很可能没有状态(有一些例外,例如,您也可以将状态存储在
静态
变量中,但在大多数情况下这不是您想要的)。对于第二条注释:不,必须在bean中实现线程安全。Spring无法确保您的实现是线程安全的。因此,如果我想确保我的单例bean是线程安全的,那么我需要显式地使其成为线程安全的。而不是依赖于弹簧。