본문 바로가기

프로그래밍/Spring

[Spring]의존 관계 주입(Dependency Injection) : 어노테이션 @Requried @Qualifier @Autowired @Resource

준비 작업

- @Requried @Qualifier @Autowired  @Resource 사용 시 xml 설정에 어노테이션 설정을 추가해야한다.

<context:annotation-config/>

 

@Requried

- 반드시 해당 프로퍼티 값을 주입받도록 설정하는 어노테이션

- 값이 주입되지 않으면 에러 발생!

- 메소드에만 표시가능하며, 프로퍼티에는 표시 불가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package kr.spring.ch01;
 
import org.springframework.beans.factory.annotation.Required;
 
public class Camera {
    private int number;
 
    @Required
    public void setNumber(int number) {
        this.number = number;
    }
 
    @Override
    public String toString() {
        return "Camera [number=" + number + "]";
    }
}
 
cs

- setNumber메소드에 @Required 어노테이션 설정

 

1
2
3
4
<!-- @Required 어노테이션을 이용한 필수 프로퍼티 설정 -->
    <bean id="camera1" class="kr.spring.ch01.Camera">
         <property name="number" value="10"></property>
    </bean>
cs

- xml 설정파일에서 빈 설정

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package kr.spring.ch01;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class SpringMain {
    public static void main(String[] args) {
        //스프링 컨테이너 생성
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        //@Required 어노테이션을 이용한 필수 프로퍼티 설정
        Camera camera = (Camera)context.getBean("camera1");
        System.out.println(camera);
        context.close();
    }
}
 
cs

- 실행 클래스 생성

 

@Autowired 

- 타입을 이용해서 자동적으로 프로퍼티 값을 설정하는 어노테이션

- 해당 타입의 빈 객체가 존재하지 않거나 동일한 빈 객체가 두 개 이상 존재할 때 예외 발생

- @Autowired(required=false)로 지정하면 해당 타입의 빈 객체가 존재 하지않더라도 예외 발생하지 않는다.

- 생성자, 필드, 메서드에 지정 가능

- 필드에 지정 시, setter 메서드 생성안해도 자동으로 생성 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package kr.spring.ch02;
 
public class SmsSender {
 
}
 
 
package kr.spring.ch02;
 
import org.springframework.beans.factory.annotation.Autowired;
 
public class SystemMonitor {
    private int periodTime;
    private SmsSender sender;
    public void setPeriodTime(int periodTime) {
        this.periodTime = periodTime;
 
    @Autowired
    public void setSender(SmsSender sender) {
        this.sender = sender;
    }
    
    
    @Override
    public String toString() {
        return "SystemMonitor [periodTime=" + periodTime + ", sender=" + sender + "]";
    }
}
 
cs

- setSender에 @Autowired 어노테이션 지정

 

1
2
3
4
5
<!-- @Autowired 어노테이션을 이용한 의존 관계 자동 설정 -->
    <bean id="monitor" class="kr.spring.ch02.SystemMonitor">
        <property name="periodTime" value="30"></property>
    </bean>
    <bean id="sender" class="kr.spring.ch02.SmsSender"/>
cs

 

- xml 설정파일에서 빈 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package kr.spring.ch02;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class SpringMain {
    public static void main(String[] args) {
        //스프링 컨테이너 생성
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        SystemMonitor monitor = (SystemMonitor)context.getBean("monitor");
        System.out.println(monitor);
        
        context.close();
    }
}
cs

- 실행 클래스 생성

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package kr.spring.ch02;
 
import org.springframework.beans.factory.annotation.Autowired;
 
public class SystemMonitor {
    private int periodTime;
    @Autowired
    private SmsSender sender;
    public void setPeriodTime(int periodTime) {
        this.periodTime = periodTime;
    }
    @Override
    public String toString() {
        return "SystemMonitor [periodTime=" + periodTime + ", sender=" + sender + "]";
    }
}
cs

- sender 필드에 @Autowired어노테이션을 지정해도 제대로 동작 됨.

- 필드에 @Autowired어노테이션 지정시 setter메서드 구현안해도 된다!

 

@Qualifier

- @Autowired 어노테이션 이용하여 의존성 주입 시, 동일한 타입을 가진 빈 객체가 두개 이상이면 에러 발생!

- 이러한 문제를 해결하기 위해 사용하는 어노테이션이 @Qualifier

- @Qualifier 어노테이션은 사용할 의존 객체를 선택할 수 있게 해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package kr.spring.ch03;
 
public class Recorder {
 
}
 
package kr.spring.ch03;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
 
public class SystemMonitor2 {
    
    @Autowired
    //@Qualifier를 이용한 자동 설정 제한
    @Qualifier("main")
    private Recorder recorder;
 
    public void setRecorder(Recorder recorder) {
        this.recorder = recorder;
    }
 
    @Override
    public String toString() {
        return "SystemMonitor2 [recorder=" + recorder + "]";
    }
}
 
cs
1
2
3
4
5
6
7
<!-- @Qualifier 어노테이션을 이용한 자동 설정 제한 -->
    <bean id="systemMonitor" class="kr.spring.ch03.SystemMonitor2"/>
    <bean id="recorder1" class="kr.spring.ch03.Recorder">
        <qualifier value="main"/>
    </bean>
    
    <bean id="recorder2" class="kr.spring.ch03.Recorder"/>
cs

- kr.spring.ch03.Recorder 타입의 빈객체가 두개지만 qualifier value값을 지정하여 recorder1 빈 객체를 사용하도록 구현.

 

@Resource

- 이름으로 빈을 지정하는 어노테이션

- 필드, 메서드에만 사용가능

- @Resource : 빈의 이름과 프로퍼티명이 일치하면 의존 관계 설정

- @Resource(name="빈 객체의 이름") : 빈 객체의 이름 지정

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package kr.spring.ch04;
 
import javax.annotation.Resource;
 
public class HomeController {
    //빈의 이름과 프로퍼티명이 일치하면 의존 관계 설정
    @Resource
    private Camera camera2;
    
    //@Resource(name="빈 객체의 이름") 빈 객체의 이름 지정
    @Resource(name="cameraz")
    private Camera camera3;
    
    private Camera camera4;
    
    public void setCamera2(Camera camera2) {
        this.camera2 = camera2;
    }
    
    public void setCamera3(Camera camera3) {
        this.camera3 = camera3;
    }
    
    @Resource //메소드에도 사용가능.
    public void setCamera4(Camera camera4) {
        this.camera4 = camera4;
    }
 
    @Override
    public String toString() {
        return "HomeController [camera2=" + camera2 + ", camera3=" + camera3 + ", camera4=" + camera4 + "]";
    }
}
cs
1
2
3
4
5
<!-- @Resource 어노테이션는 빈 객체의 이름과 프로퍼티명이 일치하면 의존 관계 주입 -->
    <bean id="homeController" class="kr.spring.ch04.HomeController"/>
    <bean id="camera2" class="kr.spring.ch04.Camera" p:number="2"/>
    <bean id="cameraz" class="kr.spring.ch04.Camera" p:number="3"/>
    <bean id="camera4" class="kr.spring.ch04.Camera" p:number="4"/>
cs