콩에 의해 조립 노트
1. 소개
우월
1. XML 구성은 구성 항목의 수는, XML 구성이 너무 어려운 비 대한 프로젝트가 유지 될 수 있습니다 때, 줄일 수있다
2. 모두 XML 기능을 달성 할뿐만 아니라 자동으로 자동 조립을 사용하여 조립 할 수있는 기능을 제공하기 위해 더 강력한, 프로그램 원숭이 결정은 덜 할 필요가되며, 프로그램의 개발에 더 도움이 "합의 구성 "을 통해 개발 원칙
IOC는 콩의 두 가지 방법을 발견
구성 요소 스캔 : 방법에 의해 정의 된 자원은 Spring IoC 컨테이너 스캐닝하여 빈 어셈블리를 오는 패킷을 해당 할 수 있습니다.
자동 조립 : 주석의 정의에 의하면, 일부 종속성이 주석에 의해 같은 달성 될 수있다.
2 사용 어셈블리 콩 @Compoent
우리는 학생 수준의 변화에게 그것을하기 전에 만든 :
패키지 POJO; 수입 org.springframework.beans.factory.annotation.Value; 수입 org.springframework.stereotype.Component; @Component (값 = "student1" ) 공용 클래스 학생 { @Value ( "1" ) 의 INT ID; @Value ( "student_name_1" ) 문자열 이름; // getter 및 setter }
설명 :
@Component 노트 :
봄 IOC의 클래스는 빈 인스턴스로 스캔 할 것이다 나타내고, XML에 정의 된 콩 ID에 해당이 클래스 ID가 봄 속성을 대표하는의 값 : <콩 ID = "student1"클래스 = " pojo.Student는 "(student1") />, @Component로 축약 할 수있다 ", 또는 직접 기록 @Component, 쓰기,하지를 들어, Spring IoC 컨테이너는 ID로 이름에 클래스 이름을 기본값으로 사용합니다,하지만 첫 글자를 소문자, 구성 컨테이너에.
@Value 노트 :
XML 속성에 기록 된 값으로, 값으로 채워졌다하는 것은 동일합니다.
음, 그래서 우리는 우리가 콩을 만들려면, 단지 XML이 문장을 쓴 선언
< 빈 이름 = "student1 「클래스 ="pojo.Student " > < 속성 명 ="ID " 값 ="1 " /> < 속성 이름 ="이름 " 값 ="student_name_1 " /> </ 콩 >
하지만 지금 우리는 클래스를 선언하고, 봄 IOC는이 콩의 존재를 알 수 없어, 우리는 스프링의 IoC를 알려줄 수있는 StudentConfig 클래스를 사용할 수있는이 시간을 어떤 테스트를 수행 할 수 없습니다 :
패키지 POJO; 수입 org.springframework.context.annotation.ComponentScan; @ComponentScan 공공 클래스 StudentConfig { }
이 클래스는 논리없이 매우 간단하지만,이 점은주의해야한다 :
1, 같은 클래스와 학생 클래스 패키지 이름
2, ComponentScan 노트 @
대표 스캔은 스캔이 @Component 모든 주석을 POJO를 스캔, 현재 패키지의 기본 경로입니다.
그 결과, 우리는 IoC 컨테이너를 생성하는 봄의 IoC 컨테이너 봄 --AnnotationConfigApplicationContext을 통해 좋은 구현하는 클래스를 정의 할 수 있습니다 :
ApplicationContext의 컨텍스트 = 새로운 AnnotationConfigApplicationContext (StudentConfig. 클래스 ); 학생 학생 = (학생) context.getBean ( "student1", 학생. 클래스 ); student.printInformation ();
다음은 클래스 Spring IoC 컨테이너를 초기화하는 데 사용되는 AnnotationConfigApplicationContext을 볼 수 있습니다, 그것은 StudentConfig 구성 항목 클래스, 그래서 자원이 IoC 컨테이너를 생성, 주석에 따라 구성에 해당 해결하기 위해 IOC의 봄 것입니다.
명백한 단점 :
- @ComponentScan 노트를 들어, 그냥 패키지,하지만 더 자주 우리는 우리가 지정된 클래스를 스캔 할 수 있기를 바랍니다 자바 클래스를 검색
- 위의 예는 단순한 주사 값 테스트가, 객체가 주석을 통해 주입 될 수있다 발견되었다 @Value
@Component는 두 가지 구성 항목이 노트 :
basePackages : 패키지 또는 자바 어레이 패키지 구성 될 수 있음을 의미하는 복수를 사용하면서 기재 두 단어의 패키지이며, 스프링은 빈으로 구성 될 해당 패키지 서브 패키지에 기초하여 상기 검사를 구성 할 조립 올
basePackageClasses는 : 그것은 복수의 클래스를 구성 할 수 있다는 것을 의미 세 즉, 복합체의 용도로 이루어지는베이스, 패키지 및 클래스 구성, 스프링 기반 구성 곳 잡화, 해당 패킷 및 서브 패킷에 대해 구성된 콩 주사 어셈블리를 수행
이제 위의 두 가지 구성 항목을 확인 재건 StudentConfig 클래스 전에 작성 해보자 :
패키지 POJO; 수입 org.springframework.context.annotation.ComponentScan; @ComponentScan (basePackages = "POJO" ) 공개 수업 StudentConfig { } // ------------------ 【宇宙超级无敌分割线】 --------- --------- 패키지 POJO; 수입 org.springframework.context.annotation.ComponentScan; @ComponentScan (basePackageClasses = pojo.Student. 클래스 ) 공공 클래스 StudentConfig { }
basePackages [] 및 [] basePackageClasses 선택 질문의 경우 :
이 프로젝트는 [basePackages]을 사용하지 않는 시도, 그것을 사용하는 우선 순위를 부여하지만, 리모델링 프로젝트를 많이 필요 있도록 재구성 자주 반복적으로 패키지 이름을 수정해야하기 때문에 [BasePackages] 가독성이 더 나은 것 구성 및 IDE는 당신에게 힌트를주고, [] basePackageClasses 오류 메시지를 사용하지 않습니다.
3, 자동 조립 - @를 autowire
정의 : 봄이 자동으로 (작업 방법을 조립, 해당 Bean을 찾을 유형을 찾을 수 )
분석의 예 :
1. 패키지 [서비스] 아래 StudentService 인터페이스를 만들 :
패키지 서비스; 공중 인터페이스 StudentService { 공개 공극 printStudentInfo (); }
추신 : 사용하기 쉬운 인터페이스 봄은 좀 더 유연하게 할 수 있고, 분리를 달성하기 위해 정의 할 수 있도록 권장되는 방법입니다
2. 위의 인터페이스는 StudentServiceImp 구현 클래스를 만들 수 있습니다 :
@Component ( "studentService은") // 빈 인스턴스로 스캔이 클래스 (약칭, 괄호 안의 XML 구성 ID로 시간 상당) IOC의를 나타냅니다 공공 클래스 StudentServiceImp 구현 StudentService { @Autowired // 봄을 그는 빈 발견 조립 개인 학생 학생 = 널 (null) ; 공공 무효 printStudentlnfo () { 에서 System.out.println ( "학생 ID가 있습니다 :"+ student.getName ()); 에서 System.out.println ( "학생의 이름은 :"+ 학생. getName ()); } }
3. 테스트 클래스를 작성한다 :
// 단계 : 검토 StudentConfig 클래스 스프링 IoC를 스캔하는 방법을 알려 : 패키지 POJO를, 가져 오기 org.springframework.context.annotation.ComponentScan을, @ComponentScan을 (basePackages = { "POJO", "- 서비스" }) 공용 클래스 {StudentConfig은 } // 또는 스캔 할 수있는 XML 파일에 선언 할 수있다 <컨텍스트를 : 스캔 기지 - 구성 요소 패키지 = "POJO를"/> <컨텍스트 : 스캔 기지 - 구성 요소 패키지 = "- 서비스"/> // 첫번째 두 단계 : 테스트 클래스를 작성 : 패키지 페널티을위한 테스트, 가져 오기 org.springframework.context.ApplicationContext을, 가져 오기 org.springframework.context.annotation.AnnotationConfigApplicationContext; 수입 pojo.StudentConfig; 수입 service.StudentService; 수입 service.StudentServiceImp; 공용 클래스 TestSpring { 공공 정적 무효 메인 (문자열 []에 args) { // 通过注解的方式初始化스프링 IOC는容器 ApplicationContext의 컨텍스트 = 새로운 AnnotationConfigApplicationContext (StudentConfig. 클래스 ); StudentService studentService = context.getBean ( "studentService", StudentServiceImp. 클래스 ); studentService.printStudentInfo (); } }
요약 :
@Autowired 어노테이션은 콩의 위치를 결국 스프링의 IoC를 나타내는 다음 유형에 따라 자료를 찾아, 다음 주입.
프로세스 : 콩의 정의 - "초기화 콩 (스캔) -"콩은 속성에 따라 검색 Spring IoC 컨테이너의 요구 사항을 충족하는 데 필요한 - '주입의 요구 사항을 충족
질문 : 컨테이너가 실패를 찾고 될 수 IOC의 다음 예외가 발생합니다 (기본적으로 Spring IoC 컨테이너는 우리가이 필드에 주입하기 위해 해당 Bean을 찾을해야한다고 생각하지만, 때로는 반드시 로깅과 같이 필요가 없습니다)
해상도 : 필요한 구성 예를 @Autowired (필수 = 거짓)를 사용하여 변경이 IOC 컨테이너를 부여하지이 속성은 콩을 찾을 제어 될 수있다.
PS : @Autowired 어노테이션을 구성 할 수는없는 속성 만에,이 방법은 모든 사용자가 사용할 수있는 콩 봄 IOC의 지역 자원을 찾을 필요가 구성, 콩 일반 setter 메소드는 한마디로, 주입을 완료하는 데 사용할 수 있습니다