bean中的方法属性可见性(线程安全与否?!)

时间:2011-10-07 13:47:41

标签: java spring spring-mvc

我只是想着这个。如果我在春天有dao bean并且dao bean有一个protected / public属性“currentSQL”。对于所有可靠的请求,此属性中的值是“可见的”吗?

示例:

@Component
public class FooDAO {

  @Autowired
  private DataSource dataSource;

  private String currentSQL;

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

  public String getSome()
  {
    return currentSQL;
  }
}

该示例中的currentSQL属性是否符合请求的安全性?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

对于fooDAO spring上的每个访问(请求),都会创建一个新的FooDAO实例。然后它可以被认为是线程安全的,只要你的本地线程不使用相同的FooDAO实例。如果是这种情况,则必须使用“public synchronized void doSome()”

处理线程访问
<bean id="fooDAO" class="-" scope="singleton"/>

如果你的bean是Singleton,那么它不是线程安全的。单例实例在您的应用程序之间共享。如果是这种情况,则必须同步该方法。

答案 2 :(得分:0)

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