[제2 장] IoC 의 2.3 IoC 의 설정 사용 - 나 에 게 Spring 3 를 배 워 라.

원문 은 다음 과 같다.http://sishuok.com/forum/blogPost/list/2433.html
2.3.1  XML 구성
일반 프로필 구 조 는 다음 과 같 습 니 다.
   
   
   
   
  1. <beans>    
  2.     <import resource=”resource1.xml”/>    
  3.     <bean id=”bean1”class=””>bean>    
  4.     <bean id=”bean2”class=””>bean>    
  5. <bean name=”bean2”class=””>bean>    
  6.     <alias alias="bean3" name="bean2"/>    
  7.     <import resource=”resource2.xml”/>    
  8. beans>  
 

1. 라벨 은 주로 Bean 정 의 를 하 는 데 사 용 됩 니 다.
2. alias 는 Bean 의 별명 을 정의 하 는 데 사 용 됩 니 다.
3. import 는 다른 프로필 을 가 져 오 는 Bean 정의 에 사 용 됩 니 다. 이것 은 여러 개의 프로필 을 불 러 오기 위 한 것 입 니 다. 물론 이 프로필 들 을 하나의 배열 (new String [] {"config1. xml", config2. xml}) 로 구성 하여 applicationContext 에 여러 개의 프로필 을 불 러 올 수 있 습 니 다. 그것 은 사용자 가 결정 하기에 더욱 적합 합 니 다.이 두 가지 방식 은 모두 Bean Definition Reader 를 호출 하여 Bean 정 의 를 읽 는 것 으로 내부 실현 은 아무런 차이 가 없다.탭 은 아래 의 모든 위치 에 놓 을 수 있 으 며 순서 와 관계 가 없습니다.
2.3.2  Bean 의 설정
Spring IoC 용기 의 목적 은 Bean 을 관리 하 는 것 입 니 다. 이 Bean 들 은 설정 파일 의 Bean 정의 에 따라 만 들 것 입 니 다. Bean 정 의 는 용기 내부 에서 Bean Definition 대상 에 의 해 정의 되 는데 이 정 의 는 주로 다음 과 같은 정 보 를 포함 합 니 다.
● 전체 한정 클래스 (FQN): Bean 의 실현 클래스 를 정의 하 는 데 사용 합 니 다.
● Bean 행동 정의: 용기 에서 Bean 의 행동 을 정의 합 니 다.역할 영역 (단일 예, 원형 생 성), 타성 초기 화 여부 및 수명 주기 등 을 포함 합 니 다.
● 빈 생 성 방식 정의: 구조 기 를 통 해 빈 을 만 드 는 지 공장 방법 을 통 해 빈 을 만 드 는 지 설명 한다.
● 빈 간 관계 정의: 즉, 다른 bean 에 대한 인용, 즉 관계 정의 에 의존 하 는 것 이다. 이러한 인용 bean 은 동료 bean 또는 bean 에 의존 하 는 것, 즉 주입 에 의존 하 는 것 이 라 고 할 수 있다.
Bean 정 의 는 '전 한정 클래스 이름' 만 구조 기 나 정적 공장 방법 으로 bean 을 예화 할 때 필수 적 이 고 다른 것 은 모두 선택 할 수 있 는 정의 입 니 다.Spring 은 설정 방식 으로 만 Bean 을 만 들 수 있 습 니까?물론 아 닙 니 다. 일부 Singleton Bean Registry 인터페이스 구현 클래스 도 비 Bean Factory 가 만 든 기 존 사용자 대상 을 용기 에 등록 할 수 있 습 니 다. 이 대상 들 은 반드시 공유 해 야 합 니 다. 예 를 들 어 Default Listable Bean Factory 의 register Singleton () 방법 을 사용 해 야 합 니 다.그러나 메타 데이터 정 의 를 사용 하 는 것 을 권장 합 니 다.
2.3.3    Bean 의 이름
       각 Bean 은 하나 이상 의 id (또는 식별 자 또는 이름) 를 가 질 수 있 습 니 다. 여기 서 우 리 는 첫 번 째 id 를 '식별 자' 라 고 부 르 고 나머지 id 는 '별명' 이 라 고 부 릅 니 다.이 id 들 은 IoC 용기 에서 유일 해 야 합 니 다.어떻게 Bean 에 id 를 지정 합 니까? 다음 과 같은 몇 가지 방법 이 있 습 니 다.
