날아라쩡글이의 블로그입니다.

의존성 주입의 수동 주입 방법 본문

중앙 HTA (2106기) story/spring java framwork story

의존성 주입의 수동 주입 방법

날아라쩡글이 2021. 12. 27. 15:14
728x90
반응형

의존성 주입의 수동 주입 방법 

  • setter
    • setter injection(setter메소드를 이요한 의존성 주입)
      • 의존하는 객체를 담는 멤버변수를 정의한다. 
      • 멤버변수 갯수만큼 setter메소드를 정의한다. 
      • 스프링 bean설정파일에서 <property />태그를 이용해서 의존하는 객체를 주입시킨다. 
    • <bean id="userServiceImpl" class="com.sample.service.UserServiceImpl"></bean>
      <bean id="setterController" class="com.sample.controller.SampleSetterController">
      <property name="productService" ref="productServiceImpl"></property>
      //name : setter메소드이름, ref:setter메소드의 매개변수로 전달되는 객체의 빈 아이디
      <property name="userService" ref="userServiceImpl"></property>
      </bean>
      • public class SampleController{
        //의존성 주입을 통해서 전달받은 객체를 저장하는 변수
        UserService userService;    //멤버변수의 타입은 의존성 주입을 받는 객체의 부모타입이다.
        ProductService productService;

        //의존하는 객체를 전달받을 setter메소드
        public void setUserService(UserService userService){this.userService = userService  }

        public void setProductService(ProductService productService){this.productService=productService}
        }
  • setter/ namespaces에서 p로 설정
    • <bean id="setterController" class="com.sample.controller.SampleSetterController"
      p:productService-ref="productServiceImpl"
      p:userService-ref="userServiceImpl"></bean>
    • <property name="setter메소드이름" ref="스프링 컨테이너에 보관중인 객체의 아이디" />
      대신 Namespaces에서 p를 클릭하고, xmlns:p="http://www.springframework.org/schema/p가 추가된 후 
      p:setter메소드이름-ref="스프링 컨테이너에 보관중인 객체의 아이디"로 설정해도 setter의존성 주입이 이뤄진다.
    • setter메소드에 한해서 작성할 수 있다.
      setter메소드만 존재 : 기본자료형만 온다.
      setter메소드 -ref : 객체가 온다.
  • constructor
    • 생성자 메소드를 이용해서 의존성 주입을 받는 방식이다.
    • 의존성 주입을 받는 객체에는 반드시 <constructor-arg />태그의 갯수가 동일한 매개변수를 갖는 생성자가 정의되어 있어야한다. 
    • <bean id="sampleController" class="com.sample.controller.SampleConstructorController">
      <constructor-arg name="productService" ref="productServiceImpl"></constructor-arg>

      <constructor-arg name="userService" ref="userServiceImpl"></constructor-arg>
      </bean>
      //name : 생성자 메소드의 매개변수 이름, ref : 생성자 메소드의 해당하는 매개변수로 전달되는 객체의 빈아이디
    • <constructor-arg /> 태그가 하나도 없는 경우 기본생성자를 이용한 경우다.
      • 반드시 해당 클래스에 기본 생성자 메소드가 존재해야한다. 
      • 기본생성자가 존재하지 않으면 error가 난다. 
      • <constructor-arg />의 갯수와 매개변수의 갯수가 동일한 생성자 메소드가 반드시 클래스에 존재해야하며, 타입도 일치해야한다. 
    • public class SampleController{
      //의존성 주입을 통해서 전달받은 객체를 저장하는 변수
      UserService userService;    //멤버변수의 타입은 의존성 주입을 받는 객체의 부모타입이다.
      ProductService productService;

      //의존하는 객체를 전달받을 생성자 메소드

      public void setProductService(ProductService productService, UserService userService){
      this.productService=productService;
      this.userService = userService;
      }

      }
  • constructor / namespaces에서 c로 설정
    • <bean id="sampleController" class="com.sample.controller.SampleConstructorController"
      c:productService-ref="productServiceImpl"
      c:userService-ref="userServiceImpl"></bean>
    • <constructor-arg name-"생성자의 매개변수이름" ref="스프링 컨테이너에 보관중인 객체의 아이디"/>대신 c:생성자의 매개변수 이름-ref = "스프링컨테이너에 보관중인 객체의 아이디"로 설정해도 생성자 의존성 주입이 이뤄진다. 
  • 객체 타입
    • 스프링 컨테이너가 생성/보관/조립하는 객체를 말한다.
    • <bean id="빈의 아이디" class="클래스전체경로">
      <property name="setter메소드이름" ref="빈의 아이디">
      </bean>
    • 객체를 조립하기위해서는 spring Container로 조립이 되야한다. 그렇지 않으면 조립할 수 없다. 
    • <bean />태그나 지정된 패키지를 스캔해서 스프링 컨테이너에 등록된 객체이다.
    • 다른 객체를 조립될 때 ref속성을 사용한다. 
  • collection
    • 이전까지는 객체를 1개를 입력받았다. 이제는 객체 한개가 아니라 여럿을 입력받는 방법을 작성할 예정이다. 
    • 스프링 컨테이너가 생성한 객체를 collection(배열 String[] urls, set Set<MessageService> messageServices, List List<ExceptionHandler> exceptionHandlers)에 저장된 형태로 주입받도록 멤버변수를 정의한다.
    • 기본자료형 값이나 스프링 컨테이너가 생성/보관/조립하는 객체를 여러개 저장하고 있는 객체를 말한다.
    • setter 주입, constructor 주입을 통해서 의존성 주입이 가능하다. 
    • public class SampleCollectionController {
      private Set<MessageService> messageServices;

      public void setMessageServices(Set<MessageService> messageServices) {
      this.messageServices = messageServices;
      }
      public void setUrls(String[] urls urls){this.urls = urls};
      public void setExceptionHandlers(List<ExceptionHandler>){this.exceptionHandlers = exceptionHandlers};
      }
      • private Set<MessageService> messageService;
      • messageServices객체가 여러 개 저장된 Set구현객체를 주입받도록 정의되어 있기 때문에 
        <set> : set에 정의된, 배열이면 array, 리스트면 list로 변경해주면 된다.
        <ref bean="빈의 아이디" />
        <ref bean="빈의 아이디" /> : bean의 아이디에 해당하는 것
        <ref bean="빈의 아이디" />
        </set>
        과 같은 형태로 정의해서 빈의 아이디에 해당되는 객체가 3개 저장되어 있는 Set구현객체를 생성해야 한다.

      • <bean id="sampleController" class="com.sample.controller.SampleCollectionController">
        <property name="messageServices">
        <set>//아래의 값을 담을  Set구현객체를 생성시킨다.
        <ref bean="sms"/>
        <ref bean="email"/>
        </set>
        </property>
        <property name="exceptionHandlers">
        <list>//아래의 값을 담을  List구현객체를 생성시킨다.
        <ref bean="runtimeExceptionHandler" />
        <ref bean="DataAccessExceptionHandler" />
        </list>
        </property>
        <property name="urls">
        <array> //아래의 값을 담을  배열객체를 생성시킨다.
        <value>http://www.daum.net</value>//문자열이라 기본자료형인 value로 담는다

        <value>http://www.naver.com</value>
        </array>
        </property>
        </bean>
  • map
    • 기본자료형 값이나 스프링 컨테이너가 생성/보관/조립하는 객체를 key, value의 쌍으로 여러개 저장하는 객체를 말한다.
    • 조건식의 상수값을 Map객체의 key로 활용하면 조건식(if~else if)을 없앨 수 있다.
      • 상수값으로 꺼내와서 사용하면 된다. 
    • map이다. 
    • MessageService인터페이스 구현객체가 key, value쌍으로 저장되는 Map객체를 스프링 컨테이너로 부터 주입받는다. 
    • Map객체에는 {"sms" : SmsMessageImpl, "email":EmailMessageServiceImpl}과 유사한 형태로 MessageService인터페이스의 구현객체들이 저장되어 있다. 
    • public class SampleController{
      Map<String, MessageService> messageService;
      public void setMessageService(Map<String, MessageService> messageService) {
      this.messageService = messageService;
      }
      public void execute(String key, String message){
      MessageService service = messageService.get(key);
      service.send(message);
      }

      }
    • <bean id="sampleController" class="com.sample.controller.SampleMapController">
      <map>
      <entry key="key" value-ref="MessageService구현객체의 빈 아이디"></entry>
      </map>
    • <property name="messageService">
      <map>
      <entry key="sms" value-ref="smsService"></entry>
      <entry key="email" value-ref="emailService"></entry><!-- 키와 value의 한쌍을 entry라고 부른다. -->
      </map>
      </property>
      </bean>
  • value:기본자료형 사용
    • 정수, 실수, 불린형, 문자열 등이다. 
    • 다른 객체에 조립될 때 value속성을 사용한다. 
    • <property name="setter메소드이름" value="기본자료형값">
    • public class SampleController{
      private String host;
      private int port;
      public void setHost(String host){this.host = host}
      public void setPort(int port){this.port = port}

    • <bean id="sampleController" class="com.sample.controller.SampleValueController">
      <property name="host" value="192.168.10.2"></property>
      <property name="port" value="3000"></property>
      </bean>
    • <bean id="sampleController" class="com.sample.controller.SampleValueController"
      p:
      host="192.168.10.2"
      p:port="3000"> //기본형은 -ref를 붙이지 않아도 된다. 
      </bean>
반응형

'중앙 HTA (2106기) story > spring java framwork story' 카테고리의 다른 글

DB Access 방법 (CRUD)  (0) 2021.12.28
느슨한 결합, DB 연결  (0) 2021.12.27
spring framwork설명  (0) 2021.12.27
의존성 주입 (DI) 자동 주입  (0) 2021.12.27
전자전부표준프레임워크  (0) 2021.12.27
Comments