스프링을 기반으로 응용 프로그램을 개발할 때 일반적으로 데이터베이스 구성을 속성 파일에 배치합니다.
코드 분석과 관련된 지식 포인트 요약 :
1.NamespaceHandler는 XML 구성 파일의 사용자 정의 네임 스페이스를 구문 분석합니다
2. ContextNamespaceHandler Context 관련 파서, 여기에서 Parsing Placeholder를 구문 분석에 대한 특정 구문 분석기를 정의합니다.
3. BeanDefinitionParser는 Bean 정의의 인터페이스를 구문 분석합니다
4. beanfactorypostprocessor bean 정의를로드 한 후 수정할 수 있습니다.
5. PropertySourcesplaceholderConfigurer는 Bean 정의에서 자리 표시자를 처리합니다
먼저 특정 사용법을 살펴 보겠습니다
재산 사용
XML 파일에서 속성 파일을 구성하십시오
<? xml 버전 = "1.0"alcoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://ww.w.w3.org/2001/xmlschema-instance" xmlns : context = "http://www.springframework.org/schema/context"xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/schema/schema/scremans/sprdeans-schema http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd "> <context : property-placeholder 위치 ="classpath : foo.properties "/> </beans>
이런 식으로 /src/main/resources/foo.properties 파일은 Spring으로로드됩니다.
여러 구성 파일을 사용하려면 주문 필드를 추가하여 정렬 할 수 있습니다.
PropertySource를 사용하여 구성을 주석을 달 수 있습니다
Spring 3.1은 @propertysource 주석을 추가하여 환경에 속성 파일을 추가 할 수 있도록했습니다.
@configuration @propertySource ( "classpath : foo.properties") public class propertieswithjavaconfig {@bean public static propertysources placeholderconfigurer propertysplaceplaceholderconfigurer () {ret }}특성의 주입 및 사용
1. @Value 주석을 사용하여 Java에서 얻습니다
@Value ( "$ {jdbc.url}") 개인 문자열 jdbcurl;기본값을 추가 할 수도 있습니다
@Value ( "$ {jdbc.url : adefaultUrl}") 개인 문자열 JDBCURL;1. Spring의 XML 구성 파일로 가져옵니다
<bean id = "dataSource"> <property name = "url"value = "$ {jdbc.url}" /> < /bean>소스 코드 분석
속성 구성 정보로드
Spring은 시작시 AbstractApplicationContext#새로 고침을 통해 컨테이너 초기화 작업을 시작 하며이 기간 동안로드 비밀 정화가 XML 구성 파일을 구문 분석하도록 위임됩니다.
보호 된 최종 void refreshBeanFactory ()는 beansexception {if (hasbeanFactory ()) {DestroyBeans (); CloseBeanFactory (); } try {defaultListableBeanFactory BeanFactory = CreateBeanCactory (); beanfactory.setserializedid (getId ()); CustomizeBeanFactory (BeanFactory); loadBeendefinitions (beanfactory); 동기화 (this.beanfactorymonitor) {this.beanfactory = beanfactory; }} catch (ioexception ex) {throw new applicationcontextexception ( " + getDisplayName (), ex)에 대한 Bean 정의 소스를 구문 분석하는 새로운 ApplicationContexTexception ("I/O 오류 파싱 Bean 정의 소스; }}계층별 대표단을 통한 loadBeanDefinitions, defaultBeanDefinitionDocumentReader#parsebeandefinition을 찾으십시오.
보호 된 void parsebeandefinitions (요소 루트, beandefinitionparserdelegate delegate) {if (delegate.isdefaultnamespace (root)) {nodelist nl = root.getchildnodes (); for (int i = 0; i <nl.getlength (); i ++) {node node = nl.item (i); if (node instanceof element) {element ele = (요소) 노드; if (delegate.isdefaultnamespace (ele)) {parsedefaultElement (ele, delegate); } else {delegate.parsecustomElement (ele); }}}} else {delegate.parsecustomElement (루트); }} 이것은 표준 클래스 정의가 아니기 때문에 beandefinitionparserdelegate를 구문 분석합니다.
네임 스페이스 핸들러를 통해 해당 프로세서를 찾아 ContextNamespaceHandler를 찾은 다음 id를 통해 PropertyPlaceHolderBeanDefinitionParser Parser Analysis를 찾으십시오.
@override public void init () {// 이것은 우리가 REGISTEBEANDEFINITIONPARSER를 찾고있는 파서입니다 ( "Property-PlaceHolder", New PropertyPlaceHolderBeanDefinitionParser ()); RegisterBeanDefinitionParser ( "Property-Override", New PropertyOverRideBeanDefinitionParser ()); RegisterBeendEfinitionParser ( "Annotation-Config", New AnnotationConfigBeanDefinitionParser ()); RegisterBeendEfinitionParser ( "Component-Scan", New ComponentsCanBeanDefinitionParser ()); RegisterBeanDefinitionParser ( "로드 타임-위버", New LoadTimeWeAverBeanDefinitionParser ()); RegisterBeendEfinitionParser ( "스프링-구성", 새로운 SpringConfiguredBeanDefinitionParser ()); RegisterBeanDefinitionParser ( "mbean-export", New MbeanexportBeanDefinitionParser ()); RegisterBeanDefinitionParser ( "Mbean-Server", New MbeanserverBeanDefinitionParser ()); } PropertyPlaceHolderBeanDefinitionParser는이 코드 분석 라운드의 초점입니다.
부모 수업을 살펴 보겠습니다.
1. BeandefinitionParser
기본적으로 개인화 된 태그를 구문 분석하기 위해 기본적으로 사용합니다
요소를 구문 분석하는 구문 분석 API 만 여기에 정의됩니다.
공개 인터페이스 BeanDefinitionParser {BeanDefinition Parse (요소 요소, parsercontext parsercontext);} 2. ABSTRANTBEANDEFINITIONPARSER
BeanDefinitionParser 인터페이스의 기본 초록 구현. 봄이 잘됩니다. 여기에는 많은 편리한 API를 제공하며 템플릿 메소드 설계 패턴을 사용하여 서브 클래스에 맞춤 구현 후크를 제공합니다.
구문 분석 할 때 특정 처리 로직을 살펴 보겠습니다.
3. AbstractsingleBeandefinitionParser
단일 beandefinition의 추상적 부모 클래스를 분석하고 정의하십시오.
parseinteral, parse parentname, beanclass, source; BeanDefinitionBuilder를 사용하여 캡슐화하십시오
4. AbstractPropertyLoadingBeanDefinitionParser
위치, 속성 -ref, 파일 인코딩, 순서 등과 같은 속성 관련 속성 분석.
5. PropertyPlaceHolderBeanDefinitionParser
여기서 다루어야 할 것이 많지 않으며, 단지 inore-Unresolvable 및 System-Properties-Mode를 설정했습니다.
로딩 속성 파일, Bean의 인스턴스화
다음 으로이 콩이 언제 인스턴스화되는지 살펴 보겠습니다. 일반 계급에는 두 가지 유형의 인스턴스화가 있습니다. 싱글 톤 시스템이 시작될 때 하나는 인스턴스화됩니다. 다른 하나는 Getbean이 인스턴스화 될 때 비 싱턴 (또는 싱글 톤 게으른 로딩)이 인스턴스화됩니다.
여기의 방아쇠는 BeanFcatoryPostProcessor를 통해입니다.
BeanFactoryPostProcessor Bean Instantiation 전에 Bean 정의를 수정합니다. 예를 들어, Bean 정의의 자리 표시자는 여기에서 해결되며 현재 사용중인 속성도 여기에서 해결됩니다.
이는 후 프로세서 레지스트레이션 데이트를 통해 구현됩니다.
컨테이너에서 BeanFactoryPostProcessor를 스캔하고 여기에서 필요한 PropertySourcesPlaceHolderConfigurer를 찾아 컨테이너의 getbean을 통해 인스턴스화하십시오.
보호 된 voide invokeBeanFactoryPostProcessors (configurableBleistableBeanFactory beanFactory) {postProcessorRegistrationDelegate.invokeBeanClactoryPostProcessors (beanfactory, getBeanFactoryPostProcessors ()); }PropertySourcesPlaceHolderConfigurer의 인스턴스화가 완료되면 직접 트리거되고로드됩니다.
OrderComparator.sort (PriorityOrderEdPostProcessors); InvokeBeanFactoryPostProcessors (PriorityOrderEdPostProcessors, BeanFactory);
PropertySources PlaceHolderConfigurer의 상속 시스템을 살펴 보겠습니다.
1.BeanFactoryPostProcessor
컨테이너에서 Bean 정의의 특성을 수정하기위한 인터페이스를 정의하십시오. 구현 클래스는 일반 클래스가 사용되기 전에 인스턴스화되고 다른 클래스의 속성이 수정됩니다.
이것은 Bean 인스턴스를 수정하는 BeanPostProcessor와 분명히 다릅니다.
2. 프로퍼 티 로더 업시
속성 파일을로드하는 초록 클래스.
여기서 특정로드 로직은 PropertiesloaderUtils#Fill -Properties를 위임하는 것입니다.
3. PropertyResourceConfigurer
Bean 정의에서 자리 표시자를 교체하는 것은이 추상 클래스에서 구현됩니다.
BeanFactoryPostProcessor#PostProcessBeanFactory 구현, 컨테이너의 클래스 정의를 반복하고 수정하십시오.
수정 방법 Hook ProcessProperties를 통해 서브 클래스로 전달하여 구현하는 방법
4. PlaceholderConfigurersUpport
방문자 설계 패턴을 사용하여 BeanDefinitionVisitor 및 StringValueresolver를 통해 속성을 업데이트하십시오.
StringValueresolver는 문자열 유형 데이터를 변환하는 인터페이스입니다. 진정으로 속성을 업데이트하는 API 구현은 실제로
PropertyPlaceHolderHelper#parsestringValue
5. PropertySourcesplaceholderConfigurer
후 프로세서 브레이안 Factory API 정의 구문 분석 프로세스를 무시합니다
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.