문제

내가 이해하는 혜택의 종속성을 주입에 자체입니다.자 봄을 위해 인스턴스입니다.또한 혜택을 이해한 다른 봄 featureslike AOP,조력자의 서로 다른 종류,등등.나는 단지 궁금의 이점은 무엇 XML 과 같은 구성:

<bean id="Mary" class="foo.bar.Female">
  <property name="age" value="23"/>
</bean>
<bean id="John" class="foo.bar.Male">
  <property name="girlfriend" ref="Mary"/>
</bean>

에 비해 일반전 java 과 같은 코드:

Female mary = new Female();
mary.setAge(23);
Male john = new Male();
john.setGirlfriend(mary);

는 쉽게 디버깅,컴파일한 시간에 확인하고 이해할 수 있는 사람만 알고 있 java.그래서 무엇을 주요 목적의 종속성을 주입 framework?(또는 조각의 코드를 표시하는 그 혜택이 있습니다.)


업데이트:
의 경우에는

IService myService;// ...
public void doSomething() {  
  myService.fetchData();
}

할 수 있는 방법 IoC framework 추측의 구현 myService 내가 원하는 것을 주입하는 경우 이상이 있나요?이 하나만 있으면 구현의 주어진 인터페이스,나는 IoC 컨테이너가 자동으로 결정을 사용하여,그것은 깨진 것은 후 두 번째 구현이 나타납니다.고 있는 경우에도 하나의 가능한 인터페이스 구현한 다음 필요하지 않습에 주입니다.

그것은 정말 흥미로운 일이 될 것을 볼 수의 작은 조각 구성 IoC 보여줍니다 그것은 혜택입니다.사용했었는데 봄에 대한을 제공할 수 없습니다 예입니다.고 난 보여줄 수 있는 단일 선명하는 혜택의 최대 절전 모드 dwr 및 기타 프레임워크는 내가 사용합니다.


UPDATE2:
나는 깨닫는 IoC 구성 없이 변경 될 수 있습니다 다시 컴파일해야 합니다.그것은 정말 좋은 생각입니까?내가 이해할 수 있을 때 누군가를 원하는 변경 DB 자격 증명이 다시 컴파일하지 않고-그가 될 수 있지 않다.에서의 연습,얼마나 자주 다른 사람 이외의 다른 개발자가 변경 IoC 구성입니까?내가 생각하는 개발자를 위한 아무 노력을 다시 컴파일하는 특정 클래스를 변경하는 대신 구성이 있습니다.고에 대한 비자 당신은 아마 자신의 인생을 더 쉽게를 제공 몇 가지 간단한 구성 파일입니다.


UPDATE3:

외부 구성의 매핑 사이의 인터페이스와 그들의 구체적인 구현

기 때문에 그것을 만드는 extenal?당신이하지 않는 모든 코드를 외장하는 동안,당신은 확실히 수 있습니다-그냥에 배치 ClassName.java.txt 파일에 읽기 및 컴파일에서 수동으로 날아-와우,당신은 피해 다시 컴파일해야 합니다.왜 컴파일하는 데 도움이 설계되었습니다.!

저장 코딩 시간을 제공하므로 매핑을 선언적지에서 절차 코드

나는 때로는 선언적인 접근 시간을 절약할 수 있습니다.예를 들어,나는 선언을 한 번만 사이의 매핑 콩 시설 및 DB 열전한 사용이 매핑을 로드하는 동안,저장,SQL 을 기반으로 활성 데이터베이스를 저장,등등.이것은 선언적인 접근 방식을 작동합니다.의 경우에는 봄(에서 나를 들어),선언했다 더 많은 라인과 동일한 표현으로는 해당 코드입니다.이 있는 경우 예를 들어 이 같은 선언이보다 짧은 코드고 싶어 그것을 참조하십시오.

반전의 제어 원리를 통해 쉽게 단위 테스트할 수 있기 때문에 교체 실제 구현에 가짜를 가진 사람(과 같은 대체 SQL 데이터베이스에 메모리 중 하나)

