1. Setter Injection이란?
Construction Injection은 생성자를 사용해 의존성을 처리했다. Setter Injection은 Setter 메소드를 통해 DI를 처리한다. Construction Injection와 Setter Injection 중 무엇을 사용하든 상관은 없지만 코딩 컨벤션에 따라 한 가지로 통일해서 사용한다. 대부분 Setter Injection을 사용한다고 한다.
2. Setter Injection 기본 사용법
다음과 같이 Car 클래스가 구현되었다.
# Car 클래스
public class Car {
private Engine engine;
private int seats;
public Car() {
System.out.println("기본 생성자로 Car 객체 생성");
}
public void setEngine(Engine engine) {
System.out.println("setEngine 호출");
this.engine = engine;
}
public void setSeats(int seats) {
System.out.println("setSeats 호출");
this.seats = seats;
}
public void powerOn() {
System.out.println("시동 On / "+this.seats+"명 수용");
engine.sound();
}
public void powerOff() {
System.out.println("시동 Off");
}
}
Constructor Injection에서는 위와 같이 Car class를 구현한 후 xml 파일에서 <constructor-arg> 태그를 사용했다. Setter Injection의 경우 <property> 태그를 사용한다. <property> 태그는 name 속성을 가지는데 이 name값의 첫 글자를 대문자로 바꾸고 앞에 "set"을 붙이면 호출하고자 하는 메소드의 이름이 된다. 즉, "engine"이라면 setEngine이 호출할 메소드가 된다. 이외는 <constructor-arg>와 동일하게 bean 객체의 경우 ref 속성을 사용하고, int와 같은 기본 타입은 value 속성을 사용해 넘긴다.
<?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.xsd">
<bean id="car" class="MyExam.Car">
<property name="engine" ref="engineB"></property>
<property name="seats" value="2"></property>
</bean>
<bean id="engineA" class="MyExam.EngineA"></bean>
<bean id="engineB" class="MyExam.EngineB"></bean>
</beans>
Main 문은 아래와 같다.
# Main 클래스
public class Main {
public static void main(String[] args) {
// 스프링 컨테이너 구동
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
// 객체 요청
Car car = (Car)factory.getBean("car");
car.powerOn();
car.powerOff();
// 컨테이너 종료
factory.close();
}
}
이때 결과는 다음과 같다.
위와 같이 Setter Injection이 잘 동작하는 것을 확인할 수 있다.
'BackEnd > Spring' 카테고리의 다른 글
[Spring] ERROR: org.springframework.web.servlet.DispatcherServlet - Context initialization failed (0) | 2023.05.14 |
---|---|
[Setter Injection] p Namespace (0) | 2023.04.28 |
[Construction Injection] 다중 변수 매핑 (0) | 2023.04.28 |
[Construction Injection] 의존관계 변경 (0) | 2023.04.28 |
[Spring] Constructor Injection 기본 사용법 (0) | 2023.04.27 |