1. Antecedentes
Recentemente, durante o processo de desenvolvimento do projeto, encontrei o problema que precisava definir algumas variáveis personalizadas no arquivo de propriedades para leitura dinâmica e alteração das variáveis dos programas Java, e não precisava mais modificar o código. Aproveitei a oportunidade para resolver e analisar o arquivo de conteúdo de propriedades no projeto de desenvolvimento integrado do Spring+Springmvc+Mybatis através dos programas Java e compartilhá -lo com você primeiro.
2. Introdução ao ambiente do projeto
Três ou cinco maneiras de implementá -lo
Método 1. Carregue o conteúdo no arquivo de configuração JDBC.Properties através do contexto: Propriedade do local
<Contexto: Propriedade-Placter Location = "ClassPath: JDBC.Properties" ignore-unresolvable = "true"/>
A configuração acima é equivalente à seguinte configuração, que é uma simplificação da seguinte configuração
<bean id = "PropertyConfigurer"> <Propriedade name = "ignoreunResolVablePlaceHolders" value = "true"/> <names name = "locations"> <list> <value> ClassPath: jdbc.properties </value> </list> </sipers> </bean>
NOTA: Dessa maneira, se você tiver a seguinte configuração no arquivo spring-mvc.xml, não deverá estar perdendo a seguinte parte vermelha, sobre sua função e princípio.
<!-Configurar a varredura de componentes, apenas as anotações do controlador são digitalizadas no contêiner Springmvc-> <Contexto: componente-Scan-Package = "com.hafiz.www" use-default-filters = "false"> <Contexto: Incluir-Filter Type = "Anotation" Expression = "Org.SPringFramesway.steryPyPeat.TeryTyPy.CextetPeat.CexteptyPeT.CextetyP.CextyTryTyT.Cext.TeryPryTyT.Cext.Cext.TeryTyT.Cext.TeryT.Cext.TeryT.Cext.TeryT.Cext.TerPeTyT.Cextept.TeryTyRyT.TeryTyRyT.TeryTyRyP.
Método 2. Injeção usando anotações, injetando principalmente o valor correspondente no arquivo de propriedades usando anotações no código Java.
<bean id = "prop"> <!- Esta é a classe PropertiesFactoryBean. Ele também possui uma propriedade de locais, que também recebe uma matriz, assim como o acima-> <propriedades name = "Localization"> <Array> <Value> ClassPath: jdbc.properties </value> </ray> </Property> </bean>
Método 3. Use a tag Util: Propriedades para expor o conteúdo no arquivo de propriedades
<Util: Propriedades id = "PropertiesReader" location = "ClassPath: jdbc.properties"/>
Nota: Usando a configuração da linha acima, você precisa declarar a seguinte parte vermelha no cabeçalho do arquivo spring-dao.xml
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-nstance" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 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. Exponha as propriedades às propriedades da subclasse personalizada para uso no programa ao carregar o contexto através do PropertyPlaceHoldConfigurer
<bean id = "PropertyConfigurer"> <Propriedade name = "ignoreunResolVablePlaceHolders" value = "true"/> <names name = "ignoreReResourCenotFound" value = "true"/> <nome da propriedade = "Locations"> <list> <Value> Classpath: jdbc.properties </value> <///List "> <list>
A Declaração do PropertyConfigurer personalizada é a seguinte:
package com.hafiz.www.util; importar org.springframework.beans.beansception; importar org.springframework.beans.factory.config.configurablelistableBeanFoldersCongry; Desc: Classe de leitura de arquivos de configuração de propriedades* criado por Hafiz.zhang em 2016/9/14. */Public Class PropertyConfigurer estende PropertyPlaceHoldConfigurer {Propriedades privadas Props; // Acesse o resultado da chave do arquivo de configuração do arquivo de propriedades @Override Protected ProcessProperties (ConfigurableListableBeanFactory BeanFactoryToprocess, Properties Props) lança Beansexception {super.processproperties (BeanFactorytoprocess, Props); this.props = props; } public string getProperty (chave de string) {return this.props.getProperty (key); } public string getProperty (chave de string, string defaultValue) {return this.props.getProperty (key, defaultValue); } public Object SetProperty (chave da string, String value) {return this.props.setProperty (chave, valor); }}Como usar: basta usar a injeção de anotação @Autowired na classe que você precisa usar.
Método 5. Personalize a classe Tool Class PropertyUtil e leia o Conteúdo do arquivo de propriedades no bloco de código estático da classe e salve -o na propriedade estática para uso por outros programas.
pacote com.hafiz.www.util; importar org.slf4j.logger; importar org.slf4j.loggerfactory; importar java.io. */public class PropertyUtil {private Static Final Logger Logger = LoggerFactory.getLogger (PropertyUtil.class); Propriedades estáticas privadas adereços; estático {loadProps (); } sincronizado estático privado void loadProps () {Logger.info ("Inicie o conteúdo do arquivo de propriedades do carregamento de propriedades ......"); Props = new Properties (); InputStream in = null; tente {<!-Primeiro tipo, obtenha o fluxo de arquivos de propriedades através do carregador de classe-> in = Propertyutil.class.getclassloader (). getResourceasStream ("jdbc.properties"); <!-Segundo tipo, obtenha o fluxo de arquivos de propriedades através da classe-> // in = Propertyutil.class.getResourceasStream ("/jdbc.properties"); props.load (in); } catch (filenotfoundException e) {logger.error ("JDBC.Properties File não encontrado"); } catch (ioexception e) {logger.error ("ioexception aparece"); } finalmente {tente {if (null! = in) {in.close (); }} catch (ioexception e) {logger.error ("Exceção fechada com jdbc.properties Stream fechada"); }} logger.info ("Carregando o conteúdo do arquivo de propriedades ........."); Logger.info ("Propriedades Conteúdo do arquivo:" + Props); } public static string getProperty (string key) {if (null == props) {loadProps (); } retornar props.getProperty (key); } public static string getProperty (chave de string, string defaultValue) {if (null == props) {loadProps (); } retornar props.getProperty (key, defaultValue); }}NOTA: Dessa maneira, quando a classe for carregada, ela lerá automaticamente o conteúdo do arquivo de configuração no local especificado e o salvará em propriedades estáticas, que é eficiente e conveniente, e pode ser carregada ao mesmo tempo e usada várias vezes.
4. Precauções e sugestões
Os três primeiros métodos são rígidos nos cinco métodos acima. E se você quiser usá-los em um feijão com anotação @Controller, precisará declará-los no arquivo de configuração do Springmvc spring-mvc.xml. Se você deseja usá -los em um feijão com @service, @Respository, etc., precisará declará -los em spring.xml no arquivo de configuração da primavera.
Pessoalmente, recomendo os métodos de configuração do quarto e quinto. O quinto é o melhor. Ele nem precisa ser injetado no objeto semelhante a uma ferramenta e chama diretamente o método estático de aquisição e o carrega apenas uma vez, o que também é altamente eficiente. Além disso, os três primeiros métodos não são muito flexíveis e o valor -chave do @Value é necessário.
5. Teste para verificar se está disponível
1. Primeiro criamos o PropertiErService
pacote com.hafiz.www.service;/** * Desc: o programa Java recebe o serviço do conteúdo do arquivo de propriedades * criado por hafiz.zhang em 2016/9/16. */Public Interface PropertiESSERVICE {/** * O primeiro método de implementação obtém o valor da chave especificada no arquivo de propriedades * * @return */string getProperyByfirstway (); / ** * O segundo método de implementação obtém o valor da chave especificada no arquivo de propriedades * * @return */ string getProperyBySecondway (); / ** * O terceiro método de implementação obtém o valor da chave especificada no arquivo de propriedades * * @return */ string getProperyBythirdway (); / ** * O quarto método de implementação obtém o valor da chave especificada no arquivo de propriedades * * @param key * * @return */ string getProperyByfourthway (chave da string); / ** * O quarto método de implementação obtém o valor da chave especificada no arquivo de propriedades * * @param key * * @param defaultValue * * @return */ string getProperybyFourthway (chave de string, string defaultValue); / ** * O quinto método de implementação obtém o valor da chave especificada no arquivo de propriedades * * @param key * * @return */ string getProperyByFifthway (chave da string); / ** * O quinto método de implementação para obter o valor da chave especificada no arquivo de propriedades * * @param key * * @param defaultValue * * @return */ string getProperyByFifthway (chave da string, string defaultValue);}2. Crie e implemente a classe PropertiEsserviceImpl
pacote com.hafiz.www.service.impl; importar com.hafiz.www.service.propertiService; importar com.hafiz.www.util.propertyconfigurer; import.hafiz.wwwww.uty.propertyutil. org.springframework.beans.factory.annotation.value; importar org.springframework.stereotype.service;/*** desc: o programa Java obtém a classe de implementação do serviço do serviço que obtém o conteúdo do arquivo de propriedades* criado por Hafiz.zhang em 2016/16. */ @ServicePublic Classe PropertiEsserviceImpl implementa PropertiEsservice {@Value ("$ {test}") private String testDatabyfirst; @Value ("#{prop.test}") private string testDatabySecond; @Value ("#{PropertiesReader [test]}") private String testDatabythird; @AUTOWIRED PROPRIEDADE PROPRIECIONAL PC; @Override public String getProperyByfirstway () {return testDatabyfirst; } @Override public String getProperyBySecondway () {return testDatabySecond; } @Override public String getProperyBythirdway () {return testDatabythird; } @Override public String getProperyByFourthway (chave de string) {return pc.getProperty (key); } @Override public String getProperyByFourthway (chave de string, string defaultValue) {return pc.getProperty (key, defaultValue); } @Override public String getProperyByFifthway (chave de string) {return PropertyUtil.getPropery (key); } @Override public String getProperyByFifthway (chave da string, string defaultValue) {return propertyUtil.getProperty (key, defaultValue); }}3.
pacote com.hafiz.www.controller; importar com.hafiz.www.service.propertiEsservice; importar com.hafiz.www.util.propertyutil; importação org.springframework.beans.factory.annotation.aUtouwired; importer; org.springframework.web.bind.annotation.pathvariable; importar org.springframework.web.bind.annotation.requestMapping; importar org.springframework.web.bind.annotation.requestmethod; importação.springfringfringfring.web.web.web.anotation. DESC: Propriedades Controlador de teste* criado por Hafiz.zhang em 2016/9/16. */@Controlador@requestmapping ("/prop") classe pública PropertyController {@AUTOWIRed Private PropertiESSERVICE PS; @RequestMapping (value = "/Way/First", Method = requestMethod.get) @ResponseBody public String getPropertyByFirstway () {return ps.getProperyByfirstway (); } @RequestMapping (value = "/Way/Second", Method = requestMethod.get) @ResponseBody Public String getPropertyBySecondway () {return ps.getProperyBySecondway (); } @RequestMapping (value = "/way/terceira", método = requestMethod.get) @Responsebody public string getPropertyBythirdway () {return ps.getpropertythirdway (); } @RequestMapping (value = "/Way/Fourth/{key}", Method = requestMethod.get) @ResponseBody public String getPropertyByFourthway (@PathVariable ("key") String key) {return ps.getProperyByFourthway (key "," defaultValue "); } @RequestMapping (value = "/way/quinto/{key}", métodos = requestmethod.get) @ResponseBody public String getPropertyByFifthway (@Pathvariable ("key") string key) {return PropertyUtil.Groperty (key, "defaultValue"); }}4.JDBC.Properties Arquivo
jdbc.driver = com.mysql.jdbc.driverjdbc.url = jdbc: mysql: //192.168.1.196: 3306/dev? useUnicode = true & caracterenCoding = utf-8jdbc.username = rootjdb.pass ctive = 200jdbc.minidle = 5jdbc.initialsize = 1jdbc.maxwait = 60000jdbc.TimeBelewerEvictionRunsmillis = 60000jdbc.minevictableIdLetimEmillis = 300000JDBC.ValidationQuery = Select t_userjdbc.testWhileIdle=truejdbc.testOnReturn=falsejdbc.poolPreparedStatements=truejdbc.maxPoolPreparedStatementPerConnectionSize=20jdbc.filters=stat#test datatest=com.hafiz.www
5. Diagrama de resultados do projeto
6. Download do projeto: Demo http://xiazai.vevb.com/201612/yuanma/propertiesconfigurer_jb51.zip
7. Resultados dos testes
O primeiro método
A segunda maneira
A terceira maneira
O quarto método
O quinto método
6. Resumo
Através desta revisão e teste, entendemos o papel e o princípio da relação entre pais e filhos entre a primavera e o SpringMVC e o atributo Filters-Default-Default, que é mais facilmente ignorado ao digitalizar o pacote de tags do contexto: scan de componente. Ser capaz de localizar e resolver rapidamente os problemas encontrados novamente. Enfim, ótimo ~~~
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.