2014-11-11 3 views
1

이것은 컨트롤러 인 @autowire TestRunner testRunner입니다. 스프링은 singletone 범위의 빈을 생성하므로 testRunner가 모든 스레드간에 공유 될 것이라고 생각합니다. 이 testRunner 유즈 setTestRunner 클래스 수준의 일부 변수를 설정하는 방법.멀티 스레딩과 관련된 스프링 문제

이 접근 방식은 멀티 스레딩에서 문제를 발생시킬 수 있습니까?

@Controller 
@RequestMapping("/welcome") 
public class HomeController { 

@Autowire 
TestRunner testRunner; 

    @RequestMapping(method = RequestMethod.GET) 
    public void addCustomerPage(User user) { 

     A a = new A(); 
     a.set(user.get) .... 
     B b = new B(); 
     b.set(user.get) .... 
     C c = new C(); 
     c.set(user.get) .... 

     testRunner.setTestRunner(a, b, c); 
     Thread t = new Thread(testRunner); 
     t.start(); 
    } 

} 

이것은 TestRunner 클래스입니다. 그것이하여 동일한 인스턴스가 전체 응용 프로그램에서 공유하는 응용 프로그램의 범위에 살고 그래서 예는 것

@Component 
public class TestRunner implements Runnable{ 

    private A a; 
    private B b; 
    private C c; 

    public void setTestRunner(A a, B b, C c){ 
     this.a = a; 
     this.b = b; 
     this.c = c; 
    } 

    public void run() { 
     // use a,b,c. 

    } 

} 

답변

3

,

테스트 러너 클래스는 싱글이다.

하지만 상태에 따라 값을 사용하고 요청에 따라 값을 설정하십시오.

어느 것은 프로토 타입으로 당신의 TestRunner 클래스 범위를 만들거나 전혀 autowire하기하지 않고 나는 새의 TestRunner 인스턴스와 시도

@Scope(value = "prototype") 
+0

새의 TestRunner 인스턴스를 생성하지만 나는 스프링에서 autowiring 기능을 사용할 수 없습니다 testRunner에서 TestRunner 클래스를 autowire해야했습니다. 하나의 옵션이 될 수있는 프로토 타입 범위에 대해 언급했지만 애플리케이션에 어떤 단점이 있는지 알려주시겠습니까? – user1298426

+0

bean 배치의 non-singleton, prototype 범위는 특정 bean에 대한 요청이있을 때마다 새로운 bean 인스턴스를 생성합니다. 따라서 새로운 인스턴스()로 작성하는 것과 유사합니다. 단점은 응용 프로그램에 완전히 의존하지만 제공하는 예제에는 아무 것도 없습니다. 주제에 대한 자세한 내용 : http://docs.spring.io/spring/docs/3.0.0.RC2/spring-framework-reference/html/ch03s05.html – Pumpkin

+0

Thx. 너의 요점이있어. 한가지 마지막 질문은 TestRunner 클래스 위에 @Scope ("prototype")을 추가하면 작업이 가능하다는 것입니다. – user1298426

관련 문제