내가 이 반전을 통제 혜택(내가 선호하는 전화를 설명하는 디자인 패턴으로 여기는 종속기 때문에 주입,IoC 더 일반 많은 종류의 제어,그리고 우리는 반전의 단 하나 그들의 제어 초기화).나는 이유를 묻는 사람이 이제까지 요구가 아닌 다른 프로그래밍 언어입니다.나는 확실히 교체할 수 있는 실제 구현에서는 가을 사용하는 코드입니다.이 코드를 표현하는 것과 같은 일이 구성-그것은 단지 초기화 필드와 가짜 값입니다.

mary = new FakeFemale();

나는 혜택을 이해한다.내가 이해하지 못하는 어떤 혜택을 추가하여 외부 XML 구성에 비해 구성하는 코드 같은 작업을 수행합니다.나는 생각하지 않는 컴파일을 피해야 합니다-나는 컴파일 매일이고 나는 아직 살아있다.생각의 구성을 디 나의 예언적 접근 방법이다.선언이 유용할 수 있는 경우에는 선언을 한 번 사용되는 많은 시간 다른 방법으로 같은 최대 절전 모드 cfg,는 간의 매핑 콩 시설 및 DB 열을 저장하기 위해 사용되는,로드 구축,검색어,등등.봄 디 구성 번역 될 수 있습니다 쉽게 구성하는 것처럼 코드의 시작 부분에서 이 문제 아닙니까?고 그것을 위해서만 사용 콩 초기화,그렇지 않나요?을 의미하는 선언적인 접근하지 않는 아무것도 추가 여기에,그것은?

때 나는 선언하는 최대 절전 모드 매핑은,나는 그냥 최대 절전 모드는 일부 정보,그리고 그 작품을 그것에 기초하여-내가 아무에게도 말하지 않는 그것이 무엇을 할 수 있습니다.의 경우에는 봄,나 선언을 말한 봄을 정확히 wht 를 왜 선언 그것이 왜 그냥니까?


마지막 업데이트:
들의 많은 대답은 말에 대해성 주입,내가 알고있는 좋습니다.질문에 대한 목적의 디 구성 대의 초기화 코드가 생각하는 경향이 초기화하는 코드는 짧은 명확하다.유일한 답이 나는 지금까지 나의 질문은 그것을 피하시 컴파일할 때,구성을 변경합니다.내가 해야하는 것 같아요 다른 질문하기 때문에,그것은 큰 비밀을 위해,나를 왜 컴파일에서 피해야한다.

도움이 되었습니까?

해결책

나 자신을 위해 주요 이유 중 하나를 사용하 IoC(들이 외부 구성)주위의 두 가지 영역:

  • 테스트
  • 생산 유지보수

테스트

면 분할의 시험으로 3 가지 시나리오(는 상당히 정상적인 큰 규모에서 개발):

  1. 단위 테스트
  2. 통합 테스트
  3. 블랙 박스 테스트

당신은 무엇을 하고 싶은 마지막 두 개의 테스트 시나리오(통합 및 검자),되지 않은 다시 컴파일 응용 프로그램의 일부.

