我只是想着这个。如果我在春天有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属性是否符合请求的安全性?
答案 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设计模式无关。您需要注意线程安全并同步对此属性的访问。