1. 스프링 구성 개요
1.1. 개요
스프링 컨테이너는 XML 구성, Java 주석 및 스프링 주석의 Bean 구성 정보를 읽어 Bean 정의 레지스트리를 형성합니다.
콩에 따라 콩을 인스턴스화하기 위해 레지스트리를 정의하십시오.
Bean 인스턴스를 Bean 캐시 풀에 넣으십시오.
응용 프로그램은 콩을 사용합니다.
1.2. XML 기반 구성
(1) XML 파일의 개요
xmlns---------------------------------------------------------------------------------------------------------------------------
xmlns : xsi ----------- 표준 네임 스페이스, 사용자 정의 네임 스페이스의 스키마 파일을 지정하는 데 사용됩니다.
xmlns : xxx = "aaaaa"------------ 사용자 정의 네임 스페이스, xxx는 별명이고 다음 값 AAAA는 전체 이름입니다.
xsi : schemalocation -------- 각 네임 스페이스에 대한 특정 스키마 파일을 지정합니다. 형식 : 네임 스페이스 전체 이름 파일 주소. . . 공간과 분리됩니다
2. 기본 콩 구성
2.1. 콩 이름 지정
(1) ID와 이름은 여러 이름을 지정할 수 있으며 이름은 쉼표, 세미콜론 또는 공백으로 분리됩니다.
<beanname = "#car, 123, $ car"class = "xxxxxxxxx">
사용자는 GetBean ( "#Car"), GetBean ( "123"), GetBean ( "$ Car")에 GetBean을 사용할 수 있습니다.
(2) ID 및 이름 속성이 지정되지 않은 경우 Spring
(3) 익명의 콩이 여러 개있는 경우, 클래스의 완전히 자격을 갖춘 이름이 XXX라고 가정 할 때 ID와 이름이 지정되지 않은 <bean/>가 없습니다.
그런 다음 getbean ( "xxx")을 사용하여 첫 번째 콩을 가져 와서 getbean ( "xxx#1")을 사용하여 두 번째 콩을 가져 와서 getbean ( "xxx#2")을 사용하여 세 번째 콩을 가져옵니다.
3. 의존성 주입
3.1. 속성 주입
(1) 속성 주입은 Bean이 기본 생성자를 제공하고 주입 해야하는 속성에 대한 세터 방법을 제공해야합니다. Spring은 기본 생성자를 호출하여 Bean 객체를 인스턴스화 한 다음 Setter 메소드를 호출하여 반사를 통해 속성 값을 주입합니다.
(2) 스프링은 Bean에 해당 세터 방법이 있는지 여부를 확인하며 Bean에 해당 속성 변수가 있는지 여부에 대한 요구 사항이 없습니다.
(3) 속성 명명에 대한 Javabean의 특수 사양 : 변수의 처음 2 글자는 모두 대문자 또는 모든 소문자입니다.
3.2. 생성자 주입
(1) 생성자 매개 변수의 구성 순서는 구성 결과에 영향을 미치지 않습니다. Spring의 구성 파일은 요소 레이블의 순서와 관련이없는 정책을 채택합니다. 이 전략은 구성 정보의 확실성을 어느 정도 보장 할 수 있습니다.
(2) 인덱스 별 매개 변수를 일치시킵니다
생성자의 입력 매개 변수 유형이 동일하면 매개 변수의 순차적 인덱스를 지정해야합니다. 그렇지 않으면 해당 관계를 결정할 수 없습니다. 좋다:
<생성자-argindex = "0"value = "xxxxxx"> <생성자-argindex = "1"value = "xxxxxx">
인덱스는 0에서 시작합니다.
(3) 원형 의존성 문제
2 개의 Bean의 생성자 구성이 상대방에 의존하면 스레드 교착 문제가 발생합니다.
해결책은 생성자 주입을 속성 주입으로 변경하는 것입니다.
3.3. 공장 방법 주입
(1) 비 정적 공장 방법
공장 방법은 정적이 아니기 때문에 먼저 공장 클래스의 인스턴스 Bean을 만들고 공장을 사용하여 참조해야합니다.
<beanid = "CarFactory"class = "Factory Class"/> <beanid = "car5"factory-bean = "Carfactory"Factory-Method = "CreateCar"/>
(2) 정적 공장 방법
<beanid = "car5"class = "Factory Class"Factory-Method = "CreateCar"/>
3.4. 주입 매개 변수에 대한 자세한 설명
(1) XML의 특수 문자 5 개
| 특별한 기호 | 탈출 시퀀스 | 특별한 기호 | 탈출 시퀀스 |
| < | < | "" " | |
| > | > | ' | ' |
| &이었다. | &이었다. |
(2) <! [cdata []]>
<! [cdata []]의 목적은 XML 파서가 태그의 문자열을 일반 텍스트로 취급하도록하는 것입니다.
(3) <null/> 태그를 사용하여 널 값을 주입하십시오
(4) 계단식 속성
<beanid = "parent"class = "xxxxxxx"> <propertyname = "child.xxx"value = "종속성 객체의 속성 값"/> </bean>
Spring3.0 이전에 의존성 객체 자식을 먼저 인스턴스화해야합니다. 그렇지 않으면 예외가 발생합니다. Spring3.0 이후 인스턴스화를 표시 할 필요가 없습니다. 스프링 컨테이너는 종속성 객체를 자동으로 인스턴스화합니다.
(5) 수집 병합
<setmerge = "true"/>
상위 클래스의 수집 요소를 병합하기 위해 서브 클래스에서 일반적으로 사용
(6) Util 네임 스페이스를 통해 수집 유형 Bean을 구성하십시오
수집 유형 속성 대신 수집 유형 Bean을 구성하려면 Util 네임 스페이스를 통해 구성 할 수 있습니다.
3.5. 자동 조립
(1) <bean/> 요소는 Autowire 유형을 지정하는 속성을 제공합니다.
3.6. 방법 주입
우리가 프로토 타입 콩을 싱글 톤 모드 콩에 주입하고 우리가 호출 할 때마다 새 콩을 반환하기를 희망한다면, 관련 콩을 주입하는 싱글 톤 모드 콩의 동작이 한 번만 발생하기 때문에 전통적인 주입 방법을 사용할 수 없습니다.
(1) 선택적 솔루션은 호스트 Bean이 BeanFactoryAware 인터페이스를 구현할 수 있도록하여 호스트 Bean이 컨테이너의 참조에 액세스하여 Get 메소드를 수정하고 컨테이너의 컨테이너의 참조에 액세스 할 수 있도록하는 것입니다.
factory.getBean ( "의존 Bean") 방법, 매번 최신 콩을 얻을 수 있습니다.
(2) 위의 방법은 우리의 코드와 스프링을 결합시켜 최악의 방법이며 메소드 주입을 통해 분리 할 수 있습니다.
인터페이스를 정의하고 인터페이스에서 종속 콩을 얻기 위해 추상 방법을 정의하면됩니다. 스프링 구성은 다음과 같습니다.
<beanid = "car"class = "의존 Bean"/> <beanid = "host"class = "interface bean"> <Xookup-methodname = "getcar"bean = "car"/</bean>
Lookup-Method 요소 태그는 인터페이스 빈의 getCar ()에 대한 동적 구현을 제공합니다. 메소드 주입의 구현은 주로 CGLIB 패키지의 동적 작동 바이트 코드 기술에 의존합니다.
3.7. 방법 교체
Bean2를 사용하여 Bean2를 MethodReplacer 인터페이스를 구현 해야하는 경우 Bean1의 GetCar 메소드를 대체하고 구성은 다음과 같습니다.
<beanid = "bean1"class = "aaaaaaaaaa"> <대체 methodname = "getcar"replacer = "bean2"/> </bean> <beanid = "bean2"class = "bbbbbbbbbb"/>
4. <ean>의 관계
4.1. 계승
반복적 인 정의를 피하기 위해 부모 빈의 구성은 서브 클래스에 의해 상속 될 수 있습니다. 구성은 다음과 같습니다.
<beanid = "parent bean"class = "aaaaaa"actract = "true"/> <beanid = "child bean"class = "bbbbbb">
서브 클래스는 상위 클래스의 구성을 무시할 수 있습니다. 상위 클래스의 Abstract = "True"가 지정되지 않으면 부모 Bean이 인스턴스화됩니다.
4.2. 의존
일부 콩은 다른 콩에 의존하고 다른 콩은 호스트 콩을 인스턴스화하기 전에 인스턴스화되어야합니다. Spring은 종속 속성을 제공하고 종속성 Bean이 다음과 같이 먼저 인스턴스화되었음을 지정합니다.
<beanid = "host"class = "aaaaaa"종속 = "b1"/> <beanid = "b1"class = "bbbbbbbb"/>
사전 의존 콩이 여러 개있는 경우 쉼표, 공간 또는 세미콜론으로 콩 이름을 만들 수 있습니다.
4.3. 콩 범위
(1) 스프링 컨테이너는 모든 콩이 시작되면 모든 콩을 인스턴스화합니다. 미리 인스턴스를 원하지 않으면 <bean/>의 Lazy-Init = "True"속성은 지연된 인스턴스화를 제어 할 수 있지만, 사전에 인스턴스화 해야하는 다른 콩에 의해 콩이 참조되면 Spring은 지연된 인스턴스화 설정을 무시합니다.
(2) 웹 응용 프로그램 관련 범위
사용자가 요청, 세션 및 글로벌 세션 범위를 사용하는 경우 웹 컨테이너에서 추가 구성을 먼저 수행해야합니다.
하위 버전의 웹 컨테이너 (Servlet 2.3 이전)에서 HTTP 요청 필터 구성을 사용할 수 있습니다.
<filter> <filter-name> requestContextFilter </filter-name> <filter-class> org.springframework.web.filter.requestContextFilter </filter-class> </filter> <Filter-name> requestContextFilter </filter-name> </*/*/*</url-pattern>
더 높은 버전의 웹 컨테이너에서는 HTTP 요청 리스너를 사용하여 구성 할 수 있습니다.
<Leater> <Leater-Class> org.springframework.web.context.request.requestContextListener </Leater-Class> </liareer>
(3) 범위 의존성 문제
웹 스코핑 콩을 싱글 톤 또는 프로토 타입 콩에 주입 할 때는 AOP를 사용하십시오.
<bean id = "web1"scope = "request"> <aop : scoped-proxy/> </bean> <bean id = "singleton1"> <property name = "z1"ref = "web1"/> </bean>
4.4. FactoryBean
일반적으로 Spring은 <bean/>의 클래스 속성을 사용하여 반사 메커니즘을 통해 구현 클래스 인스턴스티브 Bean을 지정합니다. 그러나 어떤 경우에는 콩을 인스턴스화하는 과정이 더 복잡합니다. 전통적인 방식으로 <ean>에 많은 양의 구성 정보가 필요합니다. 구성 방법의 유연성은 제한적이며 인코딩 방법을 사용하여 간단한 솔루션을 얻을 수 있습니다.
Spring은 org.springframework.bean.beans.factory.factorybean factory class 인터페이스를 제공하며 사용자는이 인터페이스를 구현하여 인스턴스화 Bean의 논리를 사용자 정의 할 수 있습니다.
<bean/>의 클래스 속성으로 구성된 구현 클래스가 FactoryBean 및 하위 클래스 인 경우 FactoryBean () 메소드의 반환은 FactoryBean 및 하위 클래스 자체를 반환하지 않지만 FactoryBean getObject () 메소드에 의해 반환 된 개체.
FactoryBean과 하위 클래스 자체의 객체를 얻으려면 GetBean (Beanname) 메소드 일 때 GetBean ( "& Car5")과 같은 "&"접두사로 Beanname을 명시 적으로 접두사하십시오.
5. 주석 기반 구성
5.1. 주석 유형
@component ----- 기본 주석
미분 주석 :
@repository : Annotate dao
@Service : 라벨 서비스
@Controller : 주석 컨트롤러
5.2. 주석 구성 정보를 사용하여 스프링 컨테이너를 시작하십시오
(1) 봄 2.5 이후, 컨텍스트 네임 스페이스가 소개되었으며, 이는 클래스 패키지를 스캔하여 콩을 정의하기위한 주석의 적용을 제공합니다.
<context : component-scan base-package = "xxxxxxxxxx"resource-pattern = "xxxx/*. class">
Resource-Pattern 속성은 기본 패키지에서 스캔 해야하는 특정 패키지 아래에 클래스를 지정하는 데 사용됩니다.
(2) 더 강력한 필터 서브 라벨이 있습니다
<context : component-scan base-package = "xxxxxxxxxx"> <context : include-filter type = "xxxx"expression = "xxxxxxxxxxxxxxxxx"/> <context : filter type = "xxxxxxxxxxxx"/contexx "/context : component : contxt : contxxxx"
모든 유형 중에서 AspectJ의 필터링 능력이 가장 강력합니다.
5.3. 콩의 자동 조립
(1) @autowired
기본적으로 @autowired 매치. 컨테이너에 콩이 일치하지 않으면 스프링 컨테이너가 시작될 때 예외가 발생합니다. 주석에 @autowired (필수 = false)를 사용할 수 있으며 예외는 발생하지 않습니다.
메소드 매개 변수에 직접 주석을 달 수 있도록 @autowired를 사용하십시오. 메소드에 여러 매개 변수가있는 경우 기본적으로 스프링은 주입의 매개 변수 유형과 일치하는 Bean을 자동으로 선택합니다.
수집 변수의 @autowired 주석을 사용하여 컬렉션의 요소 유형과 일치하는 모든 콩을 주입 할 수 있습니다.
@autowired 어셈블러 속성을 사용하면 세터 방법이 없을 수 있습니다.
(2) @qualifiler
컨테이너에 두 개 이상의 일치하는 콩이있는 경우 @Qualifiler 주석으로 콩 이름을 자격을 갖추게 될 수 있습니다.
(3) 표시 및 주석에 대한 지원
Spring은 또한 JSR-250으로 정의 된 @Resource 및 JSR-330으로 정의 된 @inject 주석을 지원합니다.
@Resource는 Bean의 이름 속성 Bean이 제공되도록 요구합니다. 속성이 비어 있으면 변수 이름 또는 메소드 이름은 Bean 이름으로 자동으로 사용됩니다.
(4) 핵심 사항 :
@autowired 만 사용하는 경우 XML에서 <bean/> 노드를 명시 적으로 정의해야합니다. 스프링 컨테이너는 기본적으로 주석 어셈블리를 비활성화합니다. 활성화하는 방법은 XML에서 <Context : Annotation-Config/> 요소를 구성하는 것입니다.
그러나 봄은 또 다른 속임수를 제공합니다. <context : component-scan/> 요소를 사용하여 스프링 컨테이너는 <bean/> 노드를 명시 적으로 정의하지 않고 Bean을 자동으로 감지합니다.
Spring은 @component, @repository, @service 및 @controller를 통해 주석 클래스에 주석을 달므로 <context : component-scan/>은 SpringBean으로 등록되어야하는 클래스를 알고 있습니다.
타사 JAR 패키지를 사용하고 타사 JAR 패키지에 클래스를 자동으로 주입하려는 경우, 타사 JAR 패키지가 주석으로 주석을 달지 않더라도 필터 요소 <context : context>는 주석 기반 구성 요소 스캔 정책을 대체 할 수 있습니다.
5.4. Bean의 행동 범위 및 생명 공정 방법
(1) @scope ( "xxxx")
주석으로 구성된 콩의 기본 범위는 싱글 톤입니다.
스프링은 @Scope 주석을 제공합니다. 클래스와 관련하여 주석 매개 변수는 XML의 스코프 속성 값과 동일합니다.
(2) 생명 공정 방법의 비교
| <bean> | 주석 |
| 이 시작 | @PostConstruct |
| 사우스토리-방법 | @predestroy |
차이 : 주석은 클래스에서 여러 메소드를 정의 할 수 있으며 방법이 순서대로 실행됩니다.
6. Java 기반 구성
6.1. Java 클래스를 사용하여 Bean 정의 정보를 제공하십시오
(1) 일반적인 pojo는 @Configuration 주석이 표시되는 한 스프링 컨테이너에 대한 Bean 정의 정보를 제공 할 수 있습니다. @bean으로 표시된 각 방법은 Bean 정의 정보를 제공하는 것과 같습니다.
(2) @bean
콩의 유형은 @bean에 의해 주석이 달린 메소드의 반환 값 유형에 의해 결정됩니다.
Bean의 기본 이름은 메소드 이름과 동일하며 @bean (name = "xxx")에 의해 명시 적으로 지정 될 수도 있습니다.
@Bean에서 @Scope를 사용하여 Bean 사용 범위를 나타냅니다.
(3) @configuration
@Configuration 주석 클래스 자체는 @Component 주석으로 표시되었으므로 @Configurstion으로 표시된 클래스는 @autowired를 사용하여 다른 클래스에 자동으로 조립할 수 있습니다.
6.2. Java 클래스를 기반으로 구성 정보를 사용하여 스프링 컨테이너 시작
(1) Spring은 주석이 붙은 @configuration 주석을 통해 스프링 컨테이너를 직접 시작할 수있는 주석이 포함 된 주석을 제공합니다.
(2) 여러 구성 클래스가있는 경우
AnnotationConfigApplicationContect의 Register 메소드를 통해 하나씩 등록한 다음 새로 고침 메소드를 호출하여 컨테이너를 새로 고침하여 등록 된 구성 클래스를 적용하십시오.
@import (xxx.class) 주석을 사용하여 하나의 구성 클래스에 하나의 구성 클래스 만 등록하면 다른 모든 구성 클래스를 소개 할 수도 있습니다.
(3) XML 구성 클래스를 통한 @Configuration 구성을 참조하십시오.
<context : component-scanbase-package = "..."resource-pattern = "configuration class name">
(4) 구성 클래스에서 XML 구성 정보를 참조하십시오
@configuration에서 @importresource ( "classpath : ............")를 사용하여 XML 구성 파일을 가져옵니다.
6.3. 3 가지 구성 방법의 비교
| XML | 주석 | 자바 클래스 |
| Bean의 구현 클래스는 현재 프로젝트 개발입니다. | 콩의 인스턴스화가 더 복잡한 시나리오에 적합한 코드를 통한 콩 초기화의 전체 논리를 제어 |
요약
위의 내용은 IOC 용기에서 스프링 조립 콩에 대한 자세한 설명입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구들은이 사이트를 계속 참조 할 수 있습니다.
Spring 3.x의 세 가지 Bean 구성 방법에 대한 자세한 설명
Spring Singleton Bean과 Singleton 패턴의 차이점에 대한 간단한 토론
스프링 구성 사용의 수명주기에 대한 자세한 설명
단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!