Cuando desarrollamos aplicaciones basadas en Spring, generalmente colocamos la configuración de la base de datos en el archivo Propiedades.
Resumen de los puntos de conocimiento involucrados en el análisis de código:
1.Pace de nombres personalizado de NamespaceHandler en el archivo de configuración XML
2. Consexo de controles de controles de controles de controles
3.BeanDefinitionParser analiza la interfaz de la definición de frijoles
4.BeanFactoryPostprocessor Después de cargar la definición de frijoles, se puede modificar.
5.PropertySources PlaceHolderConfigurer maneja a los marcadores de posición en la definición de frijoles
Echemos un vistazo al uso específico primero
Uso de propiedad
Configurar el archivo de propiedades en el archivo XML
<? xml versión = "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/scoans/spring-bespreping-beans-4. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd "> <context: Property-placeholder ubicación =" classpath: foo.properties "/> </beans>
De esta manera, el archivo /src/main/resources/foo.properties se cargará por primavera
Si desea usar múltiples archivos de configuración, puede agregar el campo de pedido para ordenar
Use PropertySource para anotar la configuración
Spring 3.1 ha agregado la anotación @PropertySource para facilitar agregar archivos de propiedad al entorno.
@Configuration @PropertySource ("classpath: foo.properties") Public Class PropertiesWithJavaconfig {@Bean public static PropertySources LugarholderConFigurer PropertySources PlaceHolderConFigurer () {return New PropertySources PlaceConFigurer (); }}Inyección y uso de propiedades
1. Use la anotación @Value para obtener en Java
@Value ("$ {jdbc.url}") privado cadena jdbcurl;También puede agregar un valor predeterminado
@Value ("$ {jdbc.url: adefaulturl}") cadena privada jdbcurl;1. Obténgalo en el archivo de configuración XML de Spring
<bean id = "dataSource"> <propiedad name = "url" value = "$ {jdbc.URL}" /> < /bean>Análisis del código fuente
Carga de propiedades de la información de configuración
Spring iniciará la inicialización del contenedor Funcionando a través de AbstractApplicationContext#Actualizar al inicio, y durante este período, LoadBeanDefinitions se confiará para analizar el archivo de configuración XML.
Protegido Final Void RefreshBeanFactory () lanza BeanSexception {if (HasBeanFactory ()) {DestroyBeans (); CloseBeanFactory (); } try {defaultListableBeanFactory beanFactory = createBeanFactory (); beanfactory.setSerializationId (getId ()); personalizeBeanFactory (beanFactory); LoadBeanDefinitions (BeanFactory); sincronizado (this.BeanFactoryMonitor) {this.BeanFactory = BeanFactory; }} Catch (ioException ex) {tire nueva aplicaciónContextException ("Error de E/S Fuente de definición de frijoles para" + getDisplayName (), ex); }}LoadBeanDefinitions a través de la delegación de capa por capa, encuentre el valor predeterminado de FaushBeanDefinitionDocumentReader#parseBeanDefinition para analizar el bean específico
ParseBeanDefinitions de voides protegidos (elemento root, beandefinitionParserDelegate delegate) {if (delegate.isdefaultnamespace (root)) {nodelist nl = root.getChildNodes (); for (int i = 0; i <nl.getLength (); i ++) {nodo nodo = nl.item (i); if (nodo instanceof element) {element ele = (element) nodo; if (delegate.isdefaultnamespace (ele)) {parsedefaultElement (ele, delegado); } else {delegate.parsecustomelement (ele); }}}} else {delegate.parsecustomelement (root); }} Dado que esta no es una definición de clase estándar, confía beandefinitionParserDelegate para analizar
Encuentre el procesador correspondiente a través de NamespaceHandler para encontrar el contextamespaceHandler, y luego encuentre el análisis de analizador de Propiedad Lugar a la ID de Propiedad Lugar de Infinición a través de ID
@Override public void init () {// Este es el analizador que estamos buscando registroBeanDefinitionParser ("Property-placeholder", New PropertyPlaceHolderBeanDefinitionParser ()); RegisterBeanDefinitionParser ("Property-Override", New PropertyOverridebeanDefinitionParser ()); RegisterBeanDefinitionParser ("Annotation-config", nueva anotaciónConfigBeanDefinitionParser ()); RegisterBeanDefinitionParser ("Component-scan", nuevo ComponentSCanBeanDefinitionParser ()); RegistroBeanDefinitionParser ("Weaver de tiempo de carga", New LoadTimeWeaverBeanDefinitionParser ()); RegisterBeanDefinitionParser ("Spring-Configurado", nuevo SpringConfiguredBeanDefinitionParser ()); RegisterBeanDefinitionParser ("MBean-Export", nuevo MBeanExportBeanDefinitionParser ()); RegisterBeanDefinitionParser ("MBean-Server", nuevo MBeanserverBeanDefinitionParser ()); } PropertyPlaceHolderBeanDefinitionParser es el foco de esta ronda de análisis de código.
Echemos un vistazo a su clase de padres.
1.BeanDefinitionParser
Usado por defaultBeanDefinitionDocumentReader para analizar etiquetas personalizadas
Solo una API de análisis que el elemento analiza se define aquí
interfaz pública beandefinitionParser {beandefinition parse (elemento elemento, parsercontext luesContext);} 2. AbstractBeanDefinitionParser
La implementación abstracta predeterminada de la interfaz BeanDefinitionParser. La primavera es buena en eso. Proporciona muchas API convenientes aquí, y utiliza el patrón de diseño del método de plantilla para proporcionar ganchos de implementación personalizados para subclases.
Echemos un vistazo a la lógica de procesamiento específica cuando se analice: llame al análisis de la parse del gancho
3. AbstractSingleBeandFinitionParser
Analice, defina la clase matriz abstracta de una sola vez de beandefinition
En parseinternal, parse parentname, beanclass, fuente; y encapsular usando beandefinitionBuilder
4. AbstractPropertyLoadingBeanDefinitionParser
Analizar propiedades relacionadas con la propiedad, como ubicación, propiedad de propiedades, codificación de archivos, pedido, etc.
5.PropertyPlaceHolderBeanDefinitionParser
No hay muchas cosas con las que lidiar aquí, solo configurar inore-Insolvenable y System-Properties-Mode
Archivo de propiedades de carga, instanciación de frijoles
A continuación, echemos un vistazo cuando este frijol esté instanciado. Hay dos tipos de instanciación de clases generales. Uno se instancia cuando se inicia el sistema singleton; El otro se instancia cuando el no singleton (o carga perezosa singleton) cuando se instancia el GetBean.
El desencadenante aquí es a través de BeanfcatoryPostProcessor.
BeanFactoryPostProcessor modifica la definición de frijoles antes de la instanciación de frijoles. Por ejemplo, los marcadores de posición en la definición de frijoles se resuelven aquí, y las propiedades que estamos usando ahora también se resuelven aquí.
Esto se implementa a través de PostProcessorRegistrationDelegate#InvokeBeanFactoryPostProcessors.
Escanee el beanFactoryPostProcessor en el contenedor, encuentre el PropertySources PlaceHolderConfigurer que se necesita aquí e instanciéelo a través del GetBean del contenedor
InvokeBeanFactoryPoSprocessors protegido Void (configuableListableBeanFactory BeanFactory) {PostProcessorRregistrationDelegate.InvokeBeanFactoryPostProcessors (BeanFactory, GetBeanFactoryPostProcessors ()); }Después de completar la instancia de PropertySources PlaceHolderConfigurer, se activará directamente y se cargará información.
OrderComparator.sort (priorityOrderedPostProcessors); InvokeBeanFactoryPostProcessors (priorityOrderedPostProcessors, BeanFactory);
Echemos un vistazo al sistema de herencia de PropertySources PlaceHolderConfigurer
1.BeanFactoryPostProcessor
Defina una interfaz para modificar las propiedades de la definición de frijoles en un contenedor. Su clase de implementación se instancia antes de utilizar clases generales y las propiedades de otras clases se modifican.
Obviamente, esto es diferente de BeanPostProcessor, que modifica las instancias de frijoles.
2.PropertiesLoaderSupport
Clase abstracta que carga archivos de propiedades.
La lógica de carga específica aquí es confiar PropertiesLoaderUtils#FillProperties para implementar
3.PropertyResourCeconfigurer
La reemplazo de marcadores de posición en la definición de frijoles es implementado por esta clase abstracta.
Implementar beanFactoryPostProcessor#PostProcessBeanFactory, iterar sobre la definición de clase en el contenedor y modificarlo
Cómo modificarlo se implementa entregándolo a una subclase a través de las Properios de procesos de gancho
4.PlaceHolderConfigurerSupport
Use el patrón de diseño del visitante para actualizar las propiedades a través de BeanDefinitionVisitor y StringValuerSolver
StringValueReSolver es una interfaz que convierte los datos de tipo de cadena. La implementación de API que realmente actualiza las propiedades está realmente en
PropertyPlaceHolderHelper#parsEdringValue
5.PropertySources PlaceHolderConfigurer
Anular el proceso de análisis de la definición de la API de FactoryFactory PostProcessorBean
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.