복붙노트

[SPRING] 간단한 영어로 AOP, Dependency Injection 및 Inversion Of Control이란 무엇입니까?

SPRING

간단한 영어로 AOP, Dependency Injection 및 Inversion Of Control이란 무엇입니까?

AOP, Dependency Injection, Inversion of Control SPRING 관련 개념을 이해하려고 노력했지만 이해하는데 어려움을 겪고 있습니다.

누구든지 간단한 영어로 이것을 설명 할 수 있습니까?

해결법

  1. ==============================

    1.나는 당신의 혼란을 이해하고이 개념들이 어떻게 관련되어 있는지 이해하는 데 시간이 걸렸다. 그래서 여기에 내 모든 (어쨌든 개인적인) 설명이 있습니다 :

    나는 당신의 혼란을 이해하고이 개념들이 어떻게 관련되어 있는지 이해하는 데 시간이 걸렸다. 그래서 여기에 내 모든 (어쨌든 개인적인) 설명이 있습니다 :

    1. 제어 반전

    반전 제어는 실제로 실행될 때와 동작의 사양을 분리하는 것을 가리키는 다소 일반적인 개념입니다. 예를 들어 비교해 보면,

    myDependency.doThis();
    

    myDependency.onEventX += doThis();
    

    후자의 경우 더 유연한 직접 호출이 없습니다. 일반적인 형태로, 제어 반전은 관찰자 패턴, 이벤트 또는 콜백과 관련됩니다.

    2. 의존성 반전

    종속성 반전은 또 다른 설계 원칙입니다. 대충 말해서 상위 수준 추상화는 하위 수준 추상화에 직접적으로 의존해서는 안됩니다. 이는 더 높은 수준의 추상화가 낮은 수준의 추상화없이 재사용 될 수없는 설계에 실제로 적용됩니다.

     class MyHighLevelClass {
         MyLowLevelClass dep = new MyLowLeverClass();
     }
    
     class App {
         void main() {  new HighLevelClass().doStuff(); }
     }
    

    여기에서 MyHighLevelClass는 MyLowLevelClass에 대한 액세스없이 컴파일 할 수 없습니다. 이 연결을 끊으려면 인터페이스를 사용하여 하위 수준 클래스를 추상화하고 직접 인스턴스화를 제거해야합니다.

    class MyLowLevelClass implements MyUsefulAbstraction { ... }
    
    class MyHighLevelClass {
    
        MyUsefulAbstraction dep;
    
        MyHighLevelClass( MyUsefulAbstraction dep ) {
            this.dep = dep;
        }
    }
    
    class App {
         void main() {  new HighLevelClass( new LowLevelClass() ).doStuff(); }
     }
    

    종속성 반전을 적용하기위한 컨테이너와 같은 특별한 것은 필요하지 않습니다. 이는 원칙입니다. 좋은 독서는 Bob 삼촌에 의한 The Dependency Inversion Principle입니다.

    3. 의존성 주입

    이제는 의존성 주입이 있습니다. 나에게 의존성 주입 = IoC + 의존성 반전 :

    위에서 제공된 예제에서 컨테이너가 객체를 인스턴스화하고 생성자에 종속성을 자동으로 주입하는 데 사용되는 경우 종속성 삽입을 수행 할 수 있습니다 (우리는 종종 DI 컨테이너를 사용합니다).

     class App {
         void main() {  DI.getHighLevelObject().doStuff(); }
     }
    

    주사의 다양한 형태가 있다는 것을 유의하십시오. 이 관점에서 setter 주입은 콜백의 한 형태로 볼 수 있습니다. DI 컨테이너는 객체를 생성 한 다음 setter를 호출합니다. 제어 흐름이 효과적으로 반전됩니다.

    4. AOP

    엄밀히 말하자면, AOP는 이전의 3 가지 점과 거의 관련이 없습니다. AOP에 관한 논문은 매우 일반적이며 다양한 소스를 함께 엮어서 (다른 언어로 표현할 수도 있음) 작동하는 소프트웨어를 만드는 아이디어를 제시합니다.

    나는 AOP에 대해 더 확장하지 않을 것이다. 여기서 중요한 것은 의존성 주입과 AOP가 제직을 매우 쉽게하기 때문에 효율적으로 함께 재생된다는 것입니다. IoC 컨테이너 및 의존성 주입을 사용하여 객체의 인스턴스화를 추상화하면 IoC 컨테이너를 사용하여 종속성을 주입하기 전에 aspect를 직조 할 수 있습니다. 그렇지 않으면 특수 컴파일 또는 특수 ClassLoader가 필요합니다.

    희망이 도움이됩니다.

  2. ==============================

    2.의존성 주입은 5 세의 의존성 주입을 설명하는 방법에 잘 설명되어 있습니다.

    의존성 주입은 5 세의 의존성 주입을 설명하는 방법에 잘 설명되어 있습니다.

    AOP - Aspect Oriented Programming - 기본적으로 ELSEWHERE에 위치한 규칙을 기반으로 작성한 소스가 다른 코드로 수정됨을 의미합니다. 즉, 예를 들어 말하자면 "모든 메소드의 첫 번째 라인에서 중앙 위치에 'log.debug ("입력 메소드 () ")를 넣고 해당 규칙을 사용하여 컴파일 한 각각의 모든 메소드가 해당 라인을 포함하게됩니다. aspect "는 첫 번째 소스 행에서 마지막까지를 제외하고 다른 방식으로 코드를 찾는 이름입니다.

    Inversion of Control은 기본적으로 모든 것을 제어하는 ​​중앙 코드 (main ()의 거대한 스위치처럼)를 가지고 있지는 않지만 "어떻게 든"호출되는 많은 코드를 가지고 있음을 의미합니다. 제목은 Wikipedia에서 논의됩니다 : http://en.wikipedia.org/wiki/Inversion_of_control

  3. ==============================

    3.이 세 가지는 모두 다른 개념이지만 모두 잘 작동하므로 스프링 애플리케이션은 종종 모든 것을 동시에 사용합니다. 내가 예를 들어 줄게.

    이 세 가지는 모두 다른 개념이지만 모두 잘 작동하므로 스프링 애플리케이션은 종종 모든 것을 동시에 사용합니다. 내가 예를 들어 줄게.

    우리가 여러 가지 일을 할 수있는 웹 애플리케이션을 가지고 있다고 가정 해 봅시다. 이 응용 프로그램을 여러 가지 방법으로 만들 수 있지만 한 가지 방법은 이러한 각각의 작업을 담당하는 클래스를 만드는 것입니다. 우리는 어딘가에서 이러한 클래스를 호출하고 생성해야합니다. 하나의 옵션은 각각의 서비스 중 하나를 생성하고, 소켓을 열고, 들어올 때 이러한 서비스에 호출을 전달하는 큰 메인 클래스를 갖는 것입니다. 불행하게도 우리는 스스로를 하나님 클래스로 만들었습니다. 너무 많은 논리와 너무 많이 우리의 프로그램에서 작동하는 방법에 대해 잘 알고 있습니다. 우리가 프로그램에 관해 무엇인가를 바꾼다면 아마도이 클래스를 수정해야 할 것입니다.

    또한 테스트하기도 어렵습니다. 클래스를 인스턴스화하고 다른 클래스를 직접 호출하면 클래스를 개별적으로 테스트 할 수 없습니다. 단위 테스트는 많이 쓰여지기가 훨씬 더 어렵습니다.

    이 문제를 해결할 수있는 방법은 제어 반전을 사용하는 것입니다. 우리는 "괜찮아, 이건 서비스 수업이야. 누가 그걸 설치 한거야? 내가 아냐." 일반적으로 각 인터페이스는 LoginService 또는 BillingService와 같은 인터페이스를 정의합니다. 해당 인터페이스를 두 가지 이상 구현할 수 있지만 앱은 상관하지 않습니다. 어떤 종류의 서비스 나 특정 이름의 서비스를 요구할 수 있다는 것을 알고 있고, 좋은 것을 얻을 수 있습니다.

    의존성 주입을 통해 우리는 모든 litle 조각들을 하나로 연결할 수 있습니다. 클래스에는 액세스 할 필요가있는 다른 구성 요소에 대한 참조 인 액세스 가능 필드, 생성자 인수 또는 설정 메서드가 있습니다. 따라서 단위 테스트가 훨씬 쉬워집니다. 테스트중인 개체를 만들고 모의 또는 스텁 종속성을 던진 다음 개체가 올바르게 작동하는지 테스트 할 수 있습니다.

    자, 실제 응용 프로그램은 모두 함께 배선해야하는 복잡한 조각 모음입니다. 이를 달성하는 방법에는 응용 프로그램이 추측을 할 수 있도록 허용하는 방법 ( "이 클래스는 UserService를 원하지만 다른 하나는 UserService를 구현하는 다른 클래스가 있습니다") 또는 XML로 연결되는 방법을 신중하게 설명하는 방법을 포함합니다 또는 자바. Spring은 핵심 부분으로 이러한 클래스를 함께 연결하는 서비스입니다.

    이제 우리는 AOP에 접근한다. 우리는 정교한 방법으로 서로 유선으로 연결된 이러한 모든 수업을 가지고 있다고 가정합시다. 우리가 일반적으로 묘사하고 싶은 몇 가지 교차 관심사가 있습니다. 예를 들어, 서비스가 호출 될 때마다 데이터베이스 트랜잭션을 시작하고 서비스가 예외를 throw하지 않는 한 해당 트랜잭션을 커밋하려고합니다. Spring은 이러한 작업을 수행하는 고유 한 위치에 있음을 알 수 있습니다. Spring은 클래스가 필요로하는 인터페이스를 구현하는 프록시 클래스를 즉시 생성 할 수 있으며 클래스를 프록시로 래핑 할 수 있습니다. 이제 IoC와 의존성 삽입은 aspect 지향 프로그래밍을 수행하는 데 반드시 필요한 것은 아니지만이를 달성하는 데 매우 편리한 방법입니다.

  4. ==============================

    4.내가 AOP에 대해 몇 마디 말씀 드리 자면, 이해하는 것이 더 간단 해지기를 바랍니다. AOP의 기본 원리는 일반적인 작업 / 측면을 찾는 것입니다. 코드의 많은 부분은 코드의 개념 비즈니스에 속합니다. 예를 들어 특정 기능을 호출 할 때마다 모든 기능을 시작하거나 개체가 작성 될 때 로그온하거나 관리자에게 전자 메일을 보냅니다. 그래서 프로그래머 대신에 우리는이 businuss 측면을 처리 할 것이다. 우리는 이러한 측면을 현장에서 관리합니다. 1 다리에 AOP의 모든 기본 ....

    내가 AOP에 대해 몇 마디 말씀 드리 자면, 이해하는 것이 더 간단 해지기를 바랍니다. AOP의 기본 원리는 일반적인 작업 / 측면을 찾는 것입니다. 코드의 많은 부분은 코드의 개념 비즈니스에 속합니다. 예를 들어 특정 기능을 호출 할 때마다 모든 기능을 시작하거나 개체가 작성 될 때 로그온하거나 관리자에게 전자 메일을 보냅니다. 그래서 프로그래머 대신에 우리는이 businuss 측면을 처리 할 것이다. 우리는 이러한 측면을 현장에서 관리합니다. 1 다리에 AOP의 모든 기본 ....

  5. ==============================

    5.Spring in Action과 간단한 비교 :

    Spring in Action과 간단한 비교 :

  6. ==============================

    6.Dependency Injection과 Inversion of Control의 차이점은 다음과 같습니다.

    Dependency Injection과 Inversion of Control의 차이점은 다음과 같습니다.

    http://martinfowler.com/articles/dipInTheWild.html

    ( "종속성 반전을 의미합니까?"섹션 참조)

    요약:

  7. from https://stackoverflow.com/questions/2572158/what-is-aop-dependency-injection-and-inversion-of-control-in-simple-english by cc-by-sa and MIT license