2. 빈(Bean) 생성과 의존 관계 설정 □ 빈 생성 및 사용 ■ <bean>태그를 이용하여 생성할 빈 객체에 대한 정보 설정. ○ <bean> 태그 - 스프링 컨테이너가 관리할 빈 객체를 생성.
○ <bean> 태그 속성 - class : 생성할 빈 객체의 완전한 클래스 이름. - id : 스프링 컨테이너에서 생성된 객체를 구분하는데 사용되는 식별값. (name 속성을 사용해도 됨.) ■ 컨테이너로부터 빈 객체를 가져와 사용
- 식별값(id속성 또는 name 속성)을 getBean() 메서드에 전달해서 컨테이너로부터 객체를 가져올 수 있음. ■ 주의 사항 - <bean> 태그에 생성자와 관련된 정보(<constructor-arg>태그)를 명시하지 않았다면, 스프링은 파라미터가 없는 기본 생성자를 이용하여 객체를 생성. - 빈으로 사용할 클래스에 파라미터를 갖는 생성자를 정의했다면 기본 생성자도 함께 정의.
■ 빈 팩토리 메서드 ○ 생성자가 아닌 static 메서드를 이용하여 객체를 생성해야 하는 경우.
○ <bean> 태그에 factory-method 속성값으로 static 메서드를 지정 - 해당 메서드를 이용하여 빈을 생성하도록 설정.
- factory-method 속성을 지정하면 스프링 컨테이너는 생성자를 사용하지 않고 getInstance()메서드를 이용하여 ParserFactory 클래스의 객체를 구함. □ 의존 관계 설정 - 스프링 컨테이너에서 각 객체 간의 의존 관계도 XML 파일을 통해 명시 가능. ■ 생성자 방식 - 의존하는 객체를 생성자를 통해 전달 받음. ○ 의존 관계 ○ 생성자를 통해 의존하는 객체 전달 받기
● 특징 - 생성자를 통해서 의존하는 객체를 전달 받는 경우, <constructor-arg> 태그를 이용하여 의존하는 객체를 전달 할 수 있음. - 스프링은 <constructor-arg> 태그를 통해 전달된 값의 타입과 가장 근접한 파라미터를 갖는 생성자를 이용하여 객체를 생성. ● <constructor-arg> 태그를 이용한 생성자 방식의 설정
- <ref> 태그 대신에 <constructor-arg> 태그의 ref 속성을 사용하여 지정 가능.
- <ref> 태그 대신에 <value> 태그를 사용하여 값을 지정.
- 파라미터 개수 만큼 <constructor-arg> 태그 설정.
- 두 개의 생성자를 갖는 클래스 설정. ● 두 개의 생성자를 갖는 클래스
- Runnalbe 인터페이스를 상속받은 인터페이스.
- Runable 인터페이스를 구현한 클래스.
- executor2 빈을 생성할 때에는 Job을 전달받는 JobExecutor 생성자 사용. ○ 예제 - 두 개 이상의 생성자에서 기본 데이터 타입이나 래퍼 타입을 사용하여 생성하는 클래스 설정. ● 세 개의 생성자를 제공하는 클래스
- 스프링은 기본적으로 <value>에 전달된 값을 java.lang.String 타입으로 처리. 데이터 타입인 int인 생성자가 사용.
- <value> 태그뿐만 아니라 <constructor-arg> 태그에 type속성을 추가해도 동일한 동작을 함. ■ 프로퍼티 설정 방식 - setXXXX() 형태의 설정 메서드를 통해서 필요한 객체와 값을 전달 받음. (setXXXX() 형태의 메서드에서 프로퍼티의 이름은 XXXX가 됨.) ○ 설정 메서드를 통해 의존하는 객체 전달 받기
- 프로퍼티에 값을 전달. ● <property> 태그를 이용한 프로퍼티 값 설정
● 설정 메소드가 전달받는 값이 기본데이터 타입이나 String 타입일 경우 - <value> 태그를 사용하여 설정.
- XML 네임스페이스를 이용하면 <property> 태그를 사용하지 않고 좀 더 간단한 방법으로 프로퍼티의 값 설정 가능.
- 기본 데이터 타입 설정 : "p:프로퍼티이름" 속성을 사용하여 프로퍼티 값을 설정. - 빈 객체를 프로퍼티에 전달 : "p:프로퍼티이름-ref" 속성을 사용. ■ 임의 빈 객체 전달 - 식별 값을 갖지 않는 빈 객체를 생성해서 전달 가능. - <constructor-arg> 태그나 <property> 태그에 <bean> 태그를 중첩해서 사용.
□ 컬렉션 타입 프로퍼티 설정 ■ 컬렉션 타입을 입력받기 위한 스프링 태그 ■ List 타입과 배열 ○ 특징 - java.util.List 타입의 프로퍼티나 생성자 인자에 값 목록을 전달. - <list> 태그 사용 ○ 설정 방법
○ <list> 태그 - List에 저장된 객체 목록을 <ref> 태그를 이용하여 전달 받음. - <bean> 태그를 이용하여 식별 값을 갖지 않는 임의 객체를 List에 전달 가능. ○ List에 저장되는 값이 래퍼 타입이거나 String 타입일 경우 - <value> 태그를 사용하여 값 전달. - <list> 태그의 value-type 속성을 이용하여 List에 저장될 값들의 타입 명시 가능. - <value> 태그에 type 속성을 이용해도 List에 저장될 값들의 타입 명시 가능.
○ Generic 을 이용할 경우 - <list>나 <value>태그에 값의 타입을 명시하지 않아도 알맞게 타입을 변환.
○ List에 저장될 값을 표현하기 위해 사용 가능한 태그 - <ref> : 다른 스프링 빈 객체를 값으로 사용. - <bean> : 임의 빈 객체를 생성해서 값으로 사용. - <value> : 래퍼 타입이나 String을 값으로 사용. - <list>, <map>, <props>, <set> : 컬렉션 객체를 값으로 사용. - <null> : null 값을 값으로 사용. ○ 배열 - <list> 태그는 배열을 설정할 때도 사용.
- <list> 프로퍼티를 이용해서 값 전달. ■ Map 타입 ○ 특징 - java.util.Map 타입의 프로퍼티를 설정. - <map> 태그 사용. ○ 설정 방법
○ <entry> 태그 - 한 개의 <entry> 태그는 Map에 저장될 한 개의 <키, 값>을 표현. - 두 개의 자식 노드를 가지며, 각각 키와 값을 의미.
● <키태그>와 <값태그>에 지정할 수 있는 태그 - <ref> : 다른 스프링 빈 객체를 키로 사용. - <bean> : 임의 빈 객체를 생성해서 키로 사용. - <value> : 래퍼 타입이나 String을 키로 사용. - <list>, <map>, <props>, <set> : 컬렉션 객체를 키로 사용. - <null> : null 값을 키로 사용. ○ 예제
○ <entry> 태그의 속성을 이용하여 표현 - key, key-ref, value, value-ref 속성을 이용하여 <키, 값> 쌍을 좀 더 간단히 표현.
- 래퍼 타입이나 String 타입을 키나 값에 할당할 때에는 key 속성과 value 속성을 사용. - 빈 객체를 참조할 때에는 key-ref나 value-ref를 사용하여 설정. ○ 제러닉을 사용하지 않은 상태에서의 래퍼 타입의 키나 값 설정 - key-type 속성과 value-ref 속성을 이용하여 키와 값의 타입을 지정.
■ Properties 타입 ○ 특징 - java.util.Properties 타입의 프로퍼티 설정. (Properties 클래스는 환경변수나 설정 정보와 같이 상황에 따라 변경 되는 값을 저장하기 위한 용도로 사용.) - <props> 태그 이용. ○ 설정 방법
- 프로퍼티 이름 : "server"와 "connectionTimeout" - 프로퍼티의 값 : "192.168.1.100"과 ."5000" ○ <prop> 태그 - 한 개의 프로퍼티를 표현. - 프로퍼티의 이름은 key 속성을이용하여 입력. - 프로퍼티의 값은 <prop>태그의 몸체 내용을 이용하여 입력. - 한 개의 <prop> 태그는 Properties 태그에 한 개의 프로퍼티로 저장. (Properties.getProperty(String name)메서드를 이용하여 프로퍼티 값을 사용.)
■ Set 타입 ○ 특징 - java.util.Set 타입의 프로퍼티를 설정. - <set>태그를 이용. ○ 설정방법
○ <set> 태그 - 집합에 저장될 값을 <value> 태그나 <ref> 등의 태그를 이용하여 표시. - 래퍼 타입인 경우 <list>나 <map>의 경우처럼 value-type 속성을 이용하여 저장될 값의 타입을 명시. (<value>태그의 type 속성도 이용 가능.) ● 값을 지정할 수 있는 태그 - <ref> : 다른 스프링 빈 객체를 값으로 사용. - <bean> : 임의 빈 객체를 생성해서 값으로 사용. - <value> : 래퍼 타입이나 String을 값으로 사용. - <list>, <map>, <props>, <set> : 컬렉션 객체를 값으로 사용. - <null> : null 값을 값으로 사용. □ 의존 관계 자동 설정 ■ 빈 객체 간의 의존 관계 설정 - <property> 태그를 이용하여 설정.
- writeArticleService 빈 객체에서 articleDao 객체로의 하나의 의존 관계만을 포함. ■ 의존관계 자동 설정 - 의존하는 빈 객체의 타입이나 이름을 이용하여 의존 객체를 자동으로 설정할 수 있는 기능 제공. (설정 파일의 크기를 줄일 수 있음.) - 자동 설정과 관련하여 별도의 설정을 하지 않으면 자동 설정을 사용하지 않게 됨. ○ 자동설정 방식 - <bean> 태그에 autowire 속성을 값을 알맞게 지정.
- 기본 값 : default (default-autowire 속성의 값을 사용.) ○ 설정 파일에 포함된 모든 빈 객체에 대해서 특정 방식의 자동 설정 적용 - <beans> 태그의 default-autowire 속성의 값에 설정 방식을 지정.
● default-autowire 속성 - 기본 값 : no (자동 설정 하지 않음.) ■ 프로퍼티 이름을 이용한 의존 관계 자동 설정 ○ 특징 - byName 방식. - 프로퍼티 이름과 동일한 이름을 갖는 빈 객체를 프로퍼티 값으로 설정. ○ 설정 방법
- WriteArticleServiceImpl 클래스가 이름이 "articleDao"인 프로퍼티를 갖고 있다면, 이름이 "articleDao"인 빈 객체가 프로퍼티의 값으로 전달됨. ○ 단점 - 코드를 리팩토링해서 프로퍼티의 이름을 변경하는 경우 기존에 올바르게 동작하던 설정 파일이 올바르게 동작하지 않을 수도 있음. ■ 프로퍼티 타입을 이용한 의존 관계 자동 설정 ○ 특징 - byType 방식. - 프로퍼티의 타입과 동일한 타입을 갖는 빈 객체를 프로퍼티 값으로 설정. ○ 설정 방법
○ 단점 - 프로퍼티 타입과 동일한 타입의 빈 객체를 오직 1개만 설정 가능. (동일한 타입의 빈 객체가 두 개 이상 존재하게 되면 스프링은 어떤 빈 객체를 사용해야 할 지 알 수 없기 때문에 예외 발생.) ■ 생성자 파라미터 타입을 이용한 의존 관계 자동 설정 ○ 특징 - constructor 방식. - byType 방식처럼 타입을 이용하여 값을 전달. (차이점 : 프로퍼티가 아닌 생성자의 파라미터 타입 사용.) ○ 설정 방법
- WriteArticleServiceImpl(ArticleDao articleDao) 생성자의 첫 번째 파라미터에 ArticleDao 타입인 mysqlArticleDao 빈 객체가 전달됨.
- constructor 방식과 byType 방식을 사용하므로, 동일한 타입의 빈 객체를 2개 이상 정의 할 수 없음. ■ 자동 설정과 직접 설정의 혼합 ○ 특징 - 자동 설정과 함께 <property> 태그를 이용하여 해당 프로퍼티의 값을 직접 설정. ○ 설정 방법
- <null> 태그를 이용하여 프로퍼티의 값을 null로 설정.
설정.
■ 부모 빈으로부터 설정 정보 상속
○ commonMonitor 빈 생성.
[출처] 2. 스프링 DI (빈 생성과 의존 관계 설정)|작성자 외계인셩 |
'프로그래밍 > java' 카테고리의 다른 글
| poi cell Number 포맷 문자로 읽기 (0) | 2016.11.04 |
|---|---|
| 에러코드 정리 (0) | 2016.05.25 |
| 에자일 방법론 (0) | 2016.03.29 |
| java.lang.UnsupportedClassVersionError (0) | 2016.03.28 |
| java 윤년, 평년 구분하기 (0) | 2016.01.18 |
MyBatis-3-User-Guide.pdf