2011-12-16 3 views
2

나는 상태있는 스프링 빈을 가지고있다. 애플리케이션에서 사용 범위를 프로토 타입으로 적용하려면 어떻게해야합니까?스프링 빈의 프로토 타입 범위를 적용하는 방법

싱글 톤 범위로이 빈을 주입하는 프로젝트에서 다른 개발자를 방지하려면 어떻게해야합니까?

주석을 사용하거나 XML 구성을 통해 범위를 구성 할 수 있다는 것을 알고 있습니다. Spring 3을 사용할 때 annotation으로 구성된 범위는 xml에서 수동으로 정의 된 범위에 의해 재정의됩니다. 어떻게하면 구성이나 프로그래밍 방식으로 범위를 적용 할 수 있습니까? 그래서 내 콩이 결코 싱글 톤으로 사용되지 않을까요?

응용 프로그램 시작시 bean 범위를 검사하려고 생각했지만 우아한 해결책처럼 들리지는 않습니다.

+0

당신이하려는 사람을 찾고있는 것을 달성 할 수있는 유일한 방법입니다 두 번 그냥 bean 정의로 가서 어쨌든 싱글 톤을 원한다고 생각한다면 그것을 바꾼다. 동료와의 불법 행위로부터 코드를 보호하는 것보다 우선 순위가 높은 방법이 있습니다. – Affe

+0

그 이유는 내가 애플 리케이션의 시작에 대한 테스트 접근법에 대해 생각 ...하지만 나는 좋은 해결책이 될 것이라고 확신하지 않습니다. 당신이 너무 방어 적이 지 않아야한다는 것을 알고 있지만, 문제는이 빈에 나쁜 범위를 사용하면 메모리가 부족할 때까지 작동한다는 것입니다. 그래서 자리를 잡기가 어렵고, 다시 일어날 수도 있습니다. 피어는 코드의 모든 라인을 검토하여 코드를 막을 수는 있지만 인력이나 관리자가 그렇게 할 의사는 없습니다. – somecto

답변

3

이 우아한 아니지만, AFAIK 이것은 당신이 생각하는 것과 같은 사람들이에 대해 자신을 '보호'

public class MyStatefulBean implements InitializingBean, ApplicationContextAware, BeanNameAware { 

    private String myName; 

    private ApplicationContext context; 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     this.context = applicationContext; 
    } 

    @Override 
    public void setBeanName(String s) { 
     this.myName = s; 
    } 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     if(this.context.isSingleton(this.myName)) 
      throw new RuntimeException("Bean CANNOT be singleton"); 
    } 
} 
+0

코드베이스의 중요한 부분을 오용으로부터 보호해야 할 때 우아함을 고려해야 할 때가 있습니다. 감사. – somecto

0

문서를 첨부할까요? 프로토 타입을 얻기 위해 누군가가 빈에 대한 참조를 유지하고 그것을 재사용하거나 스레드를 통해 공유하는 경우 getBean()을 사용해야했을 때 알 수있는 방법이 없습니다.

스프링은 동료가 단순히 잘못된 코드를 작성하는 것을 막을 수는 없습니다. 이는 그와 같은 사용법입니다.

+0

충분 하긴하지만, 스프링으로 동료들이 콩 범위의 설정을 무시하는 것을 막을 수 있습니까? (기록을 위해, 이것은 문서화되어있다. 그러나 어떤 녀석은 그것을 읽지 않았다. 그리고 우리는 이것을 생산으로 인해 메모리 누수가있다.) – somecto

0

예상되는대로 API 사용자에게 의존하고 싶지 않다면, 공장을 통해 빈을 노출하십시오.

+0

좋은 옛날 공장이 하겠지만 Spring ServiceLocatorFactoryBean을 사용할 때, 나는 어쨌든 구성이 무시됩니다. 어떤 아이디어? – somecto

+0

@sebul 어떻게 구성이 무시 될까요? –

+0

그것은 그것을 오버라이드하지 않지만, 첫 번째 것을 임포트하는 다른 Spring 설정에서 오버라이드 할 수 있습니다. 실제로 내가 선호하는 것은 주석에 의해 정의 된 범위가 xml에 정의 된 범위보다 우선 순위를가집니다. 그렇지 않으면, Spring이 말 그대로 남용되는 어플리케이션에서, xml config에 의해 범위가 오버라이드되는 위험이 높습니다. 특히 여러 레벨의 Spring 설정 파일이있을 때. – somecto