의존관계 주입
1. 참조 Bean 주입하기
(1) 소스상에서 보는 bean 참조를 주입하는 모습
1) beans.xml
<?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-3.0.xsd">
<bean id="messageBean" class="sample1.MessageBeanImpl" >
<constructor-arg>
<value>Spring</value>
</constructor-arg>
<property name="greeting">
<value>Hello, </value>
</property>
<property name="outputter">
<ref local="outputter" />
</property>
</bean>
<bean id="outputter" class="sample1.FileOutputter">
<property name="filePath">
<value>out.txt</value>
</property>
</bean>
</beans>
2) MessageBeanImpl.java
import java.io.IOException;
public class MessageBeanImpl implements MessageBean {
private String name;
private String greeting;
private Outputter outputter;
public MessageBeanImpl(String name) {
this.name = name;
}
public void setGreeting(String greeting) {
this.greeting = greeting;
}
public void sayHello() {
String message = greeting + name + "!";
System.out.println(message);
try {
outputter.output(message);
} catch(IOException e) {
e.printStackTrace();
}
}
public void setOutputter(Outputter outputter) {
this.outputter = outputter;
}
// id=outputter 참조변수가 id=messageBean의 property=outputter의 매개변수로 온 형태--> 의존성 주입
}
2. @Autowired 방식으로 주입
의존관계를 설정하는 또다른 방법이 바로 @Autowired이다.
@Autowired 어노테이션을 사용하면 Autowiring은 'byType', 즉, Bean의 타입을 사용해서 연결하는 방법으로 실행된다. 그리고 설정 파일 beans.xml에 <context-annotation-config/> 요소를 추가한다.
MessageBeanImpl 클래스의 outputter 프로퍼티는 @Autowired 어노테이션에 의해 자동의로 스프링이 의존관계를 설정하기 때문에 설정 파일에서 제거한다.
덧붙이면, @Autowired를 어노테이션을 적용하려면, BeanFactory가 아니라 ApplicationContext를 사용해야 한다.
--> @Autowired를 사용할 경우 바뀌는 부분을 표시해보겠다.
(1) @Autowired 방식
1) beans.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>
<bean id="messageBean" class="sample1.MessageBeanImpl" >
<constructor-arg>
<value>Spring</value>
</constructor-arg>
<property name="greeting">
<value>Hello, </value>
</property>
<property name="outputter">
<ref local="outputter" />
</property>
</bean>
<bean id="outputter" class="sample1.FileOutputter">
<property name="filePath">
<value>out.txt</value>
</property>
</bean>
</beans>
2) MessageBeanImpl.java
import java.io.IOException;
public class MessageBeanImpl implements MessageBean {
private String name;
private String greeting;
private Outputter outputter;
@Autowired
private Outputter outputter;
// MessageBeanImpl 클래스가 이름이 outputter인 프로퍼티를 갖고 있다면 이름(id)이 outputter인 빈 객체가 프로퍼티의 값으로 전달된다.
// 이렇게 하면 설정(setter) 메서드를 기술할 필요가 없다. 스프링이 필드에 직접 주입한다.
// 즉, <property>에 주입할 필요 없이 필드의 데이터 타입을 체크하여 일치하는 외부의 Bean 주입받아 사용할 수 있다.
public MessageBeanImpl(String name) {
this.name = name;
}
public void setGreeting(String greeting) {
this.greeting = greeting;
}
@Autowired
public void setOuputter(Outputter outputter){
this.outputter = outputter;
}
public void sayHello() {
String message = greeting + name + "!";
System.out.println(message);
try {
outputter.output(message);
} catch(IOException e) {
e.printStackTrace();
}
}
public void setOutputter(Outputter outputter) {
this.outputter = outputter;
}
}
'Programing > Spring' 카테고리의 다른 글
[Spring] iBatis 1 (0) | 2014.12.16 |
---|---|
[Spring] web.xml 기본 설정 (1) | 2014.12.13 |
[spring] 스프링 MVC 인터페이스 구현 클래스 (0) | 2014.12.13 |
[Spring] 스프링 MVC 패턴 개요 (0) | 2014.12.13 |
[Spring] AOP 용어 설명 (0) | 2014.12.13 |