어떤 경우에 당신의 테스트 시나리오에 당신을 필요로 변경 구성(ie:사용하는 다른 구성 요소를 모방하는 뱅킹을 통합,거나 성능이드),이는 쉽게 처리될 수 있습니다(이것은 아래의 이득을 구성하는 DI 의 IoC 하지만입니다.

또한 경우 응용 프로그램을 사용 중 하나에서 여러 사이트(다른 서버 및 구성 요소를 구성)거나 변경하는 구성에서 살고 환경 사용할 수 있습니다 후기 단계의 테스트를 확인하는 것입 취급 사항을 변경했습니다.

생산

개발자로서 당신은하지 않는(안)제의 생산 환경에서(특별한 경우 사용자 응용 프로그램을 배포하는 여러 고객 또는 별도의 사이트),이는 실제 사용의 이득을 모두 IoC 및 외부 구성으로,그것은 인프라/생산 지원을 조정하고 조정하는 실제 환경과하지 않고 다시려면 개발자와 테스트(높은 비용할 때 모든 그들은 하고 싶은 이동성).

요약

주요 혜택이 외부 구성의 IoC 와서 주는 다른 사람(비자)의 전원을 구성하는 응용 프로그램,내 경험에서 이용에 제한된 상황:

  • 응용 프로그램은 분산을 여러 사이트/클라이언트 환경은 다릅니다.
  • 제한되는 개발/제어 입력을 통해 생산 환경 및 설정할 수 있습니다.
  • 테스트 시나리오.

실제로 내가 찾는 경우에도 개발 뭔가를 할 수 있는 통제 환경에서 실행됩니다 시간이 지남에,그것은 더 나은 다른 누군가에게 기능을 구성을 변경하려면:

  • 을 개발할 때를 알지 못하면 그것을 변경됩니다(응용 프로그램입니다 그래서 유용한 판매하는 회사를 다른 사람).
  • 나는 원하지 않는 것으로 변화하는 코드를 때마다 약간의 변경을 요청할 수 있는 처리에 의해 설치하고 사용하는 구성 모델입니다.

참고:응용 프로그램을 말한 완벽한 솔루션이지 않는(실행파),그래서 모든 필요한 파일을 실행하는 응용 프로그램.

다른 팁

주입 의존성 코딩 스타일에 있는 그것의 뿌리에서 관찰하는 개체 위임은 보통 더 유용한 디자인 패턴보다 개체 상속(예:개체-관계보다 더 유용한 개체-관계).다른 하나는 성분은 그러나 필요한 DI 작업,그것의 생성 개체를 인터페이스가 있습니다.이 두 가지를 결합한 강력한 디자인 패턴을 소프트웨어 엔지니어에 신속하게 실현할 수 있는 유연성 느슨하게 결합된 코드고,따라서 개념의 종속성을 주입에 태어났습니다.그러나지 않을 때까지 반사체에서 사용할 수 있게 되었정은 높은 수준 언어로 디 정말 벗.반사 구성 요소는 핵심 오늘날 대부분의 디스 시스템 오늘날 때문에 정말 멋진 측면의 디는 능력을 요구한 프로그래밍 방식으로 객체를 선택하고 구성하고 그들에게 주입으로 다른 물체 시스템을 사용하여 외부 및 독립적인 개체다.

언어야 좋은 지원을 제공한 모두 정상적인 객체 지향 프로그래밍 기술을 뿐만 아니라 지원체에 대한 인터페이스 객체를 반성(예를 들어 Java,C#).당신이 할 수있는 동안 구축 프로그램을 사용하여 디 패턴 C++시스템의 부족을 반영 지원 언어 적절한 방에서 지원하는 응용 프로그램 서버와 다른 디 플랫폼고,따라서 제한 표현의 디 패턴이 있습니다.

의 장점을 구축된 시스템을 사용하여 디 패턴

  1. 디 코드는 많은 다시 사용하기 쉽으로'의'기능으로 추정으로 잘 정의된 인터페이스 할 수 있도록,별도의 개체의 구성에 의해 처리됩 적합한 애플리케이션 플랫폼을 연결해야하는 다른 물체에는 것입니다.
  2. 디 코드는 많은 쉽게 시험입니다.기능에 의해 표현된 객체에서 테스트 할 수 있습니다 검은 상자에 의해 건설'모의'객체를 구현하는 인터페이스에 의해 예상되는 응용 프로그램 논리입니다.
  3. 디 코드는 것이 더 유연합니다.그것은 본질적으로 느슨하게 결합된 코드--었습니다.이 프로그래머를 선택하는 방법 개체에 연결된 기준에 독점적으로 필요한 인터페이스에 한쪽 끝과 그들의 표현에서 인터페이스다.
  4. 외부(Xml)을 구성의 디체는 것을 의미 다른 사람이 할 수 있는 코드에서 예상치 못한 방향입니다.
  5. 외부 구성은 또한 분리를 우려의 패턴에 있는 모든 문제의 초기화 개체고체 상호 의존 관리 처리될 수 있는 응용 프로그램에 의해 서버입니다.
  6. 참고하는 외부 구성을 사용할 필요가 없습 DI 패턴,간단한 상호의 작은 빌더체가 충분할 때가 많습니다.할 수 있는 단점이 존재합니다 유연성에 있다.빌더체는 유연하는 옵션으로 외부에 표시되는 구성 파일입니다.개발의 디스 시스템의 무게를 이점의 유연성을 통해 편리함을 돌보는,그 작은 규모,미적으로 제어할 수 있는 기능을 통해 개체 건설을 표현으로 구성 파일에서 증가할 수 있습 혼란 및 유지보수 비용을 줄.

확실히 디 코드는 아무런 문제가 없는 것 같은 더 복잡한 단점을 갖는 모든 사람들의 XML 파일을 구성하는 개체를 주입하고 다른 객체로 나타나 어렵습니다.이것은,그러나,포인트의 DI 시스템입니다.귀하의 혼합 할 수있는 능력과 일치하는 코드 개의 시리즈로 구성 설정을 만들 수 있는 복잡한 시스템을 사용하여 제 3 자 코드를 최소한으로 코딩한 부분이다.

예제에서 제공하는 질문에 단순한 터치 표면에서의 표현력을 적절히 고려 DI 개체 라이브러리를 제공할 수 있습니다.으로 연습을 많이 자기의 규율이 가장 DI 실무자를 찾을 수 있는 시스템을 구축하는 100%테스트 범위를 응용 프로그램의 코드입니다.이 중 하나는 지점에 혼자는 특별하다.이것은 100%테스트 범위의 작은 응용 프로그램의 몇 백 줄의 코드,그러나 100%테스트 범위의 응용 프로그램을 포함하는 수백 수천의 라인의 코드입니다.나서 손실되는 설명할 수 있는 다른 디자인 패턴을 제공하는 이의 수준의 테스트 편의성도 높아집니다.

당신이 올바른지에서는 응용 프로그램의 단순한 10s 라인의 코드가 쉽게 이해하기보다는 여러 개체 plus 시리즈의 XML configuration files.그러나 대부분의 강력한 디자인 패턴 이익은 발견하기 위해 지속적으로 새로운 기능을 추가하는 시스템입니다.

에서 짧은,대규모 DI 기반 응용 프로그램은 모두 쉽게 디버깅하고 쉽게 이해할 수 있습니다.는 Xml 구성되지 않은'컴파일 시간인'모두 응용 프로그램 서비스를 이 저자의 인식이 제공한 개발자는 오류 메시지하려는 경우를 삽입하는 개체는 호환되지 않는 인터페이스로 다른 객체입니다.와 가 제공하는'확인'기능을 모두 포함하는 알려진 물체를 구성이 있습니다.이 쉽고 빠르게 수행하여 확인하는 것을 주입된 개체는 인터페이스를 구현에 필요한 개체 B 을 위해 모든 구성된 객체입니다.

이것은 약간의로드 된 질문이지만, 나는 엄청난 양의 XML 구성이 실제로 큰 이점을 얻지 못한다는 데 동의하는 경향이 있습니다. 나는 내 응용 프로그램이 무거운 프레임 워크를 포함하여 가능한 한 종속성에 빛을 발하는 것을 좋아합니다.

그들은 코드를 여러 번 단순화하지만 복잡성에 대한 오버 헤드가있어 문제를 추적하는 문제를 다소 어렵게 만듭니다 (나는 그러한 문제를 직접 보았고, 직선 Java는 훨씬 더 편안하게 다루었을 것입니다).

나는 그것이 스타일에 달려 있고 당신이 편한 것에 달려 있다고 생각합니다 ... 당신은 당신의 자신의 솔루션을 비행하고 내부를 아는 것이 혜택을 받고 싶습니까? 맞아요? 모두 트레이드 오프입니다.

그러나 XML 구성은 약간의 애완 동물을 낳습니다 ... 나는 모든 비용으로 그것을 피하려고 노력합니다.

코드를 데이터로 변경할 수 있습니다. 올바른 방향으로 단계를 밟고 있습니다.

데이터로 코딩하는 것은 코드 자체가 더 일반적이며 재사용 가능하다는 것을 의미합니다. 또한 데이터가 정확히 맞는 언어로 지정 될 수 있음을 의미합니다.

또한 XML 파일을 GUI 또는 다른 도구로 읽을 수 있으며 실용적으로 쉽게 조작 할 수 있습니다. 코드 예제로 어떻게 하시겠습니까?

나는 대부분의 사람들이 코드로 구현할 것들을 끊임없이 고려하고 있습니다. 그것은 어떤 코드가 훨씬 더 깨끗하게 만들어졌습니다. 사람들이 데이터가 아닌 코드로 메뉴를 생성한다는 것은 상상할 수 없다는 것을 알았습니다. 코드로 수행하는 것은 보일러 플레이트 때문에 명백한 잘못이라는 것이 분명해야합니다.

DI 컨테이너를 사용하는 이유는 단순히 코드와 세터 인 코드에 미리 구성된 10 억 개의 속성이 필요하지 않기 때문입니다. 새로운 x ()를 가진 모든 사람들을 하드 코드하고 싶습니까? 물론, 당신은 기본값을 가질 수 있지만, DI 컨테이너는 싱글 톤을 생성 할 수 있으며, 이는 매우 쉽고 코드의 세부 사항에 초점을 맞출 수있는 기타 작업이 아니라 코드의 세부 사항에 집중할 수 있습니다.

예를 들어, Spring을 사용하면 초기화 비면 인터페이스를 구현하고 AfterProperTiesset 메소드를 추가 할 수 있습니다 (코드를 스프링에 커플 링하지 않도록 "init-method"를 지정할 수도 있습니다). 이 메소드는 클래스 인스턴스의 필드로 지정된 인터페이스가 시작시 올바르게 구성되도록 할 수있게되며, 더 이상 게터와 세터를 확인할 필요가 없습니다 (싱글 톤이 스레드-안전을 유지할 수 있다고 가정합니다. ).

또한 DI 컨테이너를 직접 수행하는 대신 복잡한 초기화를 수행하는 것이 훨씬 쉽습니다. 예를 들어, Xfire (Celtixfire가 아닌 Java 1.4 만 사용)를 사용하는 데 도움이됩니다. 이 앱은 Spring을 사용했지만 불행히도 Xfire의 Services.xml 구성 메커니즘을 사용했습니다. 하나 이상의 인스턴스 대신 인스턴스가 0 이상이라고 선언 해야하는 요소 모음이 필요했을 때이 특정 서비스에 제공된 XFIRE 코드 중 일부를 무시해야했습니다.

스프링 빈 스키마에는 정의 된 특정 XFIRE 기본값이 있습니다. 따라서 스프링을 사용하여 서비스를 구성하는 경우 콩을 사용할 수있었습니다. 대신, 일어난 일은 Beans를 사용하는 대신 Services.xml 파일에 특정 클래스의 인스턴스를 제공해야했습니다. 이를 위해서는 생성자를 제공하고 XFIRE 구성에서 선언 된 참조를 설정해야했습니다. 내가해야 할 실제 변화는 단일 클래스를 과부하해야했습니다.

그러나 Services.xml 파일 덕분에 4 개의 새로운 클래스를 만들어 생성자의 스프링 구성 파일에서 기본값에 따라 기본값을 설정해야했습니다. 스프링 구성을 사용할 수 있었다면 방금 언급 할 수있었습니다.

<bean id="base" parent="RootXFireBean">
    <property name="secondProperty" ref="secondBean" />
</bean>

<bean id="secondBean" parent="secondaryXFireBean">
    <property name="firstProperty" ref="thirdBean" />
</bean>

<bean id="thirdBean" parent="thirdXFireBean">
    <property name="secondProperty" ref="myNewBean" />
</bean>

<bean id="myNewBean" class="WowItsActuallyTheCodeThatChanged" />

대신, 그것은 이것처럼 보였습니다.

public class TheFirstPointlessClass extends SomeXFireClass {
    public TheFirstPointlessClass() {
        setFirstProperty(new TheSecondPointlessClass());
        setSecondProperty(new TheThingThatWasHereBefore());
    }
}

public class TheSecondPointlessClass extends YetAnotherXFireClass {
    public TheSecondPointlessClass() {
        setFirstProperty(TheThirdPointlessClass());
    }
}

public class TheThirdPointlessClass extends GeeAnotherXFireClass {
    public TheThirdPointlessClass() {
        setFirstProperty(new AnotherThingThatWasHereBefore());
        setSecondProperty(new WowItsActuallyTheCodeThatChanged());
    }
}

public class WowItsActuallyTheCodeThatChanged extends TheXFireClassIActuallyCareAbout {
    public WowItsActuallyTheCodeThatChanged() {
    }

    public overrideTheMethod(Object[] arguments) {
        //Do overridden stuff
    }
}

따라서 순 결과는 하나의 추가 클래스와 일부 간단한 종속성 컨테이너 정보가 달성 된 영향을 달성하기 위해 코드베이스에 4 개의 추가 및 무의미한 Java 클래스를 추가해야했습니다. 이것은 "규칙을 증명하는 예외"가 아닙니다. 이것은 규칙입니다 ... 코드의 기발한 처리는 속성이 이미 DI 컨테이너에 제공 될 때 훨씬 더 깨끗합니다. 단순히 특별한 상황에 맞게 변경하는 것입니다. 그것은 더 자주 발생하지 않습니다.

나는 당신의 대답이 있습니다

각 접근 방식에는 분명히 트레이드 오프가 있지만 외부화 된 XML 구성 파일은 빌드 시스템이 IDE가 아닌 코드를 컴파일하는 데 사용되는 엔터프라이즈 개발에 유용합니다. 빌드 시스템을 사용하면 코드에 특정 값을 주입 할 수 있습니다 (예 : 빌드 버전) (컴파일 할 때마다 수동으로 업데이트해야 할 수도 있음). 빌드 시스템이 일부 버전 제어 시스템에서 코드를 가져 오면 통증이 더 큽니다. 컴파일 시간에 간단한 값을 수정하려면 파일을 변경하고 커밋하고 컴파일 한 다음 각 변경에 대해 매번 되돌아 가야합니다. 버전 제어에 커밋하려는 변경 사항이 아닙니다.

빌드 시스템 및 외부 구성에 관한 기타 유용한 사용 사례 :

  • 다른 빌드에 대한 단일 코드베이스의 스타일/스타일 주입
  • 단일 코드베이스에 대한 다양한 동적 컨텐츠 세트 (또는 참조) 주입
  • 다른 빌드/클라이언트에 대한 현지화 컨텍스트 주입
  • Webservice URI를 백업 서버로 변경합니다 (기본이 다운 될 때)

업데이트 : 위의 모든 예는 반드시 수업에 대한 종속성이 필요하지 않은 것들에 관한 것입니다. 그러나 복잡한 객체와 자동화가 필요한 경우를 쉽게 구축 할 수 있습니다.

  • 웹 사이트의 트래픽을 모니터링 한 시스템이 있다고 상상해보십시오. 동시 사용자의 #에 따라 로깅 메커니즘을 켜거나 끄는 경우가 있습니다. 아마도 메커니즘이 꺼져있는 동안 스터브 객체가 그 자리에 놓여 있습니다.
  • 사용자의 #에 따라 참가자의 #에 따라 P2P를 수행하는 기능을 전환하려는 웹 회의 시스템이 있다고 상상해보십시오.

구성에서 무언가를 변경할 때마다 코드를 다시 컴파일 할 필요가 없습니다. 프로그램 배포 및 유지 보수를 단순화합니다. 예를 들어, 구성 파일에서 단 1 변경으로 하나의 구성 요소를 다른 구성 요소로 교체 할 수 있습니다.

여자 친구를위한 새로운 구현을 슬롯 할 수 있습니다. 따라서 코드를 다시 컴파일하지 않고 새로운 여성을 주입 할 수 있습니다.

<bean id="jane" class="foo.bar.HotFemale">
  <property name="age" value="19"/>
</bean>
<bean id="mary" class="foo.bar.Female">
  <property name="age" value="23"/>
</bean>
<bean id="john" class="foo.bar.Male">
  <property name="girlfriend" ref="jane"/>
</bean>

(위는 여성과 Hotfemale이 동일한 Girlfriend Interface를 구현한다고 가정합니다).

.NET 세계에서 대부분의 IOC 프레임 워크는 XML 및 코드 구성을 모두 제공합니다.

예를 들어, SprstucureMap 및 Nineject는 유창한 인터페이스를 사용하여 컨테이너를 구성합니다. 더 이상 XML 구성 파일을 사용하는 것이 제한되지 않습니다. .NET에도 존재하는 Spring은 그의 역사적 기본 구성 인터페이스이기 때문에 XML 파일에 크게 의존하지만 컨테이너를 프로그래밍 방식으로 구성 할 수 있습니다.

편이성 부분 구성 결합 최종 완전한 구성으로.

예를 들어, 웹 응용 프로그램에서 모델,보기 및 컨트롤러는 일반적으로 별도의 구성 파일로 지정됩니다. 선언적 접근 방식을 사용하면 예를 들어로드 할 수 있습니다.

  UI-context.xml
  Model-context.xml
  Controller-context.xml

또는 다른 UI 및 몇 가지 추가 컨트롤러로로드 :

  AlternateUI-context.xml
  Model-context.xml
  Controller-context.xml
  ControllerAdditions-context.xml

코드에서 동일한 작업을 수행하려면 부분 구성을 결합하기위한 인프라가 필요합니다. 코드에서는 불가능하지는 않지만 IOC 프레임 워크를 사용하는 것이 더 쉽습니다.

종종 중요한 요점은입니다 누구 프로그램이 작성된 후 구성을 변경하고 있습니다. 코드의 구성을 사용하면 사람을 변경하는 사람은 원래 저자와 동일한 기술과 소스 코드 등에 대한 액세스 권한을 가지고 있다고 가정합니다.

프로덕션 시스템에서는 XML 파일로 설정의 일부 하위 집합 (예 : Age Age)을 추출하고 EG 시스템 관리자 또는 개인을 지원하는 것이 소스 코드 또는 기타 설정 또는 기타 설정을 제공하지 않고 값을 변경하도록 허용하는 것이 매우 실용적입니다. 그것들을 복잡성으로부터 분리합니다.

봄 혐의로 두 가지 답변을 줄 수 있습니다.

먼저 XML 구성이 구성을 정의하는 유일한 방법은 아닙니다. 대부분의 물건은 주석을 사용하여 구성 할 수 있으며 XML로 수행 해야하는 작업은 라이브러리에서 사용하는 연결 풀과 같이 어쨌든 쓰지 않는 코드 구성입니다. Spring 3에는 예제에서 핸드 롤링 DI 구성과 유사한 Java를 사용하여 DI 구성을 정의하는 방법이 포함되어 있습니다. 따라서 Spring을 사용한다고해서 XML 기반 구성 파일을 사용해야한다는 의미는 아닙니다.

둘째, Spring은 단순한 DI 프레임 워크 이상의 것입니다. 트랜잭션 관리 및 AOP를 포함한 다른 많은 기능이 있습니다. 스프링 XML 구성은 이러한 모든 개념을 함께 혼합합니다. 종종 동일한 구성 파일에서는 Bean 종속성, 트랜잭션 설정 및 백그라운드에서 AOP를 사용하여 실제로 처리하는 세션 스코어 콩 추가를 지정합니다. XML 구성이 이러한 모든 기능을 관리 할 수있는 더 나은 장소를 제공합니다. 또한 주석 기반 구성 및 XML 구성이 Java 기반 구성보다 더 잘 확대된다고 생각합니다.

그러나 나는 당신의 요점을보고 Java의 종속성 주입 구성을 정의하는 데 아무런 문제가 없습니다. 나는 보통 단위 테스트에서 직접 수행하고 DI 프레임 워크를 추가하지 않을 정도로 작은 프로젝트를 진행할 때. 나는 일반적으로 Java의 구성을 지정하지 않습니다. 왜냐하면 그것은 나에게 봄을 사용하기로 선택했을 때 글을 쓰지 않으려는 친절한 배관 코드이기 때문입니다. 그러나 선호도는 XML 구성이 Java 기반 구성보다 우수하다는 것을 의미하지는 않습니다.

Spring에는 또한 속성 로더가 있습니다. 우리는이 방법을 사용하여 환경에 의존하는 변수 (예 : 개발, 테스트, 수용, 생산 ...)를 설정합니다. 이것은 예를 들어 듣는 대기열 일 수 있습니다.

속성이 변경 될 이유가 없다면 이런 식으로 구성 할 이유도 없습니다.

귀하의 경우는 매우 간단하고 따라서 필요로 하지 않는 IoC(Inversion of Control)컨테이너 같은 봄입니다.다른 한편으로 할 때,당신은"프로그램이 아니라 인터페이스 구현"(는 좋은 연습에 OOP),할 수 있습니다:

IService myService;
// ...
public void doSomething() {
  myService.fetchData();
}

(주는 유형의 myService 은 IService--인터페이스,지 않은 콘크리트 구현하).이제 그것이 편리할 수 있도록 당신의 IoC container 자동으로 제공하는 올바른 콘크리트의 인스턴스 IService 초기화 하는 동안-가 많은 경우 인터페이스 구현,그것은 복잡할 수 있습을 할 수 있습니다.주요 혜택의 IoC 컨테이너(성 주입 프레임워크)습니다:

  • 외부 구성의 매핑 사이의 인터페이스와 그들의 구체적인 구현
  • IoC 컨테이너 손잡이 일 까다로운 문제를 해결 같은 복잡한 의존성 그래프,관리,구성요소의 평생 등입니다.
  • 저장 코딩 시간을 제공하므로 매핑을 선언적지에서 절차 코드
  • 반전의 제어 원리를 통해 쉽게 단위 테스트할 수 있기 때문에 교체 실제 구현에 가짜를 가진 사람(과 같은 대체 SQL 데이터베이스에 메모리 중 하나)

XML 구성 파일을 초기화하면 컴퓨터에 앱을 배포 한 클라이언트와 디버깅 / 적응 작업을 단순화합니다. (재 컴파일 + 이진 파일 교체가 필요하지 않기 때문에)

가장 매력적인 이유 중 하나는 ""입니다.할리우드 원리": 우리에게 전화하지 마십시오. 구성 요소 내부에서 JNDI 조회를 수행하십시오.

또한 구성 요소를 분리하여 단위 테스트하는 것이 훨씬 쉽습니다. 필요한 구성 요소의 실제 구현을 제공하는 대신 간단히 자동 생성 된 모의를 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top