프로토 타입 범위의 클래스 프록시 된 스프링 빈을 사용하여 이상한 동작을 관찰하고 있습니다. 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();
음의 주석을 붙일 수 있고 ... 당신은 프로토 타입이 경우 하나의 범위 스레드를 원하거나하지 개체를 범위 요청합니다. –
나는 실제로 이것을 원한다 : 한 번 _ 수동적으로 만들어지면 빈은 장면 뒤에서 "재창조"되지 않는다. 저는 JDK 프록시로 전환했습니다 - 그들은 예상대로 작동합니다 (적어도 나). 여전히 인터페이스를 사용하기 위해서는 클래스 전용 메서드를 인터페이스로 승격시켜야했습니다. 그래도이 부분은 마음에 들지 않습니다. – Nick99