2014-11-13 4 views
1

프로토 타입 범위의 클래스 프록시 된 스프링 빈을 사용하여 이상한 동작을 관찰하고 있습니다. Spring 4.1.2를 사용하고 있습니다.메소드가 호출 될 때마다 CGlib 유선 빈이 다시 생성됩니다.

하나의 빈을 수동으로 생성하고 그 메소드를 3 번 ​​호출합니다. 각 메소드 호출에서 새로운 클래스 인스턴스가 생성됩니다. 아래 코드는 새 ID를 인쇄합니다. 이것은 내가 bean 내부에 안정적으로 상태를 저장할 수 없다는 것을 의미합니다.

예상 : 클래스의 단일 인스턴스.

관찰 된 : 각 bean 메소드 호출은 새로운 클래스 인스턴스 작성을 유도합니다.

저는 CGlib를 파헤 쳤습니다. CGlib은 각 메소드 호출을 위해 bean factory에서 대상 Spring bean을 얻습니다. 스프링 빈 팩토리는 매번 새로운 빈을 생성한다 (프로토 타입 빈이므로).

예상 된 동작입니까? 아니면 버그입니까? 내가 JDK 프록시로 전환 한

@Component 
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class BeanClass1 extends SomeAbstractClass implements I1, I2 { 
    public void tellMe() { 
     System.out.println(this); 
    } 
} 

BeanClass1 bean = beanFactory.getBean(BeanClass1.class); 
bean.tellMe(); 
bean.tellMe(); 
bean.tellMe(); 
+0

음의 주석을 붙일 수 있고 ... 당신은 프로토 타입이 경우 하나의 범위 스레드를 원하거나하지 개체를 범위 요청합니다. –

+0

나는 실제로 이것을 원한다 : 한 번 _ 수동적으로 만들어지면 빈은 장면 뒤에서 "재창조"되지 않는다. 저는 JDK 프록시로 전환했습니다 - 그들은 예상대로 작동합니다 (적어도 나). 여전히 인터페이스를 사용하기 위해서는 클래스 전용 메서드를 인터페이스로 승격시켜야했습니다. 그래도이 부분은 마음에 들지 않습니다. – Nick99

답변

0

, 그들은 서로 빈 메서드 호출에 콩을 다시하지 않습니다.

빈 (bean)

은 이제 범위 프록시의 포인트입니다

@Component 
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
관련 문제