Springに基づいてアプリケーションを開発するとき、通常、データベース構成をプロパティファイルに配置します。
コード分析に関連する知識ポイントの概要:
1.NamesPaceHandlerは、XML構成ファイルにカスタムネームスペースを解析します
2.CONTEXTNAMESPACEHANDLERコンテキスト関連パーサー、プロパティプレイスホルダーを解析するための特定のパーサーを定義します
3.BeanDefinitionParserは、Bean定義のインターフェイスを解析します
4.BeanFactoryPostProcessor Bean定義をロードした後、変更できます。
5.PlopertySourcesPlaceHolderConfigurerは、Bean定義のプレースホルダーを処理します
最初に特定の使用法を見てみましょう
プロパティの使用
XMLファイルでプロパティファイルを構成します
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.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/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context-4.pring <コンテキスト:プロパティプレイスホルダーlocation = "classpath:foo.properties" /> < /beans>
このように、/src/main/resources/foo.propertiesファイルは春までにロードされます
複数の構成ファイルを使用する場合は、並べ替えに注文フィールドを追加できます
PropertySourceを使用して、構成に注釈を付けます
Spring 3.1では、@PropertySourceアノテーションを追加して、環境にプロパティファイルの追加を容易にします。
@configuration @propertySource( "classpath:foo.properties")public class propertieswithjavaconfig {@bean public static propertysourcesplaceholderconfigurer propertysourcesplaceholderconfigurer(){return new new propertySourcesplaceholdeConfigurer(); }}注入とプロパティの使用
1. @valueアノテーションを使用して、Javaで取得します
@value( "$ {jdbc.url}")private string jdbcurl;デフォルト値を追加することもできます
@value( "$ {jdbc.url:adefaulturl}")private string jdbcurl;1. SpringのXML構成ファイルで取得します
<bean id = "dataSource"> <プロパティ名= "url" value = "$ {jdbc.url}" /> < /bean>ソースコード分析
プロパティ構成情報の読み込み
Springは、AbstractApplicationContext#スタートアップで更新されるコンテナの初期化作業を開始します。この期間中、LoadBeanDefinitionsはXML構成ファイルを解析するように契約します。
Protected final void refreshbeanfactory()throws beansexception {if(hasbeanfactory()){destroybeans(); CloseBeanFactory(); } try {defaultListableBeanFactory beanFactory = createBeanFactory(); BeanFactory.SetserializationId(getId()); CustomizeBeanFactory(BeanFactory); LoadBeanDefinitions(BeanFactory);同期(this.beanfactorymonitor){this.beanfactory = beanfactory; }} catch(ioException ex){show new ApplicationContextException( "I/Oエラー解析bean定義ソース" + getDisplayName()、ex); }}Layer-by-Layer Delegationを介したLoadBeanDefinitions、DefaultBeanDefinitionDocumentReader#ParseBeanDefinitionを見つけて、特定のBeanを解析する
保護されたvoid parsebeandefinitions(要素root、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 =(element)node; if(delegate.isdefaultnamespace(ele)){parsedefaultelement(ele、delegate); } else {Delegate.ParseCustomElement(ELE); }}}} else {delegate.parseCustomelement(root); }}これは標準クラスの定義ではないため、BeanDefinitionParserDelegateに解析を委託します
namespacehandlerを介して対応するプロセッサを見つけて、ContextNamesSpaceHandlerを見つけ、IDを介してPropertyPlacePlaceHolderBeanDefinitionParserパーサー分析を見つけます
@Override public void init(){//これは、RegisterBeanDefinitionParser( "Property-PlaceHolder"、new PropertyPlaceHolderBeanDefinitionParser())を探しているパーサーです。 RegisterBeanDefinitionParser( "Property-Override"、new PropertyOverRideBeanDefinitionParser()); RegisterBeanDefinitionParser( "Annotation-Config"、new AnnotationConfigbeanDefinitionParser()); RegisterBeanDefinitionParser( "Component-Scan"、new ComponentsCanBeanDefinitionParser()); RegisterBeanDefinitionParser( "Load-Time-Wever"、new LoadTimeWeaveanDefinitionParser()); RegisterBeanDefinitionParser( "Spring Configured"、new SpringConfiguredBeanDefinitionParser()); RegisterBeanDefinitionParser( "mbean-export"、new mbeanexbeandefinitionParser()); RegisterBeanDefinitionParser( "mbean-server"、new mbeanserbeandefinitionParser()); } PropertyPlaceHolderBeanBeanDefinitionParserは、このコード分析のラウンドの焦点です。
親クラスを見てみましょう。
1.BeanDefinitionParser
デフォルトで使用されていますBeanDefinitionDocumentReaderは、パーソナライズされたタグを解析します
要素を解析する解析APIのみがここで定義されています
パブリックインターフェイスBeanDefinitionParser {BeanDefinition Parse(要素要素、ParserContext ParserContext);} 2.AbstractBeanDefinitionParser
BeanDefinitionParserインターフェイスのデフォルトの抽象実装。春はそれが得意です。ここでは多くの便利なAPIを提供し、テンプレートメソッド設計パターンを使用して、サブクラスにカスタム実装フックを提供します。
解析時に特定の処理ロジックを見てみましょう:フックを呼び出してください。
3。AbstractsinglebeandefinitionParser
分析、単一のビアンデフィニッションの抽象的な親クラスを定義します
Parseinternal、Parse ParentName、BeanClass、Source; BeanDefinitionBuilderを使用してカプセル化します
4。AbstractPropertyLoadingBeanDefinitionParser
場所、プロパティ - レフ、ファイルエンコード、注文など、プロパティ関連のプロパティを分析します。
5.PropertyPlaceHolderBeanBeanDefinitionParser
ここで対処すべきことはあまりありません。inore-ofsolvableとシステムプロパティモードをセットアップするだけです
ロードプロパティファイル、豆のインスタンス化
次に、この豆がインスタンス化されるときを見てみましょう。一般的なクラスには2種類のインスタンスがあります。シングルトンシステムが開始されると、1つがインスタンス化されます。もう1つは、GetBeanがインスタンス化されたときに、シングルトン以外の怠zyなロード)のときにインスタンス化されます。
ここのトリガーは、BeanFcatoryPostProcessorを介してです。
BeanFactoryPostProcessorは、Beanインスタンス化の前にBean定義を修正します。たとえば、Bean定義のプレースホルダーはここで解決され、現在使用しているプロパティもここで解決されます。
これは、PostprocessorRegistrationDelegate#InvokeBeanFactoryPostProcessorsを通じて実装されます。
コンテナ内のBeanFactoryPostProcessorをスキャンし、ここで必要なPropertySourcesPlaceHolderConfigurerを見つけて、コンテナのGetBeanからインスタンス化します
保護されたvoid invokebeanfactorypostprocessors(configureablelistablebeanfactory beanfactory){postprocessorregistrationdelegate.invokebeanfactorypostprocessors(beanfactory、getbeanfactorypostprocessors(); }PropertySourcesPlaceHolderConFigurerのインスタンス化が完了した後、直接トリガーされ、情報がロードされます。
OrderComparator.Sort(PriorityOrderedPostProcessors); InvokeBeanFactoryPostProcessors(Priority OrderedPostProcessors、BeanFactory);
propertySourcesplaceholderconfigurerの継承システムを見てみましょう
1.BeanFactoryPostProcessor
コンテナ内のBean定義のプロパティを変更するためのインターフェイスを定義します。その実装クラスは、一般クラスが使用され、他のクラスのプロパティが変更される前にインスタンス化されます。
これは、BeanPostProcessorとは明らかに異なり、Beanインスタンスを変更します。
2.PropertiesLoaderSupport
プロパティファイルをロードする抽象クラス。
ここでの具体的な読み込みロジックは、PropertiesLoaderUtils#FillPropertiesを実装することです
3.PropertyResourceConfigurer
Bean定義におけるプレースホルダーの交換は、この抽象クラスによって実装されます。
BeanFactoryPostProcessor#PostProcessBeanFactoryを実装し、コンテナのクラス定義を反復し、それを変更します
それを変更する方法フックProcessPropertiesを介してサブクラスに渡すことにより実装されます
4.PlaceHolderConfigurerSupport
訪問者のデザインパターンを使用して、BeanDefinitionVisitorとStringValueresolverを介してプロパティを更新します
StringValueresolverは、文字列型データを変換するインターフェイスです。本当にプロパティを更新するAPIの実装は実際にあります
PropertyPlaceHolderHelper#parsestringValue
5.PropertySourcesplaceholderconfigurer
PostProcessorBeanFactory API定義解析プロセスをオーバーライドします
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。