据我所知,Spring bean 默认是单例的。
我想要的是考虑实例属性使 bean 成为线程安全的。我将尝试使用一个简单的示例向您展示。
考虑以下代码:
@Controller
public class MyServlet {
@Autowired
private HelloService service;
@RequestMapping(value="/hello", method = RequestMethod.GET)
public void sayHello(HttpServletRequest req, HttpServletResponse res) throws IOException {
service.doStuff();
}
}
public class HelloService {
private int i = 1;
public void doStuff() {
System.out.println("Started " + i);
i++;
System.out.println(Thread.currentThread().getName() + " Done " + i);
}
}
输出将是这样的:
32911580@qtp-28064776-0 - Started 1
7802158@qtp-28064776-2 - Started 2
32911580@qtp-28064776-0 - Done 3
7802158@qtp-28064776-2 - Done 3
这证明了“i”变量在多个线程之间共享。
我还尝试将 HelloService bean 定义为原型,就像这样
<bean id="helloService" class="my.package.HelloService" scope="prototype" />
但结果是一样的。
我发现解决这个问题的唯一方法是: - 将声明移动到 doStuff() 方法中,但这不是我想要的 - 制作 doStuff() 方法,但这意味着有锁
我想要的是在每次通话时都有一个新的 HelloService 实例。
谁能帮我?提前致谢。
更新
我使用查找方法找到了方法注入的解决方案。 http://static.springsource.org/spring/docs/3.1.1.RELEASE/spring-framework-reference/html/beans.html#beans-factory-lookup-method-injection