바닥코딩
코드로 익혀보는 spring 기초2(Annotation통해 의존성 주입) 본문
Annotation 활용해서 type에 맞게 자동으로 의존성 주입 하는법
먼저 이전의 포스팅 했던 내용과 같이 Man, Woman , 클래스를 만들어 xml 파일에 빈을 추가 해 보겠습니다
package kr.dkkm.spring.di;
public interface Gender {
public void print_gender();
}
Gender interface
package kr.dkkm.spring.di;
public class Man implements Gender {
private String myName;
public void setMyName(String myName) {
this.myName = myName;
}
@Override
public void print_gender() {
// TODO Auto-generated method stub
System.out.println(myName +" 의 성별은 남자입니다!");
}
}
Man 클래스
package kr.dkkm.spring.di;
public class Woman implements Gender {
private String myName;
public void setMyName(String myName) {
this.myName = myName;
}
@Override
public void print_gender() {
// TODO Auto-generated method stub
System.out.println(myName+" 의 성별은 여자 입니다");
}
}
Woman 클래스
package kr.dkkm.spring.di;
public class Gender_Distunction {
private Gender gender;
public Gender_Distunction(Gender gender) {
this.gender = gender;
}
public void Diestinction() {
gender.print_gender();
}
}
Gener_Distinction 클래스에는 생성자 함수를 통해 인터페이스 객체를 주입해 주는 코드를 작성해 줍니다
Man과 Woman 클래스는 이전 포스팅 내용과 같이 bean을 주입해 주고 생성자 함수가 있는 Gender_Distictionn은 위와 같이 입력해준다음 finish
만든 객체 우클릭 후 insert<constructor-arg> elemanet클릭하면
<?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="man" class="kr.dkkm.spring.di.Man">
<property name="myName" value="철수"></property>
</bean>
<bean id="woman" class="kr.dkkm.spring.di.Woman">
<property name="myName" value="영희"></property>
</bean>
<bean id="GD" class="kr.dkkm.spring.di.Gender_Distunction">
<constructor-arg></constructor-arg>
</bean>
</beans>
위와 같은 xml이 설정이 됩니다 여기서 생성자 함수를 통해 어떤 값을 전달 받을지 결정을 하기 위해 참조를 해줍니다 저는 man읕 통해 참조를 받아 보겠습니다
위와 같이 xml에 ref 를 추가하면
<constructor-arg ref="man"></constructor-arg>
이부분에 ref="man"이 추가된 것을 확인할 수 있습니다 이제 MainApp에서 실행을 해보겠습니다
package kr.dkkm.spring.di;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"kr/dkkim/spring/di/beans/gender.xml");
Gender_Distunction G_D = (Gender_Distunction)context.getBean("GD");
G_D.Diestinction();
context.close();
}
}
이렇게 생성자 함수를통해 bean 객체 내 내용을 주입 시킬 수 있습니다. 이번에는 이 과정을 더 간단하게 Annotation을 통해 진행 해보겠습니다
<constructor-arg ref="man"></constructor-arg>
먼저 xml내부 위에 문장을 지워 줍니다 오류가 나는게 당연하기 떄문에 무시하고 일단 진행합니다
그 다음 Gender_Distinction의 생성자 함수를 지워 줍니다
다시 xml 파일로 넘어가 Namespaces 에 context를 체크 해주면 아래와 같은 context란이 생성이 됩니다
context란에서 beans 우클릭 후 isnert <context:annotation-config> element 를 선택해줍니다
<context:annotation-config></context:annotation-config>
그렇게 된다면 xml제일 아래 줄에 해당 코드가 추가 된 것을 확인 할 수 있습니다
이제부터는 Gender_Distiction을 통해 어떻게 bean 객체를 주입 받는지 코들르 통해 확인해 볼 수 있습니다
package kr.dkkm.spring.di;
import org.springframework.beans.factory.annotation.Autowired;
public class Gender_Distunction {
@Autowired
private Gender gender;
public void Diestinction() {
gender.print_gender();
}
}
처음은 @Autowired 어노테이션을 추가해 줍니다 @Autowired 어노테이션은 Gender에 걸 맞는 bean 을 알아서 찾아 주입해줍니다 그렇지만 해당 코드는 에러를 발생시킵니다 왜냐면 @Autowired가 적당하다고 찾는 bean은 man 과 woman 두가지 이기 때문에 두가지중 어느것을 선택해야할지 결정한느 과정에서 에러를 발생 시킵니다 따라서 @Qualifier를 통해 주입하고자 하는 Bean을 명시해 보겠습니다.
package kr.dkkm.spring.di;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class Gender_Distunction {
@Autowired
@Qualifier(value="woman")
private Gender gender;
public void Diestinction() {
gender.print_gender();
}
}
위와 같이 명시를 해주면 해당 코드는 혼동되는 타입 없이 woman 이라는 하나의 bean만을 선택하게 됩니다 따라서 아래와 같은 결과값을 출력하게 됩니다
마직막으로는 Bean 의 name 값을 통해 의존성 주입을 하는 방법에 대해 알아보겠습니다 name값을 통해 의존성을 주입하기 위해서는 @Resoruce라는 어노테이션을 추가 해주면 됩니다
package kr.dkkm.spring.di;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class Gender_Distunction {
//@Autowired
//@Qualifier(value="woman")
@Resource(name="man")
private Gender gender;
public void Diestinction() {
gender.print_gender();
}
}
위와 같이 @Resource annotation을 통해 의존성을 주입할 수 있습니다
위에서는 3가지의 Annotation을 사용했지만 실재로는 훨씬 많은 annotation이 있습니다 annotation을 통해 모듈의 결합도를 낮추기 위해 적절하게 Annotation을 활용하는 방향으로 코딩을 공부해봅시다
'Spring Framework > 스프링 기초' 카테고리의 다른 글
코드로 익혀보는 spring 기초3( AOP) (0) | 2020.02.18 |
---|---|
코드로 익혀보는 Spring 기초1(의존성 주입과 Bean 객체) (0) | 2020.02.13 |
Spring mybatis (0) | 2020.02.06 |
스프링 프로젝트 오라클 연동 (0) | 2020.02.05 |
스프링 프로젝트의 기본 구조 및 의존성 (0) | 2020.02.04 |