병갈이 블록

1-03. 애노테이션 의존 자동 연결 본문

IT(Old)/Spring 공부 기록

1-03. 애노테이션 의존 자동 연결

woojang 2017. 7. 22. 22:45

의존 자동 연결이란...

기존에 의존설정을 보자.

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를 참고하자.

Comments