하나  id 를 지정 하지 않 고 필요 한 모든 한정 클래스 만 설정 합 니 다. IoC 용기 에서 표 지 를 만 듭 니 다. 클 라 이언 트 는 인터페이스 'T getBean (Class required Type)' 을 통 해 Bean 을 가 져 와 야 합 니 다.
   
   
   
   
  1. <bean class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/>    (1)   

테스트 코드 세 션 은 다음 과 같 습 니 다:
   
   
   
   
  1. @Test    
  2. public void test1() {    
  3. BeanFactory beanFactory =    
  4.    new ClassPathXmlApplicationContext("chapter2/namingbean1.xml");    
  5.     // bean    
  6.     HelloApi helloApi = beanFactory.getBean(HelloApi.class);    
  7.     helloApi.sayHello();    
  8. }   

 2. id 를 지정 하려 면 Ioc 용기 에서 유일 해 야 합 니 다.
   
   
   
   
  1. <bean id=” bean” class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/>    (2)  

테스트 코드 세 션 은 다음 과 같 습 니 다:
   
   
   
   
  1. @Test    
  2. public void test2() {    
  3. BeanFactory beanFactory = new ClassPathXmlApplicationContext("chapter2/namingbean2.xml");    
  4. // id bean    
  5.     HelloApi bean = beanFactory.getBean("bean", HelloApi.class);    
  6.     bean.sayHello();    
  7. }   

3. name 을 지정 합 니 다. 그러면 name 은 '식별 자' 입 니 다. Ioc 용기 에서 유일 해 야 합 니 다.
   
   
   
   
  1. <bean name=” bean” class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/> (3)   

테스트 코드 세 션 은 다음 과 같 습 니 다:
   
   
   
   
  1. @Test    
  2. public void test3() {    
  3.     BeanFactory beanFactory = new ClassPathXmlApplicationContext("chapter2/namingbean3.xml");    
  4.     // name bean    
  5. HelloApi bean = beanFactory.getBean("bean", HelloApi.class);    
  6. bean.sayHello();    
  7. }   

4. id 와 name 을 지정 합 니 다. id 는 식별 자 이 고 name 은 별명 입 니 다. 반드시 Ioc 용기 에서 유일 해 야 합 니 다.
   
   
   
   
  1. <bean id=”bean1”name=”alias1”    
  2. class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/>    
  3.     
  4. <bean id="bean3" name="bean3" class="cn.javass.spring.chapter2.helloworld.HelloImpl"/>   (4)   

테스트 코드 세 션 은 다음 과 같 습 니 다:
   
   
   
   
  1. public void test4() {    
  2. BeanFactory beanFactory = new ClassPathXmlApplicationContext("chapter2/namingbean4.xml");    
  3.     // id bean    
  4.     HelloApi bean1 = beanFactory.getBean("bean1", HelloApi.class);    
  5.     bean1.sayHello();    
  6.     // bean    
  7.     HelloApi bean2 = beanFactory.getBean("alias1", HelloApi.class);    
  8.     bean2.sayHello();    
  9.     // id bean    
  10.     HelloApi bean3 = beanFactory.getBean("bean3", HelloApi.class);    
  11.     bean3.sayHello();    
  12.     String[] bean3Alias = beanFactory.getAliases("bean3");    
  13.     // id , IoC     
  14.     Assert.assertEquals(0, bean3Alias.length);    
  15. }   

5. 여러 개의 name 을 지정 하고 여러 개의 name 은 ',', ',', '분할' 을 사용 합 니 다. 첫 번 째 는 식별 자 로 사용 되 고 다른 (alias 1, alias 2, alias 3) 는 별명 이 며 모든 식별 자 는 Ioc 용기 에서 유일 해 야 합 니 다.
   
   
   
   
  1. <bean name=” bean1;alias11,alias12;alias13 alias14”    
  2.       class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/>       
  3.     
  4. <bean id="bean2" name="alias21;alias22"    
  5. class="cn.javass.spring.chapter2.helloworld.HelloImpl"/>      (5)    

  테스트 코드 세 션 은 다음 과 같 습 니 다:
   
   
   
   
  1. @Test    
  2. public void test5() {    
  3. BeanFactory beanFactory =    
  4. new ClassPathXmlApplicationContext("chapter2/namingbean5.xml");    
  5.     //1 id bean    
  6.     HelloApi bean1 = beanFactory.getBean("bean1", HelloApi.class);    
  7.     bean1.sayHello();    
  8.     //2 bean    
  9.     HelloApi alias11 = beanFactory.getBean("alias11", HelloApi.class);    
  10.     alias11.sayHello();    
  11.     //3            
  12.     String[] bean1Alias = beanFactory.getAliases("bean1");    
  13.     System.out.println("=======namingbean5.xml bean1  ========");    
  14.     for(String alias : bean1Alias) {    
  15.         System.out.println(alias);    
  16.     }    
  17.     Assert.assertEquals(4, bean1Alias.length);    
  18.     // id bean    
  19.     HelloApi bean2 = beanFactory.getBean("bean2", HelloApi.class);    
  20.     bean2.sayHello();    
  21.     //2 bean    
  22.     HelloApi alias21 = beanFactory.getBean("alias21", HelloApi.class);    
  23.     alias21.sayHello();    
  24.     //     
  25.     String[] bean2Alias = beanFactory.getAliases("bean2");    
  26.     System.out.println("=======namingbean5.xml bean2  ========");    
  27.     for(String alias : bean2Alias) {    
  28.         System.out.println(alias);    
  29.     }       
  30.     Assert.assertEquals(2, bean2Alias.length);       
  31. }   

