พื้นหลัง
เมื่อเร็ว ๆ นี้โครงการกำลังจะเปิดตัวและต้องมีการพัฒนาโปรแกรมการโยกย้ายข้อมูล ฟังก์ชั่นหลักของโปรแกรมคือการสืบค้นข้อมูลในฐานข้อมูลหนึ่งและนำเข้าสู่ฐานข้อมูลอื่นหลังจากการประมวลผลหลายชุด พิจารณาความสะดวกสบายและความเร็วในการพัฒนา โดยธรรมชาติฉันคิดว่าจะรวมเข้ากับฤดูใบไม้ผลิและ mybatis แม้แต่การใช้การสร้างรหัสอัตโนมัติของ MyBatis ก็สามารถประหยัดการพัฒนาของชั้น DAO ได้มากมาย
หลุมแห่งการรวม
โครงการก่อนหน้า: ฉันเคยมีโปรแกรมที่คล้ายกันนี้มาก่อนดังนั้นฉันจึงใช้การกำหนดค่าของสปริงและ mybatis รวมโดยตรงเพื่อแก้ไข การกำหนดค่าแบบรวมก่อนหน้านี้มีดังนี้:
1. การพิจารณาการกำหนดค่าของ URL ฐานข้อมูลและชื่อผู้ใช้และรหัสผ่านให้ใส่ข้อมูลนี้ลงในไฟล์คุณสมบัติ ใช้ในไฟล์กำหนดค่าสปริง
<บริบท: สถานที่ตั้งสถานที่ตั้งตำแหน่ง = "classpath: config.properties" />
2. การกำหนดค่าแบบรวมของ MyBatis และ Spring ในไฟล์การกำหนดค่าสปริงเป็นเช่นนี้
<bean id = "sqlsessionfactory"> <property name = "dataSource" ref = "dataSource" /> </ebean> <bean> <property name = "basepackage" value = "com.lagou.chat.record.transfer.dao" />
ไม่มีปัญหากับการกำหนดค่าข้างต้น ดังนั้นเพียงคัดลอกการกำหนดค่าไปยังโครงการใหม่
โครงการปัจจุบัน: คัดลอกการกำหนดค่าของโครงการเก่า แต่โครงการใหม่จำเป็นต้องเชื่อมต่อกับฐานข้อมูลสองฐานดังนั้นจึงจำเป็นต้องมีแหล่งข้อมูลสองแหล่ง (บันทึกและ IM) ตามธรรมชาติดังนั้นการกำหนดค่าแบบเก่าจะถูกแก้ไขดังนี้
1. การกำหนดค่าของการใช้ไฟล์คุณสมบัติยังคงไม่เปลี่ยนแปลง
2. ก่อนหน้านี้เนื่องจากมีแหล่งข้อมูลเพียงแหล่งเดียว (A SQLSessionFactory), <property name = "SQLSessionFactory" ref = "SQLSessionFactory"/> ไม่ได้รับการกำหนดค่าภายใต้ MappersCannerConfigurer เนื่องจากใช้ SQLSessionFactory เริ่มต้น แต่ตอนนี้มีแหล่งข้อมูลสองแหล่งที่ไม่ระบุพวกเขาจะนำไปสู่ความสับสนอย่างแน่นอน ดังนั้นการกำหนดค่าจะถูกแก้ไขดังนี้
<bean id = "record_sqlsessionfactory"> <property name = "dataSource" ref = "record_datasource" /> </ebean> <bean id = "config1"> <property name = "basepackage" value = "com.xxx.util.roll.rollback.dao /> </ebean> <bean id = "im_sqlsessionfactory"> <property name = "dataSource" ref = "im_datasource" /> </ebean> <bean id = "config2"> <property name = "basepackage" value = "com.xxx.util.rollback.im.dao" /> ref = "im_sqlsessionfactory" /> </ebean>
ผลลัพธ์คือเมื่อเรียกใช้โครงการใหม่คุณสมบัติเช่น $ {jdbc.url}, $ {jdbc.name} ในไฟล์การกำหนดค่าสปริงไม่สามารถแทนที่ได้ด้วยค่าที่ระบุในคุณสมบัติ ในตอนแรกฉันไม่ได้คาดหวังว่ามันเป็นเพราะการรวมกันของฤดูใบไม้ผลิและ mybatis ดังนั้นฉันยังคงตรวจสอบว่าไฟล์การกำหนดค่าสปริงผิดไม่ว่าไฟล์คุณสมบัติผิดหรือไม่ไม่ว่าไฟล์คุณสมบัติไม่ได้อ้างอิงหรือไฟล์คุณสมบัติไม่ได้เป็นไปไม่ได้ ฉันต้องหันไปทางอินเทอร์เน็ต ในที่สุดก็พบคำตอบ
วิธีการแก้ไข: เปลี่ยนการกำหนดค่าเป็นต่อไปนี้ปัญหาได้รับการแก้ไข:
<bean id = "record_sqlsessionfactory"> <property name = "dataSource" ref = "record_datasource" /> </ebean> <bean id = "config1"> <property name = "basepackage" value = "com.xxx.util.rollback.record.dao" /> value = "record_sqlsessionfactory" /> </ebean> <bean id = "im_sqlsessionfactory"> <property name = "dataSource" ref = "im_datasource" /> </ebean> <bean id = "config2"> name = "SQLSessionFactoryBeanName" value = "IM_SQLSessionFactory"/> </ebean>
มันคือการเปลี่ยนคุณสมบัติ SQLSessionFactory เป็น SQLSessionFactoryBeanName แน่นอนว่าการอ้างอิงจะต้องเปลี่ยนเป็นมูลค่า เพราะคุณสมบัติ sqlsessionfactorybeanname เป็นประเภทสตริง
เหตุผล
เมื่อใช้ org.mybatis.spring.mapper.mapperscannerConfigurer สำหรับการสแกนอัตโนมัติในฤดูใบไม้ผลิหาก SQLSessionFactory ตั้งค่าไว้
นี่เป็นเพราะ MapperscannerConigurer อยู่ในขั้นตอนการปรับความละเอียดของถั่ว หากคุณตั้งค่า SQLSessionFactory ในเวลานี้มันจะทำให้บางคลาสเริ่มต้นล่วงหน้า ในเวลานี้ผู้จัดงาน PropertyPlaceHolderConfigurer ยังไม่มีเวลาแทนที่ตัวแปรในคำจำกัดความส่งผลให้นิพจน์ถูกคัดลอกเป็นสตริง อย่างไรก็ตามหากไม่ได้ตั้งค่าคุณสมบัติ SQLSessionFactory คุณจำเป็นต้องตรวจสอบให้แน่ใจว่าชื่อ SessionFactory ในฤดูใบไม้ผลิจะต้องเป็น SQLSessionFactory มิฉะนั้นจะไม่ถูกฉีดโดยอัตโนมัติ
ข้างต้นคือข้อผิดพลาดของฤดูใบไม้ผลิที่รวม Mybatis เมื่อใช้ <บริบท: ผู้ถือทรัพย์สิน-สถานที่> ที่ฉันได้แนะนำให้รู้จักกับคุณ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!