2014-12-22 2 views
0

스프링 의존성 주입 및 자동 배선의 기본 사항을 이해하려고합니다. 모든 교과서는 종속성 삽입의 주된 이점은 XML 코드를 수정하여 Java 코드를 건드리지 않고 애플리케이션을 수정할 수 있다는 것입니다.스프링 - 주석이있는 의존성 주입이 필요합니다.

하지만 특수 효과를 사용하면이 목적이 무효화됩니다. 그렇다면 빅딜은 무엇입니까? 왜 그냥 주입을위한 추가 코드를 갖는 것보다 그것을 인스턴스화하지 않습니까?

+0

종속성 삽입의 주된 장점은 자바 코드를 건드리지 않고 응용 프로그램을 수정할 수 있다는 것입니다. –

+0

여기에 많은 경험이 없지만 XML 구성이 XML 지옥을 생성한다는 것이 전부입니다. XML 구성 아이디어는 실제로 사람들이 바라는대로 잘 작동하지 않습니다. 따라서 많은 아키텍처가 코드를 사용하기 시작했습니다. 더 쉽기 때문입니다. – markspace

답변

1

이전 버전의 Spring에서는 모든 주입이 XML을 사용하여 수행되어야했습니다. 대규모 프로젝트의 경우 XML 자체가 매우 커지고 유지 관리가 까다로워졌습니다. 코드의 종속성을 변경하려면 XML의 해당 변경 사항이 필요했습니다. XML의 크기를 줄이기 위해 자동 배선이 추가되었습니다.

그러나 자동 배선은 XML을 사용하여 종속성 삽입을 무시할 수 있으므로 종속성 삽입을 저하시키지 않습니다. 이것은 XML 설정의 원래 유연성을 제공합니다. Spring이 인터페이스를 구현하는 컨텍스트 내에 오직 하나의 가능한 bean 만있는 일반적인 경우를 Spring에게 디폴트로 허용하는 편리함을 제공합니다.

왜 우리는 의존성 주입을 원한다고 묻고있는 것 같습니다. "주입을위한 추가 코드를 갖는 것보다 인스턴스화하지 않는 이유는 무엇입니까?". 종속성 삽입의 가장 일반적인 용도 중 하나는 단위 테스트입니다. 테스트 프로그램은 종속성의 테스트 버전을 테스트중인 개체에 삽입하여 추가 종속성을 손상시킵니다. 예를 들어 서비스 클래스 A가 서비스 클래스 B를 호출하고 B가 DB 객체, 다른 서비스, 파일 시스템 등에 의존하는 경우 A가 B를 직접 인스턴스화하는 경우 A 테스트는 매우 어려워집니다. B의 종속성이 충족됩니다. 클래스 B가 아닌 인터페이스 iB에 A가 코딩 된 경우 유닛 테스트 코드는 iB를 구현하는 테스트 클래스의 인스턴스를 삽입 할 수 있으며 더 이상의 종속성없이 메소드 호출에 응답합니다.

+0

나는 의존성 주입의 필요성과 가치를 잘 알고 있습니다. 그러나 @AutoWire를 사용한 주입과 인터페이스를 사용하여 인스턴스화하는 잘 디자인 된 코드 사이에는 어떤 차이점도 없습니다. – vikas

+1

@vikas - autowire를 사용하면 Spring은 종속성을 인스턴스화합니다. 그것들을 인스턴스화하는 코드를 작성한다면, 당신은 의존성을 만족시키는 것에 관심을 가져야 만한다. 이러한 종속성이 복잡 해지면 리소스가 공유되도록 팩토리, 싱글 톤 등을 코딩해야합니다. 가능합니다.하지만 Spring은 모든 코드를 제거합니다. 복잡한 상황을 처리하기 위해 간단한 주석 또는 간단한 XML 만 있으면됩니다. 또한 이러한 종속성이 외부에 있다고 생각하게 만듭니다. – jalynn2

+0

의심의 여지를 보내 주셔서 감사합니다! – vikas

0

서비스 인스턴스 및 느슨한 결합을 제어 할 수있는 경우 요청 된 인터페이스를 구현하는 모든 클래스를 주석에 삽입 할 수 있습니다.

1

오랫동안 유지 보수 가능한 코드를 작성하려면 SOLID-principles을 준수해야한다고 생각하는 개발자가 많이 있습니다. 기본적으로 의존성 삽입 (Dependency Injection)을 의미 종속성 반전 원리에 대한 SOLID 스탠드에서

D. 따라서 의존성 주입은 코드를 깨끗하게 유지하고 실제 비즈니스 코드와 객체 생성을 분리하려는 경우에 좋은 방법입니다. 게다가, DI는 나에 따르면 당신의 코드를 더 테스트 가능하게 만든다.

당신은 @Autowired 같은 주석이 코드 에 방해 것을 잘하지만 당신은 단순히 방법을 주석, 논리 또는 아무것도을 변경할 필요가 없습니다.

종속성 삽입을 처리하는 또 다른 방법은 @Configuration@Bean 주석 (Spring docs 참조)을 통해 Java 구성을 사용하는 것입니다. 코드에 @Autowired을 추가하는 것이 정말로 염려되는 경우 Java Configuration은 덜 관입입니다.

SO-question은 DI가 왜 중요하고 좋은 지에 대한 좋은 개요를 제공합니다.그 게시물의 한 따옴표는 다음과 같습니다.

종속성 주입은 기본적으로 객체가 필요로하는 객체 (종속성)를 자체적으로 구성하는 대신 제공합니다. 의존성을 조롱하거나 스터브 아웃 (stubbed) 할 수 있으므로 테스트에 매우 유용한 기술입니다.

+0

감사합니다. Wassgren, 유익한 링크입니다. @Autowired를 인스턴스화하는 것의 이점은 코드에 몇 가지 규율을 적용한다는 것입니다. – vikas

관련 문제