본문 바로가기
프로그래밍/Spring

스프링 프레임워크에서 셋터, 생성자로 주입 예제

by Mr-후 2019. 4. 16.
반응형

스프링 프레임워크에서 셋터, 생성자로 주입 예제


이런 저런 자료들을 검색해서 사용하는데 별 문제는 없지만 기초적인 지식은 갖추고 있어야 한다는 고집 때문에  굳이 꾸역꾸역 책을 읽고 있다. 이해가 가는 부분들은 다시금 정리를 해 놓자는 생각에 별 내용은 아니지만... 


Frontend클래스. 

package com.example.app; 

import ~ annotation.Autowired; 

public class Frontend {

@Autowired

ArgumentResolver argumentResolver; 

@Autowired

Calculator calculator; 


public void run() {

System.out.print("Enter 2 numbers like 'a b' : "); 

Argument arg = argumentResolver.resolve(System.in); 

int result = calculator.calc(arg.getA(), arg.getB()); 

System.out.println("result =" + result);

}

}


위의 예제는 @Autowired를 이용한 DI 예제이다. DI컨테이너는 @Autowired애너테이션을 붙인 필드를 포함한 클래스를 관리하고 객체중에서 @Autowired애너테이션이 붙은 필드에 맞는 객체를 자동으로 찾아내어 주입한다. 


여기에서 본론은 @Autowired 형태로 주입되는 것이 아닌 세터 메서드를 만들어 주입하는 방식에 대한 이야기를 옮겨 본다. 

오토 와이어링 방식을 사용하지 않으려면 Fontend 클래스의 @Autowired 애너테이션을 삭제하고 세터 메서드를 만들어 다음과 같이 Bean 정의 파일에 Frontend객체 필드를 직접 대입한다. 

Bean정의 파일 

@Bean

Fontend fontend() {

Frontend frontend = new Frontend(); 

fontend.setCalculator(calculator()); 

fontend.setArgumentResolver(argumentResolver()); 

return frontend; 

}

스프링 프레임워크에 의존하지 않는 라이브러리를 만든다면 다른 라이브러리에서 해당 라이브러리를 사용할 때 @Autowired는 사용하지 않을 것이므로,
일반적으로 셋터나 생성자가 속성을 설정하도록 구현한다. 이런 라이브러리에 포함된 클래스를 Bean으로 정의할 때는 위와 같이 세터로 정의한다. 

그리고 오토와이어링 대상이 되는 필드의 타입이 인터페이스가 아니어도 괜찮다. 


반응형