Spring - 애플리케이션 컨텍스트 구성하기 3

 

여러가지 방법으로 의존성 주입하기

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은 정의된 타입을 구현 또는 상속한 클래스이면 된다.