1. Antecedentes
Recientemente, durante el proceso de desarrollo del proyecto, encontré el problema que necesitaba para definir algunas variables personalizadas en el archivo de propiedades para la lectura dinámica y cambiar las variables de los programas Java, y ya no necesitaba modificar el código. Aproveché esta oportunidad para ordenar y analizar el contenido del archivo de propiedades en el proyecto de desarrollo integrado de Spring+SpringMVC+MyBatis a través de programas Java, y compartirlo con usted primero.
2. Introducción al entorno del proyecto
Tres o cinco formas de implementarlo
Método 1. Cargue el contenido en el archivo de configuración jdbc.properties a través del contexto: propiedad-placeholder
<context: Property-placeholder ubicación = "classpath: jdbc.properties" ignore-unresolvable = "true"/>
La configuración anterior es equivalente a la siguiente configuración, que es una simplificación de la siguiente configuración
<bean id = "PropertyConfigurer"> <Property name = "IgnoreUnresolVablePlaceHolders" value = "true"/> <Property name = "ubicaciones"> <list> <valor> classpath: jdbc.properties </value> </list> </bean> </bean>
Nota: De esta manera, si tiene la siguiente configuración en el archivo Spring-MVC.XML, no debe perderse la siguiente parte roja, sobre su función y principio.
<
Método 2. Inyección utilizando anotaciones, inyectando principalmente el valor correspondiente en el archivo de propiedades utilizando anotaciones en el código Java.
<bean id = "prop"> <!- Esta es la clase PropertiesFactoryBean. También tiene una propiedad de ubicaciones, que también recibe una matriz, al igual que la arriba-> <propiedad name = "ubicaciones"> <Array> <value> classpath: jdbc.properties </value> </array> </prown> </bean>
Método 3. Use la etiqueta Util: Propiedades para exponer el contenido en el archivo Propiedades
<Util: Propiedades id = "PropertiesReader" ubicación = "classpath: jdbc.properties"/>
Nota: Usando la configuración de línea anterior, debe declarar la siguiente parte roja en el encabezado del archivo Spring-Dao.xml
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema -instance" xmlns: context = "http://wwww.springframe xmlns: util = "http://www.springframework.org/schema/util" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/spring-beans-3. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd ">
Método 4. Exponga las propiedades a las propiedades de la subclase personalizada para su uso en el programa al cargar el contexto a través de PropertyPlaceHolderConfigurer
<bean id = "PropertyConfigurer"> <Property name = "IgnoreUnresolVablePlaceHolders" value = "true"/> <Property Name = "IgnorReourCenotFound" valor = "true"/> <Property Name = "ubicaciones"> <list> <valor> classpath: jdbc.properties </value> </list> </propers> </bean>
La declaración de la clase personalizada PropertyConfigurer es la siguiente:
paquete com.hafiz.www.util; import org.springframework.beanss.beansexception; import org.springframework.beans.factory.config.configuableBeanFactory; import og.springFrameWork.Beans.config.propertyPertyConfigurer; DESC: Clase de lectura de archivos de configuración de propiedades* creada por Hafiz.zhang el 2016/9/14. */Public Class PropertyConfigurer extiende PropertyPlaceHolderConfigurer {Props de propiedades privadas; // Acceda al archivo de configuración de propiedades del resultado del valor del valor @Override Process ProcessProperties (configuableListableBeanFactory beanFactoryToprocess, Propiedades) lanza Beansexception {super.processproperties (beanFactoryToproCess, props); this.props = Props; } public String getProperty (tecla de cadena) {return this.props.getProperty (clave); } public String getProperty (clave de cadena, cadena defaultValue) {return this.props.getProperty (clave, defaultValue); } Public Object setProperty (clave de cadena, valor de cadena) {return this.props.setProperty (clave, valor); }}Cómo usar: solo use la inyección de anotación de @autowired en la clase que necesita usar.
Método 5. Personalice la clase de herramientas PropertyUtil y lea el contenido del archivo de propiedades en el bloque de código estático estático de la clase y guárdelo en la propiedad estática para usar por otros programas.
paquete com.hafiz.www.util; import org.slf4j.logger; import org.slf4j.loggerFactory; import java.io.*; import java.util.properties;/*** DESC: Clase de herramienta de adquisición de archivos de propiedades* creada por Hafiz.zhang en 2016/9/15. */public class PropertyUtil {private static final logger logger = loggerFactory.getLogger (PropertyUtil.class); Propiedades de propiedades estáticas privadas; static {loadprops (); } sincronizado static private void loadprops () {logger.info ("Comience al contenido del archivo de propiedades de carga ......"); props = new Properties (); InputStream in = null; Pruebe {<!-Primer tipo, obtenga la secuencia de archivos de propiedades a través del cargador de clase-> in = propertyUtil.class.getClassLoader (). getResourceasstream ("jdbc.properties"); < Props.Load (in); } Catch (FileNotFoundException e) {logger.error ("jdbc.properties no se encuentra"); } catch (ioException e) {logger.error ("aparece ioexception"); } finalmente {try {if (null! = in) {in.close (); }} Catch (ioException e) {logger.error ("excepción cerrada con jdbc.properties file stream cerrado"); }} logger.info ("Cargando el contenido del archivo de propiedades ........."); logger.info ("Contenido de archivo de propiedades:" + Props); } public static string getProperty (tecla de cadena) {if (null == props) {loadprops (); } return pross.getProperty (clave); } public static string getProperty (clave de cadena, cadena defaultValue) {if (null == props) {loadprops (); } return props.getProperty (clave, defaultValue); }}Nota: De esta manera, cuando la clase se carga, leerá automáticamente el contenido del archivo de configuración en la ubicación especificada y lo guardará en propiedades estáticas, que es eficiente y conveniente, y se puede cargar a la vez y usarse varias veces.
4. Precauciones y sugerencias
Los primeros tres métodos son rígidos en los cinco métodos anteriores. Y si desea usarlos en un bean con anotación @Controller, debe declararlos en el archivo de configuración de SpringMVC Spring-Mvc.xml. Si desea usarlos en un frijol con @Service, @Respository, etc., debe declararlos en Spring.xml en el archivo de configuración de Spring.
Personalmente recomiendo los métodos de configuración cuarto y quinto. El quinto es el mejor. Ni siquiera necesita inyectarse en el objeto similar a la herramienta, y llama directamente el método estático para la adquisición, y solo lo carga una vez, lo que también es altamente eficiente. Además, los primeros tres métodos no son muy flexibles, y se requiere el valor clave de @Value.
5. Pruebe para verificar si está disponible
1. Primero creamos PropertIesservice
paquete com.hafiz.www.service;/** * Desc: el programa Java recibe el servicio del contenido del archivo de propiedades * creado por Hafiz.zhang el 2016/9/16. */Public Interface PropertiesService {/** * El primer método de implementación obtiene el valor de la clave especificada en el archivo de propiedades * * @return */string getProperyByFirstway (); / ** * El segundo método de implementación obtiene el valor de la clave especificada en el archivo de propiedades * * @return */ string getProperyBySecondway (); / ** * El tercer método de implementación obtiene el valor de la clave especificada en el archivo de propiedades * * @return */ string getProperyBythirdway (); / ** * El cuarto método de implementación obtiene el valor de la clave especificada en el archivo de propiedades * * @param clave * * @return */ string getProperyByFourThway (tecla de cadena); / ** * El cuarto método de implementación obtiene el valor de la clave especificada en el archivo de propiedades * * @param clave * * @param defaultValue * * @return */ string getProperyByFourThway (clave de cadena, cadena defaultValue); / ** * El quinto método de implementación obtiene el valor de la clave especificada en el archivo de propiedades * * @param clave * * @return */ string getProperyByFiftHay (tecla de cadena); / ** * El quinto método de implementación para obtener el valor de la clave especificada en el archivo de propiedades * * @param clave * * @param defaultValue * * @return */ string getProperyByfifthway (clave de cadena, cadena defaultValue);}2. Crear e implementar la clase PropertaseServiceImpl
paquete com.hafiz.www.service.impl; import com.hafiz.www.service.propertiesservice; import com.hafiz.www.util.propertyconfigurer; import com.hafiz.www.util.propertyutil; import org.springframework.beanss.beans.cactory.annotation.autation.autation; org.springframework.beans.factory.annotation.value; import org.springframework.stereotype.service;/*** Desc: el programa Java obtiene la clase de implementación de servicios del servicio que obtiene el contenido del archivo de propiedades* creado por Hafiz.zhang en 2016/9/16. */ @ServicePublic de la clase PropertiesServiceImpl implementa PropertiesService {@Value ("$ {test}") String privado testDatabyFirst; @Value ("#{prop.test}") privado cadena testdatabysecond; @Value ("#{PropertiesReader [test]}") String privado TestDatabyThird; @AUTOWIREDIRED PRIVED PROPERYCONFIGURER PC; @Override public String getProperyByFirstway () {return testDatabyFirst; } @Override public String getProperyBySecondway () {return testDatabySecond; } @Override public String getProperyBythirdway () {return testDatabyThird; } @Override public String getProperyByFourThway (tecla de cadena) {return pc.getProperty (clave); } @Override public String getProperyByFourThway (tecla de cadena, cadena defaultValue) {return pc.getProperty (clave, defaultValue); } @Override public String getProperyByFifthway (tecla de cadena) {return PropertyUtil.getPropery (clave); } @Override public String getProperyByFifthway (tecla de cadena, cadena defaultValue) {return PropertyUtil.getProperty (Key, defaultValue); }}3. Controlador de clase PropertyController
paquete com.hafiz.www.controller; import com.hafiz.www.service.propertiesservice; import com.hafiz.www.util.propertyutil; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.pathvariable; import org.springframework.web.bind.annotation.requestMapping; import org.springframework.web.bind.annotation.requestmethod; import og.springframework.webind.annotation Controlador* Creado por Hafiz.zhang el 2016/9/16. */@Controler@requestmapping ("/prop") public class PropertyController {@aUtowired private PropertureService ps; @RequestMapping (valor = "/way/primer", método = requestmethod.get) @ResponseBody public String getPropertyByFirstway () {return Ps.getProperyByFirstway (); } @RequestMapping (valor = "/way/segundo", método = requestmethod.get) @ResponseBody public String getPropertyBySecondway () {return Ps.getProperyBySecondway (); } @RequestMapping (valor = "/way/tercero", método = requestmethod.get) @ResponseBody public String getPropertyByThirdway () {return Ps.getProperyBythirdway (); } @RequestMapping (value = "/way/cuarto/{key}", método = requestmethod.get) @ResponseBody String public String getPropertyByFourThway (@PathVariable ("Key") Clave de cadena) {return Ps.getProperyBourThway (Key, "DefaultValue"); } @RequestMapping (valor = "/way/quhth/{key}", método = requestmethod.get) @ResponseBody String public String getPropertyByFiftHway (@PathVariable ("Key") Clave de cadena) {return PropertyUtIl.getProperty (Key, "defaultValue"); }}4.JDBC.Properties File
jdbc.driver = com.mysql.jdbc.driverjdbc.url = jdbc: mysql: //192.168.1.196: 3306/dev? useUnicode = true & carácter = utf-8jdbc.username = rootjdbc.password = 123456jdbc.maxa ctive = 200jdbc.minidle = 5jdbc.initialSize = 1jdbc.maxwait = 60000jdbc.timebetweenEvictionRunsmillis = 60000JDBC.MINEVICTABLEDIDLETIMEMILLIS t_userjdbc.testwhileidle = truejdbc.testonreturn = falseJDBC.PoolPeRareStatements = trueJdbc.MaxPoolProparedStatementPonConnectsize = 20jdbc.filters = stat#test dataTest = com.hafiz.wwwwwwww
5. Diagrama de resultados del proyecto
6. Descarga del proyecto: demostración http://xiazai.vevb.com/201612/yuanma/propertiesconfigurer_jb51.zip
7. Resultados de la prueba
El primer método
El segundo camino
La tercera vía
El cuarto método
El quinto método
6. Resumen
A través de esta revisión y prueba, entendemos el rol y el principio de la relación de los contenedores para padres e hijos entre Spring y SpringMVC y el atributo de Filtros de defensa de uso que se pasa por alto más fácilmente al escanear el contexto: el paquete de etiquetas de componente. Poder localizar mejor y resolver rápidamente los problemas encontrados nuevamente. De todos modos, genial ~~~
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.