2012-04-28 4 views
2

싱글 톤 클래스 구현에 객체를 삽입하려고합니다. 그것은 작품을 나던이Singleton 클래스에서 ApplicationContextAware 사용

public class MyObjectWrapper implements ApplicationContextAware { 

    public static MyObject myObject; 
    private ApplicationContext ctxt; 
    private MyObjectWrapper() {} 

    public static synchronized MyObject getImpl() { 
     if (myObject!=null) 
      return myObject; 

     MyObjectWrapper myObjectWrapper=new MyObjectWrapper(); 
     this.myObject = (MyObject) myObjectWrapper.getCtxt().getBean("myobject"); 
     return myObject; 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext arg0) 
      throws BeansException { 
     logger.debug("setApplicationContext - " + arg0); 
     this.ctxt = arg0; 
    } 

    public ApplicationContext getCtxt() { 
     return ctxt; 
    } 

    public void setCtxt(ApplicationContext ctxt) { 
     this.ctxt = ctxt; 
    } 

} 
  1. 같은 뭔가, 그게 내가 MyObjectWrapper.getImpl를 호출 할 때() 내가 널을 MyObject를 얻을 수있다. myobject 및 MyObjectWrapper에 대한 빈 항목이 있습니다.

  2. getBean을 사용하는 것이 모범 사례는 아니지만이 특정 예에서는 허용되는 것으로 알고 있습니다. 단점은 무엇입니까? 여기에 없다면, 나는 Main 메소드에서 비슷한 getBean 호출을 할 것이다.

나는이 싱글의 창조를위한 책임을하지만 난 그냥 싶어, 내 주요 방법 (내가 거기 애플리케이션 컨텍스트에 접근하고있다)이 래퍼 클래스를의 getBean을 할 수 있습니다. MyObject가 필요한 객체는 MyObjectWrapper.getImpl()을 호출 할 수 있으며 싱글 톤 객체를 가져옵니다.

동일한 의견을 보내 주시면 감사하겠습니다.

답변

6

정적 getInstance() 메서드에서 MyWrapperObject의 새 인스턴스를 인스턴스화하기 때문에이 방법은 작동하지 않습니다. 콩을 인스턴스화하기 때문에 bean은 이 아니고 스프링이 관리하므로 ApplicationContextAware 메소드 setApplicationContext(...)은 스프링에 의해 호출되지 않습니다.

나는이 코드의 팬이 아니지만, 이와 같은 작업을 원할 경우 제안 사항이 있습니다. ApplicationContext을 인스턴스 구성원에 저장하는 대신 정적 구성원에 저장하십시오. 그런 다음 고정 getInstance() 메소드에서 MyWrapperObject이라는 새 인스턴스를 만들지 말고 이라는 인스턴스를 사용하여 MyObject 인스턴스를 만들어야합니다. 이 클래스가 실제로 스프링 싱글 톤인 경우 걱정할 것이 없습니다. 이 같은

뭔가 :

또한
public class MyObjectWrapper implements ApplicationContextAware { 
    private static MyObject myObject; 
    private static ApplicationContext ctxt; 
    private MyObjectWrapper() {} 

    public static synchronized MyObject getImpl() { 
     if (myObject!=null) 
      return myObject; 

     this.myObject = ctxt.getBean("myobject", MyObject.class); 
     return myObject; 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext arg0) throws BeansException { 
     ctxt = arg0; 
    } 
} 

이, 개체 public를하지 않습니다. 그것은 이유를위한 싱글 톤입니다. getInstance()을 호출하는 모든 사람들이 객체의 동일한 인스턴스를 가져 오기를 원할 것입니다. public으로 설정하면 누구나 보유 할 수 있고 원하면 재 할당 할 수 있습니다. 다소 목적을 상실합니다 ...