1. 배경
최근 프로젝트 개발 과정에서 동적 판독 및 Java 프로그램 변수 변경을 위해 속성 파일의 일부 사용자 정의 변수를 정의 해야하는 문제가 발생했으며 더 이상 코드를 수정할 필요가 없습니다. 이 기회를 통해 Java 프로그램을 통해 Spring+SpringMVC+Mybatis의 통합 개발 프로젝트에서 속성 파일의 내용을 정리하고 분석하여 먼저 공유합니다.
2. 프로젝트 환경 소개
이를 구현하는 3 ~ 5 가지 방법
메소드 1. 컨텍스트를 통해 구성 파일 jdbc.properties에 내용을로드합니다.
<Context : Property-Placeholder Location = "ClassPath : jdbc.properties"gnore-unresolvable = "true"/>
위 구성은 다음 구성과 동일하며 다음 구성의 단순화입니다.
<bean id = "propertyconfigurer"> <property name = "ingoreUnresolvable placeholders"value = "true"/> <property name = "locts"> <list> <value> classpath : jdbc.properties </value> </list> </bean>
참고 : 이러한 방식으로 Spring-MVC.XML 파일에 다음 구성이있는 경우 기능 및 원리에 대해 다음과 같은 빨간색 부분을 놓치지 않아야합니다.
<!-구성 요소 스캐닝을 구성하고 SpringMVC 컨테이너에서만 컨트롤러 주석 만 스캔됩니다-> <context : component-scan base-package = "com.hafiz.www"use-default-filters = "false"> <context : filter type = "annotation"표현 = "org.springframework.steretype.controller"/>>>> contetroompant.
방법 2. 주석을 사용한 주입, 주로 Java 코드의 주석을 사용하여 속성 파일의 해당 값을 주입합니다.
<bean id = "prop"> <!- 이것은 속성 factoryBean 클래스입니다. 또한 위의 속성이있는 위치와 마찬가지로 배열을 수신합니다 .-> <propertion name = "locations"> <Array> <atole> classpath : jdbc.properties </value> </array> </property> </bean>
방법 3. Util : Properties Tag를 사용하여 속성 파일에 내용을 노출시킵니다.
<util : 속성 id = "propertiesReader"location = "classpath : jdbc.properties"/>
참고 : 위의 줄 구성을 사용하면 Spring-dao.xml 파일의 헤더에서 다음 빨간색 부분을 선언해야합니다.
<beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://www.w3.org/2001/xmlschema-instance"xmlns : context = "http://wwww.spramframett" xmlns : util = "http://www.springframework.org/schema/util"xsi : schemalocation = "http://www.springframework.org/schema/beans http://ww.springframework.org/schema/beans/spred-bean-2 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd ">
방법 4. PropertyPlaceHolderConfigurer를 통해 컨텍스트를로드 할 때 프로그램에 사용하기 위해 사용자 정의 서브 클래스의 속성에 속성을 노출시킵니다.
<bean id = "propertyconfigurer"> <property name = "ingoreUnresolvable placeholders"value = "true"/> <property name = "ingoreSourcenotFound"value = "true"/<property name = "list> <slist> value> classpath : jdbc.properties </value> </bean> </bean>
Custom Class PropertyConfigurer의 선언은 다음과 같습니다.
package com.hafiz.www.util; import org.springframework.beans.beansexception; import org.springframework.bean.beans.config.config.config.configurablelistablebeantory; import org.spramework.beans.beans.bean.bean.bean.bean.bean.properplaceplaceconfigurer;/* java.utile* java.utile* java.utilderconfiger; DESC : 속성 구성 파일 읽기 클래스* 2016/9/14에 Hafiz.zhang에 의해 생성되었습니다. */Public Class PropertyConfigurer는 PropertyPlaceHolderConfigurer를 확장합니다. // 속성 구성 파일 키-값 결과 @OverRide Protected ProcessProperties (configurableBleistableBeanFactory BeanFactoryToprocess, Properties Propts)는 Beansexception {Super.processProperties (BeanCrocessProcess, Props); this.props = props; } public String getProperty (문자열 키) {return this.props.getProperty (키); } public String getProperty (문자열 키, 문자열 기본값) {reture this.props.getProperty (키, defaultValue); } public Object setProperty (문자열 키, 문자열 값) {reture this.props.setProperty (키, 값); }}사용 방법 : 사용해야하는 클래스에서 @autowired 주석 주입을 사용하십시오.
방법 5. 도구 클래스 속성을 사용자 정의하고 클래스의 정적 정적 코드 블록에서 속성 파일 내용을 읽고 다른 프로그램에서 사용하기 위해 정적 속성에 저장하십시오.
package com.hafiz.www.util; import org.slf4j.logger; import org.slf4j.loggerfactory; import java.io. */public class propertyUtil {private static final logger logger = loggerfactory.getLogger (propertyUtil.class); 개인 정적 속성 소품; 정적 {loadProps (); } 동기화 된 정적 개인 void loadProps () {logger.info ( "속성을로드 시작 파일 내용 ......"); props = 새로운 속성 (); inputStream in = null; {<!-첫 번째 유형, 클래스 로더를 통해 속성 파일 스트림을 얻습니다-> in = propertyutil.class.getClassLoader (). getResourCeasStream ( "jdbc.properties"); <! -S props.load (in); } catch (filenotfoundException e) {logger.error ( "jdbc.properties 파일을 찾을 수 없음"); } catch (ioexception e) {logger.error ( "ioexception sexect"); } 마침내 {try {if (null! = in) {in.close (); }} catch (ioexception e) {logger.error ( "JDBC.Properties 파일 스트림이 닫힌 예외"); }} logger.info ( "속성 파일의 내용을로드 ........."); logger.info ( "속성 파일 내용 :" + propss); } public static String getProperty (String key) {if (null == propss) {loadProps (); } return propss.getProperty (키); } public static string getProperty (문자열 키, 문자열 defaultValue) {if (null == props) {loadProps (); } return propss.getProperty (키, defaultValue); }}참고 : 이러한 방식으로 클래스가로드되면 지정된 위치에서 구성 파일 컨텐츠를 자동으로 읽고 효율적이고 편리하며 한 번에로드하여 여러 번 사용할 수 있습니다.
4. 예방 조치와 제안
처음 세 가지 방법은 위 5 가지 방법에서 강력합니다. @Controller 주석이 달린 Bean에서 사용하려면 SpringMVC의 구성 파일 Spring-MVC.xml로 선언해야합니다. @Service, @Respository 등이있는 Bean에서 사용하려면 Spring.xml에서 Spring의 구성 파일로 선언해야합니다.
개인적으로 네 번째 및 다섯 번째 구성 방법을 추천합니다. 다섯 번째가 최고입니다. 도구와 같은 객체에 주입 할 필요조차 없으며 획득을위한 정적 방법을 직접 호출하며 한 번만로드하여 매우 효율적입니다. 또한 처음 세 가지 방법은 그다지 유연하지 않으며 @Value의 주요 값이 필요합니다.
5. 사용 가능한지 확인하려면 테스트하십시오
1. 먼저 propertiesservice를 만듭니다
package com.hafiz.www.service;/** * desc : Java 프로그램은 2016/9/16에 Hafiz.zhang에 의해 생성 된 속성 파일 *의 컨텐츠 서비스를받습니다. */public interface propertiesservice {/** * 첫 번째 구현 방법은 속성 파일에서 지정된 키의 값을 가져옵니다 * * @return */String getProperyByFirstway (); / ** * 두 번째 구현 방법은 속성 파일에서 지정된 키의 값을 가져옵니다 * * @return */ String getProperyByseCondway (); / ** * 세 번째 구현 방법은 속성 파일에서 지정된 키의 값을 가져옵니다 * * @return */ String getProperyBythirdway (); / ** * 네 번째 구현 방법은 속성 파일에서 지정된 키의 값을 가져옵니다 * @param key * * @return */ String getProperyByFourthway (String key); / ** * 네 번째 구현 방법은 속성 파일에서 지정된 키의 값을 가져옵니다 * * @param key * * @param defaultValue * * @return */ String getProperyByFourthway (문자열 키, String defaultValue); / ** * 다섯 번째 구현 방법은 속성 파일에서 지정된 키의 값을 가져옵니다 * * @param key * * @return */ String getProperyByFifThway (String key); / ** * 속성 파일에서 지정된 키의 값을 얻는 다섯 번째 구현 방법 * * @param key * * @param defaultValue * */ string getProperyByFifthway (String key, String defaultValue);}2. 클래스 propertiesserviceimpl을 만들고 구현하십시오
package 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.beans.cormory org.springframework.bean.beans.annotation.value; import org.springframework.stereotype.service;/*** desc : Java 프로그램은 2016/9/16에 Hafiz.zhang에서 만든 속성 파일*의 컨텐츠를 얻는 서비스 구현 클래스를 얻습니다. */ @servicepublic class propertiesserviceimpl은 propertiesservice {@Value ( "$ {test}") private String testDatabyFirst; @Value ( "#{prop.test}") 개인 문자열 testDatabysecond; @Value ( "#{propertiesReader [test]}") private String testDatabythird; @autowired Primes PropertyConfigurer PC; @override public String getProperyByFirstway () {return testDatabyFirst; } @override public string getProperyByseCondway () {return testDatabysecond; } @override public String getProperyBythirdway () {return testDatabythird; } @override public string getProperyByFourthway (String Key) {return pc.getProperty (키); } @override public string getProperyByFourthway (문자열 키, 문자열 defaultValue) {return pc.getProperty (key, defaultValue); } @override public String getProperyByFifthway (String key) {return propertyUtil.getPropery (키); } @override public string getProperyByFifThway (String key, String defaultValue) {return propertyUtil.getProperty (키, defaultValue); }}3. 컨트롤러 클래스 PropertyController
package 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 org.springframework.bind.annotation.requestMethod; 컨트롤러* 2016/9/16에 Hafiz.zhang이 작성했습니다. */@controller@requestmapping ( "/prop") public class propertycontroller {@autowired private propertiesservice ps; @requestmapping (value = "/way/first", method = requestmethod.get) @ResponseBody public String getPropertyByFirstway () {return ps.getProperyByFirstway (); } @requestmapping (value = "/way/secon } @RequestMapping (value = "/way/thred", method = requestMethod.get) @ResponseBody public String getPropertyBythirdway () {return ps.getProperyBythirdway (); } @requestmapping (value = "/way/fourth/{key}", method = requestmethod.get) @ResponseBody public String getProperTyBariable ( "key") {return ps.getProperyBorthway (key, "defaultValue"); } @requestmapping (value = "/way/fifth/{key}", method = requestmethod.get) @ResponseBody public String getProperTyBarible ( "key") String key) {retud propertyUtil.getProperty (key, "defaultValue"); }}4.jdbc.properties 파일
jdbc.driver = com.mysql.jdbc.driverjdbc.url = jdbc : mysql : //192.168.1.196 : 3306/dev? useunicode = true & charac ctive = 200jdbc.minidle = 5jdbc.initialsize = 1jdbc.maxwait = 60000jdbc.timebetweenevictionRunsmillis = 60000jdbc.minevictableDletimemillis = 300000jdbc.validationquery = select 1에서 t_userjdbc.testSTHILEIDLE = truejdbc.testonReturn = falsejdbc.poolpreparedStatements = truejdbc.maxPoolPreparedStatementPerConnectionsize = 20jdbc.filters = stat#test datatest = com.hafiz.www
5. 프로젝트 결과 다이어그램
6. 프로젝트 다운로드 : 데모 http://xiazai.vevb.com/201612/yuanma/propertiesconfigurer_jb51.zip
7. 테스트 결과
첫 번째 방법
두 번째 방법
세 번째 방법
네 번째 방법
다섯 번째 방법
6. 요약
이 검토 및 테스트를 통해 Spring과 SpringMVC 사이의 부모-자식 컨테이너 관계의 역할과 원리와 Context : Component-Scan Tag Pack 다시 발생하는 문제를 더 잘 찾아서 빠르게 해결할 수 있어야합니다. 어쨌든, 그레이트 ~~~
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.