준비 작업
- @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 |
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring]AOP : XML 스키마 사용, 어노테이션 사용 (0) | 2021.10.02 |
---|---|
[Spring]@Component 자동 스캔 (0) | 2021.10.02 |
[Spring]의존 관계 주입(Dependency Injection) : 의존 관계 자동 설정(byName, byType) (0) | 2021.10.02 |
[Spring]의존 관계 주입(Dependency Injection) : 콜렉션 타입 프로퍼티 설정 (0) | 2021.10.02 |
[Spring]의존 관계 주입(Dependency Injection) : 프로퍼티 방식으로 주입 받기 (0) | 2021.10.02 |