2010-08-18 2 views
4

나는 오브젝트를 의존성 생성과 결합하지 않고 Java 오브젝트에서 의존성을 획득하는 적어도 세 가지 방법을 보았다.종속성을 획득하는 방법을 선택하는 방법은 무엇입니까?

의존성 주입 - 일부 프레임 워크는 외부 구성 예에 따라 다른 개체에 필요한 객체를 주입 : 봄 관리 빈

종속성 조회 - 클래스가 어떤 종류의 필요한 의존성을 찾습니다 디렉토리 서비스의 예 : Java EE 컨테이너의 JNDI 조회

정적 팩터 - 전역 범위의 객체가 인스턴스를 제공합니다. 표준 Java SE API는 다음과 같이 흩어져있는 것처럼 보입니다. 예 : java.util.Logger.getLogger(name), java.util.Calendar.getInstance()

상황에 가장 적합한 지침은 무엇입니까?

+3

종속성 주입은 프레임 워크와 외부 구성을 필요로하지 않으므로 원하는 인스턴스를 작성하고 필요한 곳에 주입하는 루틴을 작성할 수 있습니다. 물론, 무엇인가를 변경해야한다면 재 컴파일해야합니다 (프레임 워크와 외부 설정이 들어있는 곳). –

+0

관련 질문과 답변을 위해 SO를 검색하는 것이 좋습니다. 이것은 잘 착용 된 영역입니다. 예를 들어, [Dependency Injection & Singleton Design Pattern] (http : // stackoverflow.com/questions/2662842/dependency-injection-singleton-design-pattern) 또는 [ploeh blog] (http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx)를 방문하십시오. –

+0

@Jeff Sternal 질문 링크를 보내 주셔서 감사합니다. – Brabster

답변

6

개체가 필요한 참조를 얻는 방법을 알 필요가 없으므로 종속성 주입을 선호합니다.

종속성 조회는 여전히 개체가 조회 서비스 및 해당 URL을 알 필요가 있습니다.

정적 팩터 리는 조회 서비스와 유사합니다.

+0

저를 괴롭히는 뭔가가 있습니다. 이것은 멍청한 예일 수도 있지만, 우리가 log4j와 같은 것을 사용한다면, 잠재적으로 모든 클래스에 다른 Logger 인스턴스를 주입하는 것이 매력적입니까/실현 가능합니까? 이 유스 케이스에 대해 다른 점이 없다면 정적 팩토리보다 더 나은 접근법이 있을까요? – Brabster

+0

'log4j'의 경우 실제로 이점이 없습니다 - 클래스에서 사용되는 로거/이름을 변경할 필요가 거의 없습니다. 오히려'log4j'는 네가 원하는 것을 기반으로 다른 일들을 수행하도록 네임드 로거를 설정하는 방식으로 설계되었다. 즉, com.something.MyClass 로거의 출력을 파일이나 데이터베이스로 보내기보다는 com.something.MyClass'에 파일 또는 데이터베이스 로거의 인스턴스를 제공하십시오. –

+0

확실히 가능합니다. 그래서 slf4j와 같은 프레임 워크가 나타났습니다. 여러 로깅 프레임 워크 용 어댑터인데 컨테이너, 스프링 등과 잘 통합 될 수 있습니다. –

2

나는 의존성 주입을 선호한다. 나는 스프링 프레임 워크와 DI에 대해 말할 때

나는

  1. 그것은 십오 (에러 체크, 시각화)에 의해 지원되는 것 다음을 참조하십시오. 당신은 속성 AOP와 같은 설정 다른 필요한 물건을로드 할 수
  2. , ...
  3. 당신은 큰 구성 가능성이 - 데스크톱 응용 프로그램에서도 사용 할 수있는 XML, 주석, JavaConfig
  4. 합니다.

이러한 모든 균형은 다른 라이브러리에 대한 의존성과 같습니다. 다른 접근법을 사용해야하는 이유는 무엇입니까?

1

이것은 실제로 컨텍스트에 따라 다릅니다. 자체 포함 된 Maths API를 작성하는 경우 정적 팩토리를 사용하는 것이 좋습니다. 코드가 덜 복잡하고 설치가 필요 없으며 더 효율적일 수 있기 때문입니다. 원격 종속성에 액세스하거나 제공해야하는 경우 JNDI/LDAP 조회 또는 ESB 메시징이 제대로 작동합니다. 일반적인 엔터프라이즈 서버 코드에 서비스/DAO/데이터 소스를 주입하려면 일반적인 D.I. Google Guice 또는 Spring과 같은 프레임 워크.

소프트웨어 디자인에서 '최상의'솔루션이 하나도 없습니다. 그것은 항상 절충점입니다.

관련 문제