6. 라벨 로 별명 을 지정 하고 별명 도 IoC 용기 에서 유일 해 야 합 니 다.
   
   
   
   
  1. <bean name="bean" class="cn.javass.spring.chapter2.helloworld.HelloImpl"/>    
  2. <alias alias="alias1" name="bean"/>    
  3. <alias alias="alias2" name="bean"/>     (6)    

 테스트 코드 세 션 은 다음 과 같 습 니 다:
   
   
   
   
  1. @Test    
  2. public void test6() {    
  3. BeanFactory beanFactory =    
  4. new ClassPathXmlApplicationContext("chapter2/namingbean6.xml");    
  5.     // id bean    
  6.     HelloApi bean = beanFactory.getBean("bean", HelloApi.class);    
  7.    bean.sayHello();    
  8.     // bean    
  9.     HelloApi alias1 = beanFactory.getBean("alias1", HelloApi.class);    
  10.     alias1.sayHello();    
  11.     HelloApi alias2 = beanFactory.getBean("alias2", HelloApi.class);    
  12.     alias2.sayHello();    
  13.     String[] beanAlias = beanFactory.getAliases("bean");    
  14.     System.out.println("=======namingbean6.xml bean  ========");    
  15.     for(String alias : beanAlias) {    
  16.         System.out.println(alias);    
  17.    }    
  18.    System.out.println("=======namingbean6.xml bean  ========");    
  19.     Assert.assertEquals(2, beanAlias.length);    
  20.  }   

 
이상 의 테스트 코드 는 cn. 자바 ss. spring. chapter 2. NamingBeanTest. 자바 파일 에 있 습 니 다.
정의 로 볼 때 name 이나 id 가 그들 중 하 나 를 지정 할 때 '식별 자' 로 지정 한다 면 왜 id 와 name 이 동시에 존재 합 니까?이것 은 XML 기반 설정 메타 데 이 터 를 사용 할 때 XML 에서 id 는 진정한 XML id 속성 이기 때문에 다른 정의 로 이 id 를 참조 할 때 id 의 장점 을 나 타 냅 니 다. XML 해상도 기 를 이용 하여 인 용 된 이 id 가 존재 하 는 지 검증 하여 존재 하지 않 는 bean 을 인 용 했 는 지, name 을 사용 할 수 있 습 니 다.bean 을 진정 으로 사용 할 때 만 존재 하지 않 는 bean 을 참조 하 는 것 을 발견 할 수 있 습 니 다.
 ● Bean 명명 약정: Bean 의 명명 은 XML 명명 규범 에 따 르 지만 자바 의 명명 규범 에 부합 되 는 것 이 좋 습 니 다. '자모, 숫자, 밑줄 로' 구성 되 고 좋 은 명명 습관 을 길러 야 합 니 다. 예 를 들 어 '낙타 봉 식', 즉 첫 번 째 단어 이니셜 부터 두 번 째 단어 부터 이니셜 대문자 로 시작 하면 가 독성 을 높 일 수 있 습 니 다.
