2011-10-10 3 views
0

필자는 내가 현재 가지고있는 회사의 기존 코드를 살펴 보았습니다. applicationContext.xml 파일에는 Bean으로 선언되었지만 DAO 클래스 자체에서 선언 된 UserDAO 클래스가 있습니다. DAF 클래스 자체의 인스턴스를 반환하는 getFromApplicationContext (ApplicationContext ctx)가 선언되었습니다. 나는이 방법이 어디서 불려지는지, 누가 그것을 부르고 있는지 이해할 수 없다. DAO 클래스가 HibernateDaoSupport 클래스를 확장하고 있습니다 삭제하면 이클립스의 컴파일러가 불평하지 않기 때문에 클래스에이 메소드를 만들어야한다는 것을 어떻게 알 수 있습니까? 내가 말하고자하는 것은이 메소드를 작성하도록 강제 할 인터페이스 또는 추상 클래스가 있어야한다는 것이다.
ApplicationContext (Spring)에서 선언 된 DAO 클래스

public static UserDAO getFromApplicationContext(ApplicationContext ctx) { 
    return (UserDAO) ctx.getBean("userDAO"); 
} 

조금 설명 할 수있는 사람이 누구든지 바랍니다.

답변

1

일반적으로 응용 프로그램 컨텍스트에 대한 참조가 없어야합니다. 특히 사용자 DAO와 같이 사소한 것으로 특히 그렇습니다.

사용을 찾는 몇 가지 팁

: -> 참조 -> 프로젝트에

  • 사용은 마우스 오른쪽 버튼으로 클릭
  • 사용이라는 방법입니다 볼 수있는 "콜 계층"(CTRL + ALT + H를) 일식 클래스가 사용되는 곳을 확인하십시오

컴파일 문제가없고 xml 구성에 특별한 것이 없습니다 (예 : factory-method) - 삭제하십시오.

+0

(CTRL + ALT + H) org.springframework.beans.factory.BeanFactory의 getBean (String)이이 메소드를 호출한다는 사실을 알게되었습니다. 그러나 왜 여전히 신비한 일인가. GlobalDataAceess 클래스는 그것에 삽입 된 UserDAO 빈을 사용하기 때문에. GlobalDataAccess 클래스는 또한 applicationContext에서 빈으로 선언되며 우리는 GlobalDataAccess를 호출하여 DAO를 가져오고 여기에서 메소드를 호출합니다. Beanactory가이 비밀스러운 방법을 호출하여 역할을 수행하는 곳. – user984281

+0

DAO가 일부 인터페이스를 구현합니까? – Bozho

+0

저는 Spring의 getBean 메소드가 리플렉션을 사용하지 않고이 메소드를 호출하는 방법을 실제로 알지 못합니다. 나는 Spring이 UserDAO 클래스를 종속성으로 가지고 있는지 의심 스럽다. –

1

이 방법을 아무 데서도 사용하지 않으면 안전하게 삭제할 수 있습니다. 그것은 Spring에 의해 자동적으로 호출되는 어떤 메소드처럼 보이지 않습니다. 대신 응용 프로그램 컨텍스트에서 UserDAO 인스턴스를 가져 오는 유틸리티 메서드처럼 보입니다.

이 방법은 모든 곳에서 bean의 이름을 하드 코딩하지 않기 때문에 유용하지만 일반적으로 피해야한다. 왜냐하면 Spring의 전체 요점은 의존성 삽입을 사용하고 이와 같이 빈 조회를 피하기 때문이다. 시작시 응용 프로그램 컨텍스트를 사용하여 루트 객체를 한 번 가져올 수 있습니다. 그러나 다른 모든 콩을 주입해야합니다.