스프링 프레임워크에서 셋터, 생성자로 주입 예제
이런 저런 자료들을 검색해서 사용하는데 별 문제는 없지만 기초적인 지식은 갖추고 있어야 한다는 고집 때문에 굳이 꾸역꾸역 책을 읽고 있다. 이해가 가는 부분들은 다시금 정리를 해 놓자는 생각에 별 내용은 아니지만...
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으로 정의할 때는 위와 같이 세터로 정의한다.그리고 오토와이어링 대상이 되는 필드의 타입이 인터페이스가 아니어도 괜찮다.
'프로그래밍 > Spring' 카테고리의 다른 글
CommandLineRunner이용 및 어플리케이션 구조 (0) | 2019.04.16 |
---|---|
@ComponentScan을 사용한 자동 Bean등록 (0) | 2019.04.16 |
@Data, Lombok 어노테이션 (0) | 2019.04.08 |
Spring DispatcherServlet과 MVC아키첵처 (0) | 2019.03.28 |
Spring-boot WebSecurityConfigurerAdapter 설정관련 항목 (0) | 2019.03.27 |