Bean中的方法属性可见性(线程安全吗?!)

Bean中的方法属性可见性(线程安全吗?!)

问题描述:

我只是在想这个。如果我在春天有dao bean并且dao bean有一个受保护的/公共属性“currentSQL”。对于所有相关请求或不是,这个属性的值是“可见的”吗?Bean中的方法属性可见性(线程安全吗?!)

实施例:

@Component 
public class FooDAO { 

    @Autowired 
    private DataSource dataSource; 

    private String currentSQL; 

    public void doSome() 
    { 
    currentSQL = "Foo SQL query"; 
    } 

    public String getSome() 
    { 
    return currentSQL; 
    } 
} 

是在例如currentSQL属性上述每个请求或不安全?

这取决于你如何设置FooDAO bean的范围。

<bean id="fooDAO" class="-" scope="prototype"/> 

对于fooDAO spring的每个访问(请求)创建一个FooDAO的新实例。然后它可以被认为是线程安全的,只要你的本地线程不使用同一个FooDAO实例。如果是的话,你必须处理与“公共同步无效doSome()”

<bean id="fooDAO" class="-" scope="singleton"/> 

如果你的bean辛格尔顿,那么它不是线程安全线程访问。单例实例在您的应用程序*享。如果是这种情况,那么你必须同步该方法。

+0

重要的问题是你的DAO不应该有状态。这不是一个好习惯。他们提供持久层的方法/操作。如果你的单例在服务层有状态,你必须确保它们上的多重访问必须同步,无论它们是否有状态。 –

+0

&@ danny.lesnik嗯,我认为:)在我的例子中是小错误,应该有“库”注释而不是“组件”。但是,这并没有改变,Repository仍然是Singleton的范围。而通过Spring定义,DAO应该是单例作用域(我希望:))。最好将所有属性作为参数传递给方法?或者是否有解决方案来使该属性线程安全或请求安全。我需要这个功能,因为我需要存储一些针对每个请求不同的信息。 – Peter

+0

啊,我不小心删除了我以前的评论。这个线程现在看起来很疯狂:)。好的,正如我在春季手册中看到的那样,春天最好的做法是减少州级课程。好的,我会重构我的DAO类。 – Peter

如果您的bean配置将您的DAO设置为一个单例作用域bean(http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-scopes),则该对象将在整个注入该应用程序的应用程序*享,并且该实例var不安全。请注意,单身作用域是默认作用域。

不,它不会。你的bean是Singleton范围,这意味着你只有一个类的实例,但这并不意味着它是线程安全的。 Singleton范围与Singleton设计模式无关。您需要注意线程安全并同步访问此属性。