Spring의 의존성 주입 (Dependency Injection, DI) - 3
- Spring은 컴포넌트나 단순 값 뿐만 아니라 자바 컬렉션, 외부에 정의된 프로퍼티, 다른 팩토리 빈을 주입할 수 있도록 주입 인자에 많은 옵션을 제공한다.
- 단순 값을 주입하는 방법으로는 xml 구성파일에 p 네임스페이스를 이용하는 방법, @Value 애노테이션을 이용하는 방법, SpEL을 이용하는 방법 등이 있다.
🔘 구성파일의 p 네임스페이스를 이용하여 값 주입하기
// 값을 주입받을 클래스
public class InjectSimple {
private String name;
private int age;
private float height;
private boolean programmer;
private Long ageInSeconds;
...
public void setAgeInSeconds(Long ageInSeconds) {
this.ageInSeconds = ageInSeconds;
}
public void setProgrammer(boolean programmer) {
this.programmer = programmer;
}
public void setAge(int age) {
this.age = age;
}
public void setHeight(float height) {
this.height = height;
}
public void setName(String name) {
this.name = name;
}
...
}
<beans ...>
<bean id="injectSimple"
class="com.apress...InjectSimple"
p:name="John Mayer"
p:age="39"
p:height="1.92"
p:programmer="false"
p:ageInSeconds="1241401112" />
</beans>
🔘 @Value 애노테이션을 이용하여 값 주입하기
@Service("injectSimple")
public class InjectSimple {
@Value("John Mayer")
private String name;
@Value("39")
private int age;
@Value("1.92")
private float height;
@Value("false")
private boolean programmer;
@Value("1241401112")
private Long ageInSeconds;
...
}
🔘 SpEL을 이용하여 값 주입하기
// 주입할 값을 가지고 있는 자바 구성 클래스
@Componenet(“injectSimpleConfig”)
public class InjectSimpleConfig {
private String name = "John Mayer";
private int age = 40;
private float height = 1.92f;
private boolean programmer = false;
private Long ageInSeconds = 1_241_401_112L;
public String getName() ...
public int getAge() ...
public float getHeight() ...
public boolean isProgrammer() ...
public Long getAgeInSeconds() ...
}
<!-- xml 구성파일 -->
<beans ...>
<bean id="injectSimpleConfig"
class="com.apress... InjectSimpleConfig" />
<bean id="injectSimple"
class="com.apress... InjectSimple"
p:name="#{injectSimpleConfig.name}"
p:age="#{injectSimpleConfig.age}"
p:height="#{injectSimpleConfig.height}"
p:programmer="#{injectSimpleConfig.programmer}"
p:ageInSeconds="#{injectSimpleConfig.ageInSeconds}" />
</beans>
🔘 @Value 애노테이션과 SpEL을 함께 사용하여 주입하기
@Service("injectSimple")
public class InjectSimple {
@Value("#{injectSimpleConfig.name}")
private String name;
@Value("#{injectSimpleConfig.age}")
private int age;
@Value("#{injectSimpleConfig.height}")
private float height;
@Value("#{injectSimpleConfig.prgrammer}")
private boolean programmer;
@Value("#{injectSimpleConfig.ageInSeconds}")
private Long ageInSeconds;
...
}
@Service 애노테이션은 @Component 애노테이션의 특수한 형태로 @Component가 더 넓은 범위를 커버한다.
🔘 같은 XML 구성 내에서 주입하기
public class InjectRef {
private Oracle oracle;
public void setOracle(Oracle oracle) {
this.oracle = oracle;
}
}
<beans ...>
<bean id="oracle" name="wiseworm"
class="com.apress...BookWormOracle" />
<bean id="injectRef"
class="com.apress...InjectRef">
<!-- InjectRef 클래스 내의 주입받을 프로퍼티 이름 지정 -->
<property name="oracle">
<!-- 주입에 사용될 bean ID 지정, ID가 아닌 다른 이름으로 -->
<!-- bean을 가져오거나 다른 구성 XML에 있는 bean을 가져오기 위해서는 -->
<!-- ref 태그의 bean 속성을 이용해야 한다. -->
<!-- 즉, 아래 문장은 다음으로 수정 가능하다 -->
<!-- <ref bean="wiseworm" /> -->
<ref bean="oracle" />
</property>
</bean>
</beans>
주입될 bean은 정의된 타입을 구현 또는 상속한 클래스이면 된다.