나는이 질문이 오래되었다는 것을 알고 있지만 5 센트를 추가하고 싶습니다.
의존성 주입 (DI)은 여러 가지 방법으로 구성 가능한 팩토리 패턴 (FP)과 같으며 DI와 관련하여 할 수있는 모든 것은 그러한 팩토리로 할 수 있다고 생각합니다.
실제로 스프링을 사용하는 경우 자동 배선 리소스 (DI) 또는 다음과 같은 작업을 수행하는 옵션이 있습니다.
MyBean mb = ctx.getBean("myBean");
그런 다음 'mb'인스턴스를 사용하여 무엇이든하십시오. 인스턴스를 반환하는 팩토리에 대한 호출이 아닙니까?
대부분의 FP 예제에서 유일하게 눈에 띄는 차이점은 XML 또는 다른 클래스에 "myBean"이 무엇인지 구성 할 수 있으며 프레임 워크는 팩토리로 작동하지만 그 외의 다른 것은 동일하다는 것입니다. 확실히 설정 파일을 읽거나 필요에 따라 구현을 가져 오는 팩토리를 가질 수 있습니다.
그리고 당신이 저의 의견을 물어 보면 (그리고 당신이하지 않았다는 것을 알고 있습니다), DI가 똑같은 일을하지만 개발에 더 복잡성을 더한다고 믿습니다. 왜 그렇습니까?
한 가지, DI로 autowire하는 모든 bean에 사용되는 구현을 알기 위해서는 구성 자체로 가야합니다.
그러나 ... 사용중인 객체의 구현을 알 필요가 없다는 약속은 어떻습니까? pfft! 진심으로? 이런 접근 방식을 사용할 때 ... 구현을 쓰는 것과 동일하지 않습니까? 그리고 당신이하지 않더라도 구현이 수행 해야하는 일을 수행하는 방법을 거의 항상 보지 않습니까?
그리고 마지막 한가지를 들어, 그것은 DI 프레임 워크의 약속이 얼마나 중요하지 않습니다 당신이 일 만들 것이다 당신을 분리 당신이 모든 것을 구축 프레임 워크를 사용하는 경우, 자신의 클래스에 종속되지 않는, 그것에서이 그것을 아루 당신이있는 경우 접근 방식이나 프레임 워크를 변경하는 것은 쉬운 일이 아닙니다 ... ...하지만 비즈니스에 가장 적합한 솔루션이 무엇인지 걱정하지 않고 특정 프레임 워크 주변의 모든 것을 구현하기 때문에 그렇게 할 때 문제가 발생할 수 있습니다.
사실, 내가 볼 수있는 FP 또는 DI 접근법의 유일한 실제 비즈니스 응용 프로그램은 런타임 에 사용되는 구현을 변경 해야하는 경우 이지만 적어도 내가 알고있는 프레임 워크는 허용하지 않으므로 떠나야합니다. 다른 접근 방식을 사용해야하는 경우 개발 시점의 구성에서 모든 것이 완벽합니다.
따라서 동일한 응용 프로그램에서 두 범위에서 다르게 수행되는 클래스가있는 경우 (예 : 지주 회사 2 개) 프레임 워크를 구성하여 두 개의 다른 Bean을 만들고 각 코드를 사용하도록 코드를 조정해야합니다. 내가 이런 식으로 쓰는 것과 같지 않습니까?
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
이것과 동일
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
이:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
어쨌든 클래스 또는 구성 파일이든 응용 프로그램에서 무언가를 변경해야하지만 재배치해야합니다.
이런 식으로하는 것이 좋지 않습니까?
MyBean mb = (MyBean)MyFactory.get("mb");
그런 식으로, 로깅 된 사용자 엔터프라이즈에 따라 런타임에 올바른 구현을 얻도록 팩토리 코드를 설정 ?? 이제 도움이 될 것입니다. 새 클래스로 새 jar을 추가하고 런타임에도 규칙을 설정할 수도 있습니다 (또는이 옵션을 열어 둔 경우 새 구성 파일 추가). 기존 클래스를 변경하지 않아도됩니다. 이것은 다이나믹 팩토리입니다!
각 엔터프라이즈에 대해 두 가지 구성을 작성하는 것보다 더 도움이되지 않을 수도 있고 각 응용 프로그램에 대해 두 개의 다른 응용 프로그램을 사용하는 것보다 도움이되지 않습니까?
런타임에 전환 할 필요가 없으므로 앱을 구성하고 클래스를 상속하거나 다른 구현을 사용하는 경우 구성을 변경하고 재배치하면됩니다. 공장에서도 가능합니다. 솔직히 말해서 몇 번이나이 일을합니까? 회사의 다른 곳에서 사용되는 앱이 있고 코드를 다른 팀에 전달할 때만 이와 같은 작업을 수행 할 수 있습니다. 그러나 공장에서도 할 수 있으며 역동적 인 공장에서는 더 좋을 것입니다 !!
어쨌든, 댓글 섹션을 열면 나를 죽일 수 있습니다.