1. พื้นหลัง
เมื่อเร็ว ๆ นี้ในระหว่างกระบวนการพัฒนาโครงการฉันพบปัญหาที่ฉันต้องการในการกำหนดตัวแปรที่กำหนดเองบางอย่างในไฟล์คุณสมบัติสำหรับการอ่านแบบไดนามิกและการเปลี่ยนตัวแปรของโปรแกรม Java และไม่จำเป็นต้องแก้ไขรหัสอีกต่อไป ฉันใช้โอกาสนี้ในการจัดเรียงและวิเคราะห์เนื้อหาของไฟล์คุณสมบัติในโครงการพัฒนาแบบบูรณาการของ Spring+SpringMVC+MyBatis ผ่านโปรแกรม Java และแบ่งปันกับคุณก่อน
2. การแนะนำสภาพแวดล้อมของโครงการ
สามหรือห้าวิธีในการใช้งาน
วิธี 1. โหลดเนื้อหาในไฟล์การกำหนดค่า jdbc.properties ผ่านบริบท: Property-Placeholder
<บริบท: สถานที่ตั้งสถานที่ตั้งตำแหน่ง = "classpath: jdbc.properties" เพิกเฉยต่อ -unresolvable = "true"
การกำหนดค่าข้างต้นเทียบเท่ากับการกำหนดค่าต่อไปนี้ซึ่งเป็นการทำให้ง่ายขึ้นของการกำหนดค่าต่อไปนี้
<bean id = "PropertyConfigurer"> <property name = "istignoreUnResolVablePlaceHolders" value = "true"/> <property name = "locations"> <list> <value> classpath: jdbc.properties </value> </list>
หมายเหตุ: ด้วยวิธีนี้หากคุณมีการกำหนดค่าต่อไปนี้ในไฟล์ Spring-MVC.XML คุณจะต้องไม่พลาดส่วนสีแดงต่อไปนี้เกี่ยวกับฟังก์ชั่นและหลักการของมัน
<!-กำหนดค่าการสแกนส่วนประกอบมีเพียงคำอธิบายประกอบคอนโทรลเลอร์เท่านั้นที่สแกนในคอนเทนเนอร์ SpringMVC-> <บริบท: Component-Scan base-package = "com.hafiz.www" Use-default-filters = "False"> <บริบท
วิธีที่ 2. การฉีดโดยใช้คำอธิบายประกอบส่วนใหญ่ฉีดค่าที่สอดคล้องกันในไฟล์คุณสมบัติโดยใช้คำอธิบายประกอบในรหัส Java
<bean id = "prop"> <!- นี่คือคลาส PropertiesFactoryBean นอกจากนี้ยังมีคุณสมบัติตำแหน่งซึ่งยังได้รับอาร์เรย์เช่นเดียวกับด้านบน-> <property name = "locations"> <rray> <value> classpath: jdbc.properties </alues> </erray> </property> </ebean>
วิธีที่ 3. ใช้แท็ก UTIL: Properties เพื่อเปิดเผยเนื้อหาในไฟล์คุณสมบัติ
<util: คุณสมบัติ id = "propertiesReader" ตำแหน่ง = "classpath: jdbc.properties"/>
หมายเหตุ: การใช้การกำหนดค่าบรรทัดด้านบนคุณต้องประกาศส่วนสีแดงต่อไปนี้ในส่วนหัวของไฟล์ Spring-DAO.xml
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance xmlns: util = "http://www.springframework.org/schema/util" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/util/spring-util.xsd ">
วิธีการ 4. แสดงคุณสมบัติไปยังคุณสมบัติของคลาสย่อยที่กำหนดเองสำหรับใช้ในโปรแกรมเมื่อโหลดบริบทผ่าน PropertyPlaceHolderConfigurer
<bean id = "PropertyConfigurer"> <property name = "istenreunresolvableplaceholders" value = "true"/> <property name = "MolonderEsourCenotFound" value = "true"/> <property name = "locations"> <list>
คำแถลงของ PropertyConfigurer ที่กำหนดเองมีดังนี้:
แพ็คเกจ com.hafiz.www.util; นำเข้า org.springframework.beans.beansexception; นำเข้า org.springframework.beans.factory.config.configurableListablebeanfactory; นำเข้า org.springframework.beans.beans. java.util.properties;/*** desc: คุณสมบัติการกำหนดค่าไฟล์การกำหนดค่าไฟล์* สร้างโดย hafiz.zhang เมื่อ 2016/9/14 */Public Class PropertyConfigurer ขยาย PropertyPlaceHolderConFigurer {อุปกรณ์ประกอบคุณสมบัติส่วนตัว; // เข้าถึงคุณสมบัติการกำหนดค่าไฟล์ Key-value ผลลัพธ์ @Override Void ProcessProperties (configurableListableBeanFactory beanfactoryToproperties, Properties อุปกรณ์ประกอบฉาก) พ่น beansexception {super.processproperties (beanfactorytoprocess this.props = อุปกรณ์ประกอบฉาก; } สตริงสาธารณะ getProperty (คีย์สตริง) {return this.props.getProperty (คีย์); } สตริงสาธารณะ getProperty (คีย์สตริง, สตริง defaultValue) {return this.props.getProperty (คีย์, defaultValue); } วัตถุสาธารณะ setProperty (คีย์สตริง, ค่าสตริง) {return this.props.setProperty (คีย์, ค่า); -วิธีใช้: เพียงแค่ใช้การฉีดคำอธิบายประกอบ @autowired ในชั้นเรียนที่คุณต้องใช้
วิธี 5. ปรับแต่ง PropertyUtil คลาสเครื่องมือและอ่านเนื้อหาไฟล์คุณสมบัติในบล็อกรหัสคงที่คงที่ของคลาสและบันทึกไว้ในคุณสมบัติคงที่สำหรับการใช้งานโดยโปรแกรมอื่น ๆ
แพ็คเกจ com.hafiz.www.util; นำเข้า org.slf4j.logger; นำเข้า org.slf4j.loggerfactory; นำเข้า java.io.*; นำเข้า java.util.properties;/*** Desc: คุณสมบัติการจัดหาไฟล์ */คลาสสาธารณะ PropertyUtil {ส่วนตัว Logger สุดท้ายคงที่ logger = loggerFactory.getLogger (PropertyUtil.Class); อุปกรณ์ประกอบฉากคงที่ส่วนตัว คงที่ {loadprops (); } synchronized private private void loadprops () {logger.info ("เริ่มการโหลดคุณสมบัติของไฟล์คุณสมบัติ ...... "); อุปกรณ์ประกอบฉาก = คุณสมบัติใหม่ (); inputStream ใน = null; ลอง {<!-ประเภทแรกได้รับสตรีมไฟล์คุณสมบัติผ่านคลาสโหลดเดอร์-> in = propertyUtil.class.getClassLoader (). getResourceasstream ("jdbc.properties"); <!-ประเภทที่สองรับการสตรีมไฟล์คุณสมบัติผ่านคลาส-> // ใน = PropertyUtil.class.getResourceasstream ("/jdbc.properties"); props.load (in); } catch (filenotfoundexception e) {logger.error ("ไฟล์ jdbc.properties ไม่พบ"); } catch (ioexception e) {logger.error ("ioexception ปรากฏ"); } ในที่สุด {ลอง {ถ้า (null! = in) {in.close (); }} catch (ioexception e) {logger.error ("ปิดข้อยกเว้นด้วย jdbc.properties สตรีมไฟล์ปิด"); }} logger.info ("การโหลดเนื้อหาของไฟล์คุณสมบัติ ......... "); logger.info ("คุณสมบัติไฟล์คุณสมบัติ:" + อุปกรณ์ประกอบฉาก); } สตริงคงที่สาธารณะ getProperty (คีย์สตริง) {ถ้า (null == อุปกรณ์ประกอบฉาก) {loadProps (); } กลับ props.getProperty (คีย์); } สตริงคงที่สาธารณะ getProperty (คีย์สตริง, สตริง defaultValue) {ถ้า (null == อุปกรณ์ประกอบฉาก) {loadProps (); } return props.getProperty (คีย์, defaultValue); -หมายเหตุ: ด้วยวิธีนี้เมื่อคลาสถูกโหลดมันจะอ่านเนื้อหาไฟล์กำหนดค่าในตำแหน่งที่ระบุโดยอัตโนมัติและบันทึกลงในคุณสมบัติคงที่ซึ่งมีประสิทธิภาพและสะดวกและสามารถโหลดได้ในครั้งเดียวและใช้หลายครั้ง
4. ข้อควรระวังและคำแนะนำ
สามวิธีแรกนั้นเข้มงวดในห้าวิธีข้างต้น และหากคุณต้องการใช้มันในถั่วที่มีคำอธิบายประกอบ @Controller คุณต้องประกาศในไฟล์การกำหนดค่าของ SpringMVC Spring-MVC.XML หากคุณต้องการใช้มันในถั่วที่มี @Service, @Respository ฯลฯ คุณต้องประกาศใน Spring.xml ในไฟล์การกำหนดค่าของฤดูใบไม้ผลิ
ฉันแนะนำวิธีการกำหนดค่าที่สี่และห้า ที่ห้าดีที่สุด มันไม่จำเป็นต้องถูกฉีดเข้าไปในวัตถุที่มีลักษณะคล้ายเครื่องมือและเรียกวิธีการคงที่โดยตรงสำหรับการได้มาและโหลดเพียงครั้งเดียวซึ่งมีประสิทธิภาพสูง ยิ่งกว่านั้นสามวิธีแรกไม่ยืดหยุ่นมากและจำเป็นต้องมีค่าคีย์ของ @Value
5. ทดสอบเพื่อตรวจสอบว่ามีอยู่หรือไม่
1. ก่อนอื่นเราสร้าง Propertiesservice
แพ็คเกจ com.hafiz.www.service;/** * desc: โปรแกรม Java ได้รับบริการของเนื้อหาของไฟล์คุณสมบัติ * สร้างโดย hafiz.zhang เมื่อปี 2016/9/16 */propertiesservice อินเตอร์เฟสสาธารณะ {/** * วิธีการใช้งานครั้งแรกได้รับค่าของคีย์ที่ระบุในไฟล์คุณสมบัติ * * @return */string getProperyByFirstway (); / ** * วิธีการใช้งานที่สองได้รับค่าของคีย์ที่ระบุในไฟล์คุณสมบัติ * * @return */ String getProperyBysecondway (); / ** * วิธีการใช้งานที่สามได้รับค่าของคีย์ที่ระบุในไฟล์คุณสมบัติ * * @return */ String getProperyByThirdway (); / ** * วิธีการใช้งานที่สี่ได้รับค่าของคีย์ที่ระบุในไฟล์คุณสมบัติ * * @param คีย์ * * @return */ สตริง getProperyByFourthway (คีย์สตริง); / ** * วิธีการใช้งานที่สี่ได้รับค่าของคีย์ที่ระบุในไฟล์คุณสมบัติ * * @param คีย์ * * @param defaultValue * * @return */ สตริง getProperyByFourthway (คีย์สตริงสตริงเริ่มต้น / ** * วิธีการใช้งานที่ห้าได้รับค่าของคีย์ที่ระบุในไฟล์คุณสมบัติ * * @param คีย์ * * @return */ String getProperyByFifthway (คีย์สตริง); / ** * วิธีการใช้งานที่ห้าเพื่อรับค่าของคีย์ที่ระบุในไฟล์คุณสมบัติ * * @param คีย์ * * @param defaultValue * * @return */ string getProperyByFifthway (คีย์สตริงสตริง defaultValue);}2. สร้างและใช้งานคลาส PropertiesserviceImpl
แพ็คเกจ com.hafiz.www.service.impl; นำเข้า com.hafiz.www.service.propertiesservice; นำเข้า com.hafiz.www.util.propertyconfigurer; นำเข้า com.hafiz.ww.util.propertyutil; org.springframework.beans.factory.annotation.value; นำเข้า org.springframework.stereotype.service;/*** desc: โปรแกรม Java ได้รับการดำเนินการบริการของบริการที่ได้รับเนื้อหาของไฟล์คุณสมบัติ* */ @ServicePublic Class PropertiesserviceImpl ใช้ PropertIesservice {@Value ("$ {test}") สตริงส่วนตัว TestDatabyFirst; @Value ("#{prop.test}") สตริงส่วนตัว testDatabysecond; @Value ("#{propertiesReader [test]}") สตริงส่วนตัว testDatabythird; @autowired Private PropertyConfigurer PC; @Override สตริงสาธารณะ getProperyByFirstway () {return testDatabyfirst; } @Override สตริงสาธารณะ getProperyBySecondway () {return testDatabysecond; } @Override Public String getProperyByThirdway () {return testDatabythird; } @Override สตริงสาธารณะ getProperyByFourthway (คีย์สตริง) {return pc.getProperty (คีย์); } @Override สตริงสาธารณะ getProperyByFourthway (คีย์สตริง, สตริง defaultValue) {return pc.getProperty (คีย์, defaultValue); } @Override Public String getProperyByFifthway (คีย์สตริง) {ส่งคืน PropertyUtil.getPropery (คีย์); } @Override สตริงสาธารณะ getProperyByFifthway (คีย์สตริง, สตริง defaultValue) {ส่งคืน propertyUtil.getProperty (คีย์, defaultValue); -3. คอนโทรลเลอร์คลาส PropertyController
แพ็คเกจ com.hafiz.www.controller; นำเข้า com.hafiz.www.service.propertiesservice; นำเข้า com.hafiz.ww.util.propertyutil; นำเข้า org.springframework.beans.factory.annotation.autowired; org.springframework.web.bind.annotation.pathvariable; นำเข้า org.springframework.web.bind.annotation.Requestmapping; นำเข้า org.springframework.web.bind.annotation.RequestMethod; DESC: Properties Test Controller* สร้างโดย Hafiz.zhang เมื่อวันที่ 2016/9/16 */@Controller@requestmapping ("/prop") คลาสสาธารณะ PropertyController {@autowired Private Propertiesservice PS; @RequestMapping (value = "/way/first", method = requestMethod.get) @ResponseBody สตริงสาธารณะ getPropertyByFirstway () {return ps.getProperyByFirstway (); } @RequestMapping (value = "/way/second", method = requestMethod.get) @ResponseBody สตริงสาธารณะ getPropertyBySecondway () {return ps.getProperyBysecondway (); } @RequestMapping (value = "/way/third", method = requestMethod.get) @ResponseBody สตริงสาธารณะ getPropertyByThirdway () {return ps.getProperyByThirdway (); } @RequestMapping (value = "/way/fourth/{key}", method = requestMethod.get) @ResponseBody สตริงสาธารณะ getPropertyByFourthway (@PathVariable ("คีย์") คีย์) } @RequestMapping (value = "/way/fifth/{key}", method = requestMethod.get) @ResponseBody สตริงสาธารณะ getPropertyByFifthway (@PathVariable ("คีย์") คีย์) -4.jdbc.properties ไฟล์
jdbc.driver = com.mysql.jdbc.driverjdbc.url = jdbc: mysql: //192.168.1.196: 3306/dev? useunicode = true & cylateencoding = utf-8jdbc.username = rootjdbc. ctive = 200jdbc.minidle = 5jdbc.initialsize = 1jdbc.maxwait = 60000jdbc.timebetweenevictionrunsmillis = 60000jdbc.minevictableidletiTimeMillis = 300000jdbc.validationquery = Select 1 จาก 1 จาก 1 T_USERJDBC.TESTHIRHYIDLE = trueJdBc.TestOnReturn = falsejdbc.poolpreparedStatements = truejdbc.maxproperedStatementPerconnectionize = 20jdbc.filters = stat#test datatest = com.hafiz.wwwwwwwwwwwwwwwwwwwwwwwwwwwww
5. แผนภาพผลลัพธ์โครงการ
6. การดาวน์โหลดโครงการ: ตัวอย่าง http://xiazai.vevb.com/201612/yuanma/propertiesconfigurer_jb51.zip
7. ผลการทดสอบ
วิธีแรก
วิธีที่สอง
วิธีที่สาม
วิธีที่สี่
วิธีที่ห้า
6. สรุป
จากการตรวจสอบและการทดสอบนี้เราเข้าใจถึงบทบาทและหลักการของความสัมพันธ์ของคอนเทนเนอร์พ่อแม่ลูกระหว่าง Spring และ SpringMVC และแอตทริบิวต์การใช้ไฟฟิลด์ฟิลเตอร์ที่มองข้ามได้ง่ายที่สุดเมื่อสแกนบริบท: แพ็คเกจแท็กส่วนประกอบสแกน สามารถค้นหาได้ดีขึ้นและแก้ปัญหาที่พบได้อย่างรวดเร็วอีกครั้ง อย่างไรก็ตามเยี่ยมมาก ~~~
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น