복붙노트

[SPRING] 스프링 인터페이스 주입 예제

SPRING

스프링 인터페이스 주입 예제

지금까지 Spring Framework에서 올바른 인터페이스 삽입 예제를 제공하는 사람은 아무도 없었다. 마틴 파울러 (Martin Fowler)의 기사는 필사자를위한 것이 아니라, 다른 모든 것들은 매우 혼란스러운 방식으로 배치되어 있습니다. 나는 사람들이 "스프링이 인터페이스 인젝션을 직접적으로 지원하지 않는다"고 말한 30 개의 기사를 서핑했습니다. ( "나는 setter와 constructor injection을 어떻게 기술 할 것인지 정확히 알지 못하기 때문에") 또는 " 다른 스레드 "또는 잘못된 예제라고 말하는 아래의 몇 가지 주석이있을 것입니다. 나는 설명을 요구하지 않습니다. 예를 들어 봅니다.

주입에는 세 가지 유형이 있습니다 : 생성자, 설정자 및 인터페이스. Spring은 최근에 직접 지원하지 않습니다 (사람들이 말한 것처럼). 그러면 정확히 어떻게 이루어 집니까?

고맙습니다,

해결법

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

    1.봄 DI의 변종에 따르면

    봄 DI의 변종에 따르면

    또한 Spring에서 인터페이스 주입이 구현되지 않았다는 사실을 명확히 언급하고있다.

    따라서 DI에는 두 가지 변종이 있습니다. 그래서 문서가 인터페이스 주입에 대해 아무 말도하지 않는다면, 그 명확한 것은 없다. 그 인터페이스 주입 믿는 사람들은 대답 인터페이스에서 setter 메서드를 제공하여 :

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

    2.인터페이스 삽입을 통해 인터페이스는 종속성을 설정할 수있는 지점을 명시 적으로 정의합니다.

    인터페이스 삽입을 통해 인터페이스는 종속성을 설정할 수있는 지점을 명시 적으로 정의합니다.

    interface InjectPerson {
        public void injectHere(Person p);
    }
    
    class Company implements InjectPerson {
       Person injectedPerson; 
    
       public void injectHere(Person p) {
            this.injectedPerson = p;
        }
    }
    
  3. ==============================

    3.안녕 당신의 대답을 명확히 할 수있는 아주 간단한 접근 방식으로 노력했습니다.

    안녕 당신의 대답을 명확히 할 수있는 아주 간단한 접근 방식으로 노력했습니다.

    다음은 두 개의 인터페이스와 두 개의 빈 클래스를 사용하여 빌드 한 코드입니다.

    Job이라는 이름의 첫 번째 인터페이스.

    public interface Job {
        public void setmyJob(String myJob);
        public String getmyJob();
    }
    

    MyJob과 같은 이름으로이 인터페이스를 구현하는 하나의 클래스

    public class MyJob implements Job {
        public String myJob;
    
        public MyJob() {
            System.out.println("From MyJob default Constructor and the ID= "+this);
        }
    
        public void setmyJob(String myJob) {
            this.myJob=myJob;
        }
    
        public String getmyJob() {
            return myJob;
        }
    }
    

    다음 단계에서는 이름이 Service 인 다른 인터페이스를 만들었습니다.

    public interface Service {
        public void setJob(Job job);
        public Job getJob();
    }
    

    이 서비스 인터페이스를 구현하기 위해 또 다른 클래스를 다시 작성해야한다.

    public class MyService implements Service {
    
        public Job job;
    
        public void setJob(Job job) {
            this.job=job;
            System.out.println("Hello from Myservice: Job ID="+job);
        }
    
        public Job getJob() {
            return job;
        }
    }
    

    main 함수를 사용하여 main 클래스를 생성하고 다음과 같이 코드를 작성합니다.

    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    public class MainApplication {
    
        public static void main(String...a) {
    
            BeanFactory beanfactory=new ClassPathXmlApplicationContext("Beans.xml");
    
            MyService myservice=(MyService)beanfactory.getBean("myservice");
            System.out.println("Before print");
            System.out.println(myservice.getJob().getmyJob());
        }
    }
    

    내 Beans.xml 파일에서 다음과 같이 코드를 언급했다.

     <?xml version="1.0" encoding="UTF-8"?>
     <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
    
        <bean id="myjob" class="MyJob">
            <property name="myJob" value="My First String"/>
        </bean>
    
        <bean id="myservice" class="MyService">
            <property name="job" ref="myjob"/>
        </bean>
    </beans>
    

    또한 다른 온라인 자습서를 참조한 다음 이러한 종류의 솔루션을 얻었습니다. 이 코드에 문제가 있으면 알려주십시오. 그것은 나를 위해 일하고있다.

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

    4.의존성 주사에는 3 가지 유형이 있습니다.

    의존성 주사에는 3 가지 유형이 있습니다.

    1. Constructor Injection(E.g Pico Container, Spring supports it).
    2. Setter Injection(E.g Spring supports it).
    3. Interface Injection(E.g Avalon, Spring does not support it).
    

    Spring은 생성자와 setter 기반 주입 만 지원합니다. 서로 다른 유형 (3)과 어떤 봄 지원 (2 가지)이 혼란스러워 보입니다.

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

    5.누군가 네 질문에 대답했다고 생각해. 나는 또한 "웹 플로우 북이있는 프로 스프링 MVC"에서이 문장을 읽을 때까지 인터페이스 주입이 무엇인지 알지 못했다.

    누군가 네 질문에 대답했다고 생각해. 나는 또한 "웹 플로우 북이있는 프로 스프링 MVC"에서이 문장을 읽을 때까지 인터페이스 주입이 무엇인지 알지 못했다.

    "인터페이스 기반 의존성 주입은 Spring Framework에서 지원하지 않는다는 점에 유의하십시오. 특정 인터페이스를 위해 주입 할 구체적인 구현을 지정해야한다는 의미입니다. "

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

    6.인터페이스 주입에 대한 아래 예제를 확인하십시오.

    인터페이스 주입에 대한 아래 예제를 확인하십시오.

    셰이프 인터페이스와 셰이프 즉 사각형과 사각형을 구현하는 2 개의 구체적인 클래스가 있습니다.

    인터페이스

    package di.interfaceinjection;
    public interface Shape {
        public String shapeName();
        public void displayName();
    }
    

    2 구현 된 클래스

    package di.interfaceinjection;
    
    public class Square implements Shape {
    
        @Override
        public String shapeName() {
            return "Square";
        }
    
        @Override
        public void displayName() {
            System.out.println("Square");       
        }
    
    }
    
    package di.interfaceinjection;
    
    public class Rectangle implements Shape{
    
        @Override
        public String shapeName() {
            return "Rectangle";
        }
    
        @Override
        public void displayName() {
            System.out.println("Rectangle");        
        }
    
    }
    

    이제 모양을 설정하는 클래스가 있습니다.

    public class ShapeSetter {
    
        private Shape shape;
    
        public Shape getShape() {
            return shape;
        }
    
        public void setShape(Shape shape) {
            this.shape = shape;
        }
    
    }
    

    마지막으로 구성

    <bean id="shape1" class="di.interfaceinjection.ShapeSetter">
        <property name="shape" ref="square"></property>
       </bean>
        <bean id="shape2" class="di.interfaceinjection.ShapeSetter">
        <property name="shape" ref="rectangle"></property>
       </bean>
       <bean id="square" class="di.interfaceinjection.Square"></bean>
       <bean id="rectangle" class="di.interfaceinjection.Rectangle"></bean>
    

    이리,

    우리는 다른 모양을 주입하고 있습니다.

    package di.interfaceinjection;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class InterfaceInjeection {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            ApplicationContext appContext  = new ClassPathXmlApplicationContext("intro.xml");
            ShapeSetter shape = (ShapeSetter)appContext.getBean("shape2");
            shape.getShape().displayName();
        }
    
    }
    
  7. ==============================

    7.내 생각에, 인터페이스 주입에 대한 혼란은 실제로 "인터페이스 주입"이라는 용어가 무엇을 의미하는지 이해하지 못해 발생합니다. 필자의 이해에서, 인터페이스 주입은이 빈의 클래스 정의가 그것을 구현하고 있지 않더라도, bean contener가 새로운 인터페이스를 주입 할 수있는 능력을 설명한다.

    내 생각에, 인터페이스 주입에 대한 혼란은 실제로 "인터페이스 주입"이라는 용어가 무엇을 의미하는지 이해하지 못해 발생합니다. 필자의 이해에서, 인터페이스 주입은이 빈의 클래스 정의가 그것을 구현하고 있지 않더라도, bean contener가 새로운 인터페이스를 주입 할 수있는 능력을 설명한다.

    여기에 제시된 모든 예제는 구체적인 클래스에서 빈을 작성하는 방법과 다른 빈에이를 주입하는 방법을 보여줍니다. 모든 경우 콩이 인터페이스로 정의 된 필드에 주입된다는 사실은 중요하지 않습니다. 모든 작업은 구체적인 인스턴스에서 만들어진 빈을 사용하여 수행됩니다.

    또 다른 재미있는 예제를 제공 할 수 있습니다.

    package creditCards;
    
    interface PaymentCard {
        Boolean isDebitAllowed();
    }
    
       <bean id="card" class="creditCards.PaymentCard">
          <lookup-method name="isDebitAllowed" bean="boolValue"/>
        </bean>
    
        <bean id="boolValue" class="java.lang.Boolean">
            <constructor-arg type="boolean" value="true"/>
        </bean>
    

    여기서 보았 듯이, 인터페이스를 통해 빈을 생성하는 것이 가능합니다! IoC 컨텐서가이 빈의 인스턴스를 자체적으로 초기화하기 때문에 인터페이스 인젝션이 아닙니다. 즉, 카드 빈은 초기화 된 객체이지 인터페이스가 아니라,이 질문에 대해 선택한 대답이 맞는지 확인하십시오.

  8. from https://stackoverflow.com/questions/10248000/spring-interface-injection-example by cc-by-sa and MIT license