2.3.4  실례 화 Bean
Spring IoC 용 기 는 Bean 을 어떻게 예화 합 니까? 전통 적 인 응용 프로그램 은 new 와 반사 방식 으로 Bean 을 예화 할 수 있 습 니 다. Spring IoC 용 기 는 Bean 정의 에 있 는 설정 메타 데이터 에 따라 반사 체 제 를 사용 하여 Bean 을 만들어 야 합 니 다. Spring IoC 용기 에 서 는 Bean 정의 에 따라 Bean 을 만 드 는 데 다음 과 같은 몇 가지 방식 이 있 습 니 다.
1. 구조 기 를 사용 하여 빈 을 예화 합 니 다. 이것 은 가장 간단 한 방식 입 니 다. Spring IoC 용 기 는 기본 빈 구조 기 를 사용 할 수도 있 고 매개 변수 구조 기 두 가지 방식 으로 빈 을 만 들 수도 있 습 니 다. 예 를 들 어 다음 과 같은 방식 으로 만 들 빈 형식 을 지정 합 니 다.
빈 구조 기 를 사용 하여 정 의 를 내 립 니 다. 이 방식 을 사용 하면 class 속성 이 지정 한 클래스 에 빈 구조 기 가 있어 야 합 니 다.
   
   
   
   
  1. <bean name="bean1" class="cn.javass.spring.chapter2.HelloImpl2"/>   

매개 변수 구조 기 를 사용 하여 정의 할 수 있 습 니 다. 이 방식 을 사용 하면 < constructor - arg > 탭 을 사용 하여 구조 기 매개 변수 값 을 지정 할 수 있 습 니 다. 그 중에서 index 는 위 치 를 표시 하고 value 는 상수 값 을 표시 하 며 인용 도 지정 할 수 있 습 니 다. 지정 인용 은 ref 를 사용 하여 다른 Bean 정 의 를 참조 할 수 있 습 니 다. 나중에 상세 하 게 소개 할 것 입 니 다.
   
   
   
   
  1. <bean name="bean2" class="cn.javass.spring.chapter2.HelloImpl2">    
  2.     
  3.      <constructor-arg index="0" value="Hello Spring!"/>    
  4. bean>   

어떻게 설정 하 는 지 알 겠 습 니 다. 예 를 들 어 실천 해 봅 시다.
(1) Bean class (HelloImpl 2. java) 를 준비 합 니 다. 이 종 류 는 빈 구조 기와 파 라 메 트릭 이 있 습 니 다.
   
   
   
   
  1.  package cn.javass.spring.chapter2;     
  2.   public class HelloImpl2 implements HelloApi {    
  3.       private String message;    
  4.       public HelloImpl2() {    
  5.            this.message = "Hello World!";    
  6.       }    
  7.       Public HelloImpl2(String message) {    
  8.            this.message = message;    
  9.       }    
  10.       @Override    
  11.       public void sayHello() {    
  12.            System.out.println(message);    
  13.       }    
  14. }   

(2) 설정 파일 (resources / chapter 2 / instantiatingBean. xml) 에서 Bean 정 의 를 설정 합 니 다. 다음 과 같 습 니 다.
   
   
   
   
  1.     
  2. <bean name="bean1" class="cn.javass.spring.chapter2.HelloImpl2"/>    
  3.         
  4.      
  5. <bean name="bean2" class="cn.javass.spring.chapter2.HelloImpl2">    
  6.     
  7.     <constructor-arg index="0" value="Hello Spring!"/>    
  8. bean>   

(3) 설정 이 완료 되 었 습 니 다. 테스트 코드 (Instantiating Container Test) 를 써 서 작업 여 부 를 봅 시다.
   
   
   
   
  1. @Test    
  2. public void testInstantiatingBeanByConstructor() {    
  3.        //     
  4.       BeanFactory beanFactory =    
  5. new ClassPathXmlApplicationContext("chapter2/instantiatingBean.xml");    
  6.        HelloApi bean1 = beanFactory.getBean("bean1", HelloApi.class);    
  7.        bean1.sayHello();    
  8.        HelloApi bean2 = beanFactory.getBean("bean2", HelloApi.class);    
  9.        bean2.sayHello();    
  10. }   

2. 정적 공장 방식 을 사용 하여 Bean 을 예화 합 니 다. 이 방식 을 사용 하면 필요 한 class 속성 을 지정 하 는 동시에 factory - method 속성 을 지정 하여 빈 을 예화 하 는 방법 을 지정 해 야 합 니 다. 또한 정적 공장 방법 을 사용 하여 방법 적 인 파 라 메 터 를 지정 할 수 있 습 니 다. spring IoC 용 기 는 이 속성 이 지정 한 방법 으로 Bean 을 가 져 올 것 입 니 다. 설정 은 다음 과 같 습 니 다.
(1) 정적 공장 코드 부터 살 펴 보 자! HelloApiStaticFactory:
   
   
   
   
  1. public class HelloApiStaticFactory {    
  2.     //     
  3.        public static HelloApi newInstance(String message) {    
  4.               // Bean     
  5.            return new HelloImpl2(message);    
  6.        }    
  7. }   

