Spring 프레임 워크를 배운 사람은 Spring의 두 가지 개념, 즉 IOC (Control Version)와 DI (종속성 주입)에 대해 들어야합니다. 봄을 처음 접하는 사람들에게는 항상 IOC와 DI의 개념이 모호하고 이해하기 어렵다고 생각합니다. 오늘은 온라인 기술 전문가의 Spring Framework IOC에 대한 이해를 공유하고 Spring IOC에 대한 나의 이해에 대해 이야기 할 것입니다.
IOC는 무엇입니까?
IOC 반전 제어, 즉 "제어 역전"은 기술이 아니라 디자인 아이디어입니다. Java 개발에서 IOC는 컨테이너로 제어하도록 설계된 객체를 전통적으로 객체 내부에서 직접 제어하는 대신 객체를 제공하는 것을 의미합니다.
스프링의 핵심 인 IOC는 전체 시간을 통과합니다. 스프링 프레임 워크의 경우 Spring은 물체의 수명주기와 물체 간의 관계를 제어 할 책임이 있습니다. 이것이 무엇을 의미합니까? 간단한 예를 들어 여자 친구를 어떻게 찾을 수 있습니까? 일반적인 상황은 우리가 아름답고 잘 보이는 여성이있는 곳을 찾기 위해 어디서나 가고, 그들의 관심사, QQ 번호, 전화 번호, IP 번호, IQ 번호에 대해 문의하고, 알 수있는 방법을 찾고, 그들이 좋아하는 것을주고,이 과정은 복잡하고 심오하며, 우리 자신을 디자인하고 직면해야한다는 것입니다. 전통적인 프로그램 개발도 마찬가지입니다. 객체에서 다른 객체를 사용하려면 객체를 가져와야합니다 (새로운 개체를 혼자서 또는 JNDI에서 쿼리). 사용 후 객체를 파괴해야하며 (예 : 연결 등) 물체는 항상 다른 인터페이스 또는 클래스와 결합됩니다.
IOC를 이해하는 방법? IOC를 이해하기위한 열쇠는 "누가, 어떤 통제를 통제하는지, 왜 반전이되어야하는지 (긍정적 인 것이 있어야한다), 반전의 어떤 측면이 있는지를 명확히하는 것입니다."
● 누구와 무엇을 제어 하는가 : 전통적인 Javase 프로그래밍 디자인, 우리는 객체 내에서 새로운 객체를 직접 생성하고 프로그램은 종속 객체를 적극적으로 만듭니다. IOC에는 이러한 객체를 만들기위한 특수 컨테이너가 있지만, 즉 IOC 컨테이너는 객체 생성을 제어합니다. 누가 누구를 통제합니까? 물론, IOC 컨테이너는 물체를 제어합니다. 무엇을 제어해야합니까? 즉, 주로 외부 리소스의 획득 (파일을 포함한 객체뿐만 아니라)을 제어합니다.
● 왜 반전입니까? 반전은 무엇입니까? 긍정적 인 회전이 있습니다. 전통적인 응용 분야는 종속 물체, 즉 양의 회전을 직접 얻기 위해 대상에서 적극적으로 제어됩니다. 반전은 종속 물체를 생성하고 주입하는 데 도움이되는 컨테이너입니다. 반전 인 이유는 무엇입니까? 컨테이너는 종속 객체를 찾고 주입하는 데 도움이되므로 객체는 수동적으로 종속 객체를 받아 들일 수 있으므로 반전입니다. 반전은 어떤 측면입니까? 종속 객체의 획득이 반전됩니다.
범례를 사용하여 전통적인 프로그래밍이 그림 1-1에 표시되어 있으며 관련 객체를 적극적으로 생성 한 다음 다음을 결합합니다.
그림 1-1 전통적인 응용 프로그램의 회로도
IOC/DI 컨테이너가있는 경우,이 객체는 그림 1-2와 같이 클라이언트 클래스에서 더 이상 적극적으로 생성되지 않습니다.
그림 1-2 IOC/DI 컨테이너가 IOC/DI 컨테이너가있는 후 프로그램 구조의 개략도
1.1.2 IOC는 무엇을 할 수 있습니까?
IOC는 기술이 아니며, 단지 생각, 객체 지향 프로그래밍의 중요한 규칙으로, 느슨하게 결합 된 더 나은 프로그램을 설계하는 방법을 안내 할 수 있습니다. 전통적인 응용 프로그램은 모두 수업 내에서 우리에 의해 적극적으로 만들어지며, 이는 클래스 사이의 높은 커플 링과 테스트가 어려워집니다. IOC 컨테이너를 사용하면 종속 객체를 생성 및 찾기위한 제어가 컨테이너에 넘겨지고 컨테이너는 결합 된 물체를 주입하므로 객체가 느슨하게 결합되어 테스트에 편리하고 기능적 재사용을 촉진하며 더 중요한 것은 프로그램의 전체 아키텍처를 매우 유연하게 만듭니다.
실제로, IOC가 프로그래밍에 가져온 가장 큰 변화는 코드에서 나온 것이 아니라 이데올로기 적 관점과 "마스터 슬레이브 전치"의 변화입니다. 응용 프로그램은 원래 상사였으며, 자원을 얻기 위해 주도권을 잡았습니다. 그러나 IOC/DI 아이디어에서 응용 프로그램은 수동적이되었으며 IOC 컨테이너가 필요한 자원을 생성하고 주입하기를 수동적으로 기다리고있었습니다.
IOC는 객체 지향 디자인의 규칙 중 하나를 잘 반영합니다. 할리우드 규칙 : "우리를 찾지 마십시오. 즉, IOC 컨테이너는 물체가 해당 종속 물체를 찾아 적극적으로 찾는 물체보다는 주입하도록 도와줍니다.
1.1.3 IOC 및 DI
Di- 의존성 주입, 즉 "종속성 주입": 구성 요소 간의 종속성은 런타임 동안 컨테이너에 의해 결정됩니다. 비 유적으로, 컨테이너는 동적으로 구성 요소에 특정 종속성을 주입합니다. 의존성 주입의 목적은 소프트웨어 시스템에 더 많은 기능을 제공하는 것이 아니라 구성 요소 재사용 빈도를 높이고 시스템을위한 유연하고 확장 가능한 플랫폼을 구축하는 것입니다. 종속성 주입 메커니즘을 통해 특정 리소스의 출처 및 구현을 신경 쓰지 않고 간단한 구성을 통해 자신의 비즈니스 로직을 완료하기 위해 코드가없는 대상이 요구하는 리소스를 지정하면됩니다.
IOC의 핵심 사항 중 하나는 시스템 작동 중에 필요한 다른 객체를 객체에 동적으로 제공하는 것입니다. 이것은 DI (종속성 주입)를 통해 달성됩니다. 예를 들어, 객체 A는 데이터베이스를 작동해야합니다. 과거에는 연결 객체를 얻기 위해 항상 코드를 썼습니다. 스프링을 사용하면이 연결을 구성하는 방법과 구성시기에 대해 A에서 연결이 필요하다는 것을 스프링 만 알리면 A가 알 필요가 없습니다. 시스템이 실행될 때 Spring은 적절한 시간에 연결을 생성 한 다음 주입과 같은 주입에 주입하여 각 객체 간의 관계 제어를 완료합니다. A는 정상적으로 실행하려면 연결에 의존해야 하며이 연결은 Spring에 의해 주입되며 종속성 주입의 이름은 이것으로부터 나옵니다. 그렇다면 DI는 어떻게 구현됩니까? Java 1.3 이후의 중요한 기능은 반사이며,이를 통해 프로그램이 객체를 동적으로 생성하고 객체 방법을 실행하며 실행할 때 객체의 속성을 변경할 수 있습니다. 봄은 반사를 통해 주입됩니다.
Di를 이해하는 열쇠는 다음과 같습니다. "누가 누구에게 의존하고, 왜 그것에 의존해야합니까? 심도있게 분석합시다.
● 누구에 의존 하는가 : 물론 응용 프로그램은 IOC 컨테이너에 따라 다릅니다.
● 종속성이 필요한 이유 : 응용 프로그램에는 객체가 요구하는 외부 리소스를 제공하기 위해 IOC 컨테이너가 필요합니다.
● 누가 누가 주입하는지 : IOC 컨테이너가 응용 프로그램의 객체를 주입하는 것은 분명합니다.
● 주입 된 내용 : 객체에 필요한 외부 리소스 (오브젝트, 리소스 및 상수 데이터 포함)를 주입하는 것입니다.
IOC와 DI의 관계는 무엇입니까? 실제로, 그것들은 같은 개념과 다른 각도에서 설명됩니다. 제어 역전의 개념은 상대적으로 모호하기 때문에 (아마도 컨테이너 제어 객체의 수준으로 이해 될 수도 있기 때문에, 누가 물체 관계를 유지할 것인지 생각하기가 어렵습니다), 2004 년 마스터 마틴 파울러는 새로운 이름을 주었다. IOC와 비교하여 "종속성 주입"은 "주입 된 객체는 IOC 컨테이너 구성 종속성 객체에 의존한다"고 명확하게 설명합니다.
요약
실제로, 모든 사람은 Spring IOC의 개념에 대한 자신의 이해를 가지고 있으며 표준 답변은 없습니다. 일반적인 방향은 옳습니다.
위의 것은 봄의 의존성 주입 및 제어 역전을 이해하는 것입니다. 모든 사람에게 도움이되기를 바랍니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!