일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 경치
- D750
- af-s 18-35
- 푸른초장교회
- 50mm f/1.8G
- 85mm f/1.8G
- 출사
- 여름성경학교
- 18-35mm
- 카메라
- spring
- 렌즈
- 풍경
- nikkor
- 사진
- 하늘풍경
- AF-S 18-35mm
- AF-S NIKKOR 85mm f/1.8G
- Photo
- AF-S NIKKOR 50mm f/1.8G
- 일상
- camera
- 50mm
- 85mm 1.8g
- Nikon
- AF-S NIKKOR 18-35mm f/3.5-4.5G ED
- daily
- 니콘
- 푸초
- 꽃
- Today
- Total
병갈이 블록
1-03. 애노테이션 의존 자동 연결 본문
의존 자동 연결이란...
기존에 의존설정을 보자.
XML에서는 빈 객체를 id로 등록을 하로 프로퍼티에 필요한 빈 객체를 변수로 지정하는 설정을 하였다.
<bean id="num1" class="num.num.Num1">
</bean>
<bean id="num2" class="num.num.Num2">
<property name="result" ref="num1"/> //여기서 result라는 name은 클래스 내부에서는 실제로 setResult라는 이름이다.
<property
</bean>
// 이 코드는 Num1클래스 객체를 Num2 클래스객체의 setResult라는 메서드의 매개변수로 준다는 뜻이다.
// 즉, Num2.setResult(new Num1()) 과 같은 의미이다.
java코드에서는 @Bean으로 등록된 메서드를 다른 @Bean으로 등록된 메서드에서 직접 사용하여 초기화 작업을 수행하였다.
@Bean
public Num1 sendNum(){
return new Num1(); //Num1객체를 만들어 반환한다.
}
@Bean
public Num2 resultNum(){
Num2 num = new Num2(); //Num2객체를 만든다.
num.setResult(sendNum()); //setResult메서드에 뒤에서 빈으로 등록한 sendNum메서드를 매개변수로 넣어 결과적으로 Num1객체가 지정된다.
return num; //setResult메서드로 초기화가 끝난 num 객체(Num2클래스 객체)를 반환한다.
}
이 의존 설정을 자동으로 해결해주는 애노테이션이 있다.
** @Autowired와 @Resource를 사용하기 위한 XML 설정
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/util/spring-context.xsd">
<context:annotation-config/>
...
</beans>
//<context:annotation-config/>태그를 사용하기 위해 위 코드들을 추가해 준다.
//밑줄이 그어진 부분은 필요한 설정을 해야할 때 마다 필요한 문구로 바뀌는 부분이다.
1. @Autowired
- 이 녀셕은 주는걸 도와주는게 아니라 받는걸 도와준다. (그냥 이해하기 쉬우라고..)
- 지정 영역 : 생성자, 메서드, 변수에 가능하다.
- 메서드 : 지정한 메서드의 매개변수와 같은 자료형을 반환하는 빈을 연결시켜 준다.
즉, A자료형을 매개변수로 필요로 하는 메서드에 등록한다면,
A클래스가 등록된 빈을 자동으로 이 변수의 매개변수로 연결시켜준다.
- 변수 : 지정된 A자료형의 멤버변수가 있을 때, 별도의 set프로퍼티를 사용하지 않더라고
A자료형을 반환하는 빈의 결과물을 변수에 대입시켜준다.
- @Autowired가 적용된 메서드는 XML설정 시 프로퍼티 등록을 하지 않아도 된다.
- 속석으로 required가 있다. (기본값은 true)
: true 일 때 - 연결 가능한 빈이 없다면 예외 발생. ( required = true )
: false 일 때 - 연결 가능한 빈이 없어도 예외 발생하지 않음. ( required = false )
** 연결가능한 빈이 다수일때도 예외 발생.
1.2. @Qualifier , <qualifier>
- 연결시킬 빈에 한정자를 등록한다. (즉, 특정 빈과 연결시키는 역할)
- Java 설정시
@Bean
@Qualifier("A")
void Num1 number(){ return new Num1(); } // 이 빈을 A라는 이름을 가진 곳으로 보낸다.
- XML 설정시
<bean id="num1" class="num.num.Num1">
<qualifier value="A" /> // num1이라는 빈은 A라는 이름으로 @Autowired가 지정되 메서드에 연결된다.
....
</bean>
-----------------------------------------------------------------------------------------------------------------------------------------
1. 메서드로 연결.
@Autowired
@Qualifier("A")
void Num2 nom(Num1 num) { ...... } // 이 메서드의 매개변수에는 A라는 이름을 가진 빈이 오게된다.
2. 매개변수로 연결.
@Autowired
void Num2 nom( @Qualifier("A") Num1 num1, Nun3 num3) { ...... }
// 이 메서드의 num1이라는 매개변수에 A라는 이름을 가진 빈이 오게된다.
// 특정 매개변수를 지정가능.
// 즉, @Bean과 @Autoewired사이에서 특정 이름으로 다리를 놓는 역할을 한다.
2. @Resource
- @Autowired와 동일한 역할.
- 차이점.
@Autowired는 타입을 기준으로 연결.
@Resource는 이름을 기준으로 연결.
- name 속성을 가짐 -> @Resource( name = "bbb" )
** 연결되는 이름이 없으면 예외 발생.
** name속성 미 지정시 맴버변수라면 변수 이름, 메서드라면 메서드의 프로퍼티 이름을 기준으로 검색하게 된다.
3. @Inject
- @Name 애노테이션을 포함하고 있다.
- 먼저 jar파일을 개발환경에 추가해주어야 한다.
- 메이븐 의존 시 pom.xml 에 아래 코드 추가.
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
- 필드(멤버 변수), 메서드, 생성자에 적용 가능.
- @Inject, @Name 구성은 @Autowired, @Qualifier구성과 비슷한 역할을 한다.
- 차이점이라면 @Name 애노테이션에는 값으로 연결할 빈의 이름을 지정한다.
***** 이 애노테이션들은 @Configuration이 적용된 각각 다른 클래스간 빈의 전달을 가능하게 해준다.
***** 그리고 XML 설정 및 자바 설정에서 애노태이션의 검색 범위를 지정하거나 뺄 수 있다.
***** 이와 관련된 내용은 책 115p를 참고하자.
'IT(Old) > Spring 공부 기록' 카테고리의 다른 글
Spring DB접속 도전기!! (0) | 2017.07.26 |
---|---|
2-02. 스프링 MVC 간략 정리해보기. (0) | 2017.07.23 |
1-02.팩토리 방식의 스프링 빈 설정 (0) | 2017.07.20 |
1-01.스프링...기본적인 DI설정 (0) | 2017.07.20 |
2-01. Spring 기본 (0) | 2017.07.20 |