(2) 정적 공장 이 작성 되 었 습 니 다. 설정 파일 (resources / chapter 2 / instantiatingBean. xml) 에 Bean 정 의 를 설정 합 니 다.
   
   
   
   
  1.     
  2. <bean id="bean3" class="cn.javass.spring.chapter2.HelloApiStaticFactory" factory-method="newInstance">    
  3.      <constructor-arg index="0" value="Hello Spring!"/>    
  4. bean>   

(3) 설정 이 완료 되 었 습 니 다. 테스트 코드 를 써 서 테스트 해 보 세 요. InstantiatingBeanTest:
   
   
   
   
  1. @Test    
  2. public void testInstantiatingBeanByStaticFactory() {    
  3.        //     
  4.        BeanFactory beanFactory =    
  5. new ClassPathXmlApplicationContext("chaper2/instantiatingBean.xml");    
  6.        HelloApi bean3 = beanFactory.getBean("bean3", HelloApi.class);    
  7.        bean3.sayHello();    
  8. }   

3. 인 스 턴 스 공장 방법 을 사용 하여 Bean 을 예화 합 니 다. 이런 방식 으로 class 속성 을 지정 할 수 없습니다. 이때 factory - bean 속성 을 사용 하여 공장 Bean, factory - method 속성 을 예화 Bean 의 방법 을 지정 해 야 합 니 다. 또한 인 스 턴 스 공장 방법 을 사용 하여 방법 적 인 파 라 메 터 를 지정 할 수 있 습 니 다. 방식 은 구조 기 를 사용 하 는 방식 과 마찬가지 로 다음 과 같이 설정 합 니 다.
(1) 실례 공장 클래스 코드 (HelloApiInstanceFactory. java) 는 다음 과 같다.
   
   
   
   
  1. package cn.javass.spring.chapter2;    
  2. public class HelloApiInstanceFactory {    
  3. public HelloApi newInstance(String message) {    
  4.           return new HelloImpl2(message);    
  5.    }    
  6. }   

(2) 설정 파일 (resources / chapter 2 / instantiatingBean. xml) 에서 Bean 정 의 를 설정 합 니 다.
   
   
   
   
  1. >    
  2. <bean id="beanInstanceFactory"    
  3. class="cn.javass.spring.chapter2.HelloApiInstanceFactory"/>    
  4. >    
  5. <bean id="bean4" factory-bean="beanInstanceFactory"    
  6.       factory-method="newInstance">    
  7.   <constructor-arg index="0" value="Hello Spring!">constructor-arg>    
  8. bean>   

(3) 테스트 코드 InstantiatingBeanTest:
   
   
   
   
  1. @Test    
  2. public void testInstantiatingBeanByInstanceFactory() {    
  3. //     
  4.        BeanFactory beanFactory =    
  5. new ClassPathXmlApplicationContext("chapter2/instantiatingBean.xml");    
  6.        HelloApi bean4 = beanFactory.getBean("bean4", HelloApi.class);    
  7.        bean4.sayHello();    
  8. }   

 위의 예 를 통 해 우 리 는 Bean 을 어떻게 예화 하 는 지 기본적으로 알 게 되 었 습 니 다. 여러분 은 알 고 있 습 니까? 이 세 가지 방식 은 설정 이 다 를 뿐, 획득 방식 으로 볼 때 전혀 다 르 지 않 습 니 다. 이것 도 Spring IoC 의 매력 입 니 다. Spring IoC 가 Bean 을 만들어 줄 것 입 니 다. 우 리 는 사용 만 하면 됩 니 다. 아주 간단 하지 않 습 니까?
2.3.5  작은 매듭
       여기 서 우 리 는 Spring IoC 의 기본 적 인 부분 에 대해 이 야 기 를 끝 냈 습 니 다. IoC 용기 개념, 용기 실례 화, Bean 배치, 명명 및 실례 화, Bean 획득 등 을 포함 합 니 다. 지금까지 우 리 는 Bean 간 의 관 계 를 간단 한 실례 화 할 수 밖 에 없다 는 것 을 알 고 있 는 지 모 르 겠 습 니 다. 다음 장 에 서 는 Bean 간 의 관 계 를 설정 하 는 장, 즉 의존 하 는 것 입 니 다.주입

좋은 웹페이지 즐겨찾기