คำนำ
บทความนี้จะมุ่งเน้นไปที่การอธิบายการใช้คำอธิบายประกอบ @PropertySource ในฤดูใบไม้ผลิและวิธีการโหลดไฟล์กำหนดค่าที่ระบุผ่านคุณสมบัติ PropertySource คำอธิบายประกอบ นอกจากนี้ยังใช้คำอธิบายประกอบ PropertySource และคำอธิบายประกอบ @ConfigurationProperties ฉันจะไม่พูดด้านล่างมากนักลองเรียนและศึกษากับบรรณาธิการ
1.1. PropertySource Annotation โหลดไฟล์คุณสมบัติที่ระบุ
Framework Spring ให้คำอธิบายประกอบคุณสมบัติ Source โดยมีวัตถุประสงค์ในการโหลดไฟล์คุณสมบัติที่ระบุ ต่อไปลองมาดูวิธีใช้คำอธิบายประกอบนี้ ก่อนอื่นเรากำหนดคลาสการกำหนดค่าและเพิ่มคุณสมบัติของแหล่งข้อมูลในชั้นเรียนดังนี้:
@component@propertySource (value = {"classpath: config/jdbc-bainuo-dev.properties"}, ไม่รู้ว่า yoursourcenotfound = false, encoding = "utf-8", name = "jdbc-bainuo-dev.properties" สตริงสาธารณะ getUrl () {return url; } โมฆะสาธารณะ setUrl (rl String) {this.url = url; } @Override สตริงสาธารณะ toString () {return "comveryDataSourceConfig {" + "url = '" + url +'/'' + '}'; - วัตถุประสงค์ของรหัสข้างต้นคือการโหลด jdbc-bainuo-dev.properties ในไฟล์กำหนดค่าในเส้นทาง classpath ในกรณีที่การเข้ารหัสใช้เพื่อระบุการเข้ารหัสที่ใช้ในการอ่านไฟล์คุณสมบัติเรามักจะใช้ UTF-8; ความไม่รู้ว่าแหล่งข้อมูลหมายถึงการรายงานข้อผิดพลาดเมื่อไม่มีไฟล์กำหนดค่าที่ระบุและค่าเริ่มต้นเป็นเท็จ ตัวอย่างเช่นไฟล์คุณสมบัติการโหลดที่ระบุไว้ข้างต้นคือ jdbc-bainuo-dev.properties หากไฟล์ไม่มีอยู่โปรแกรมจะไม่รายงานข้อผิดพลาดเมื่อไม่รู้ว่าพวกเขาจะเป็นจริง หากไม่รู้ว่าพวกเขาเป็นเท็จโปรแกรมจะรายงานข้อผิดพลาดโดยตรง ในการพัฒนาโครงการที่แท้จริงเป็นการดีที่สุดที่จะตั้งค่าความไม่รู้ว่ามาเป็นเท็จ ค่าเริ่มต้นของพารามิเตอร์นี้เป็นเท็จ
ค่าค่าคือการตั้งค่าไฟล์แอตทริบิวต์ที่จะโหลดและสามารถโหลดคุณสมบัติหลายอย่างในครั้งเดียว ค่าของชื่อที่เราตั้งไว้คือ jdbc-bainuo-dev.properties ค่านี้จะต้องไม่ซ้ำกันในสภาพแวดล้อม Springboot หากไม่ได้ตั้งค่าค่าคือ: " class path resource [config/jdbc-bainuo-dev.properties] "
หลายคนอาจสงสัยว่าทำไมจึงเป็น " class path resource [config/jdbc-bainuo-dev.properties] "? สิ่งนี้เกี่ยวข้องกับทรัพยากรคลาส Encapsulation ในฤดูใบไม้ผลิสำหรับไฟล์ทรัพยากร ค่าที่เรากำหนดค่าไว้ข้างต้นคือ " classpath:config/jdbc-bainuo-dev.properties " ดังนั้นฤดูใบไม้ผลิพบว่ามันเริ่มต้นด้วย classpath ดังนั้นจุดสิ้นสุดจึงใช้คลาสย่อย classpathresource หากเริ่มต้นด้วยไฟล์คลาสที่คุณใช้คือ FilesystemResource
หลังจากทำความเข้าใจคลาสทรัพยากรที่อธิบายไว้ข้างต้น มาทำให้ชัดเจนอีกครั้งว่าหากค่าชื่อไม่ได้ตั้งค่าใน @PropertySource กฎการสร้างชื่อคือ: ค้นหาคลาสย่อยทรัพยากรที่ห่อหุ้มขั้นสุดท้ายตามค่าของค่าแล้วเรียกใช้วิธี getDescription ในวัตถุอินสแตนซ์คลาสย่อยทรัพยากรเฉพาะ ค่าส่งคืนของวิธี getDescription เป็นค่าชื่อสุดท้าย
ตัวอย่างเช่นวิธี getDescription ในคลาส classpathresource ถูกนำไปใช้ดังนี้:
สตริงสาธารณะ getDescription () {StringBuilder builder = new StringBuilder ("ทรัพยากรพา ธ คลาส ["); สตริง pathtouse = path; if (this.clazz! = null &&! pathtouse.startswith ("/")) {builder.append (classutils.classpackageasresourcepath (this.clazz)); builder.append ('/'); } if (pathtouse.startswith ("/")) {pathtouse = pathtouse.substring (1); } builder.append (pathtouse); builder.append (']'); return builder.toString ();} ตรรกะการประมวลผลชื่อด้านบนอาจสร้างความประทับใจชั่วคราวและซอร์สโค้ดจะถูกติดตามอย่างละเอียดเพื่อคำอธิบายในอนาคต
1.2. PropertySource Annotation โหลดการทดสอบไฟล์คุณสมบัติที่ระบุ
ในด้านบนเราตั้งค่าคำอธิบายประกอบคุณสมบัติ Source เพื่อโหลดไฟล์ "classpath:config/jdbc-bainuo-dev.properties" โครงสร้างไดเรกทอรีของไฟล์นี้แสดงในรูปด้านล่าง:
เนื้อหาของไฟล์ JDBC-Bainuo-Dev.Properties มีดังนี้:
Spring.datasource.shareniu.url = Shareniu
เนื้อหาของแอปพลิเคชันไฟล์ properties มีดังนี้:
Spring.profiles.active = dev
ในไฟล์การกำหนดค่าข้างต้นคุณสมบัติ spring.profiles.active กำหนดค่าสภาพแวดล้อมปัจจุบันที่ใช้คือ dev spring.datasource.shareniu.url เป็นเพียงทรัพย์สินทั่วไปและไม่มีความหมายพิเศษในตัวเอง
มาเริ่มเขียนคลาสเริ่มต้นของ Springboot ดังนี้:
@SpringBootaplicplicationPublic คลาสการสาธิต {โมฆะคงที่สาธารณะหลัก (String [] args) {SpringApplication SpringApplication = SpringApplication ใหม่ (DemoApplication.class); configurableapplicationContext configurableapplicationContext = springapplication.run (args); CustomerDataSourceConFig1 CustomerDataSourceConfig = configurableapplicationContext .getBean (CustomerDataSourceConfig1.class); System.out.print (CustomerDatasourceConfig);}} เรียกใช้รหัสด้านบนและผลลัพธ์ของโปรแกรมมีดังนี้:
CustomerDataSourceConfig {url = 'null'} แปลกทำไม URL จึงว่างเปล่า? PropertySource Annotation ไม่ได้โหลดไฟล์ jdbc-bainuo-dev.properties ลงในสภาพแวดล้อมปัจจุบันหรือไม่? เราอาจลองดูว่า spring.datasource.shareniu.url คุณสมบัติใน jdbc-bainuo-dev.properties สามารถรับได้หรือไม่จากนั้นตรวจสอบจากด้านข้างที่ PropertySource Annotation ได้โหลดไฟล์ jdbc-bainuo-dev.properties ในปัจจุบัน
แก้ไขรหัสของคลาสเริ่มต้นข้างต้นดังนี้:
@SpringBootaplicplicationPublic คลาสการสาธิต {โมฆะคงที่สาธารณะหลัก (String [] args) {SpringApplication SpringApplication = SpringApplication ใหม่ (DemoApplication.class); configurableapplicationContext configurableapplicationContext = springapplication.run (args); CustomerDataSourceConFig1 CustomerDataSourceConfig = configurableapplicationContext.getBean (comveryDataSourceConfig1.class); String property = configurableapplicationContext.getEnvironment (). getProperty ("spring.datasource.shareniu.url"); System.out.println (คุณสมบัติ); System.out.print (CustomerDatasourceConfig);}} เรียกใช้รหัสด้านบนและผลลัพธ์ของโปรแกรมมีดังนี้:
Shareniu
จากรหัสข้างต้นเราจะเห็นว่า PropertySource มีประสิทธิภาพแน่นอน ดังนั้นเราจะฉีด spring.datasource.shareniu.url โดยอัตโนมัติได้อย่างไรมูลค่าคุณสมบัติลงในคุณสมบัติ URL ในคลาส CustomerDatasourceConfig1 ได้อย่างไร
1.3. PropertySource Annotation อ่านไฟล์ที่ระบุและฉีดคุณสมบัติลงในคลาสการกำหนดค่า
สปริงมีคำอธิบายประกอบ @Value เพื่ออ่านค่าแอตทริบิวต์ในไฟล์การกำหนดค่าและตั้งค่าไว้ในแอตทริบิวต์ที่เกี่ยวข้อง ที่นี่เราเรียนรู้วิธีใช้คำอธิบายประกอบ @Value เช่นเดียวกันสำหรับสองคลาสในข้อความข้างต้นเป็นตัวอย่างสำหรับคำอธิบายโดยละเอียด ก่อนอื่นคุณต้องปรับเปลี่ยนคลาส CustomerDatasourceConFig1 ส่วนการปรับเปลี่ยนมีดังนี้:
@component@propertySource (name = "JDBC-BAINUO-DEV.PROPERTIES", value = {"classPath: config/jdbc-bainuo-dev.properties"}, ไม่รู้ว่าพวกเขา @Value ("$ {Spring.datasource.shareniu.url}") url สตริงส่วนตัว;} ในคลาสข้างต้นมีการเพิ่มคำอธิบายประกอบ @Value ลงในฟิลด์ URL และนิพจน์ Spel ถูกระบุเป็น ${spring.datasource.shareniu.url} เรียกใช้คลาส Boot Springboot อีกครั้งและเอาต์พุตของคอนโซลคือ Shareniu มันบ่งชี้ว่าการฉีดค่าแอตทริบิวต์สามารถทำได้อย่างแน่นอนผ่าน @Value อย่างไรก็ตามหนึ่งในแง่มุมที่เป็นมิตรน้อยกว่าของการใช้วิธีการอธิบายประกอบ @Value คือเมื่อมีคุณสมบัติจำนวนมากในโครงการสำหรับการกำหนดค่าเราจำเป็นต้องเพิ่มคำอธิบายประกอบ @Value ลงในสาขาชั้นเรียนทีละคนซึ่งเป็นเรื่องยากจริงๆ แต่เราสามารถแก้ปัญหานี้ได้
1.4. การกำหนดค่าคำอธิบายประกอบการใช้งาน
@ConfigurationProperties เป็นคำอธิบายประกอบระดับชั้นเรียนและการใช้งานเฉพาะมีดังนี้:
@component @configurationProperties (prefix = "spring.datasource.shareniu") @propertysource (name = "jdbc-bainuo-dev.properties", value = "classpath: config/jdbc-bainuo-dev.properties" CustomerDataSourceConFig1 {URL สตริงส่วนตัว; - ในรหัสด้านบนคำอธิบายประกอบการกำหนดค่า properties จะถูกเพิ่มลงในคลาส CustomerDataSourceConfig1 และคำนำหน้าของคุณสมบัติคือ spring.datasource.shareniu ด้วยวิธีนี้เมื่อกระบวนการ Springboot จะสแกนฟิลด์ทั้งหมดในคลาสปัจจุบันและคุณสมบัติการค้นหาและประกอบ ตัวอย่างเช่นหากเรากำหนดค่า prefix = "spring.datasource.shareniu" มีฟิลด์ URL ในคลาส CustomerDatasourceConfig1 คุณลักษณะที่ฟิลด์ URL จำเป็นต้องจับคู่คือคำนำหน้า+ ฟิลด์ = spring.datasource.shareniu.url
นั่นไม่ใช่แค่คำถาม? จะเกิดอะไรขึ้นถ้าฟิลด์ที่ระบุไม่พบแอตทริบิวต์? สามารถกำหนดค่าได้ดังนี้:
@ConfigurationProperties (คำนำหน้า = "Spring.datasource.shareniu", ไม่สนใจ ronknownfields = true, ไม่สนใจ inoreinvalidfields = true)
เพิกเฉยต่อฟีลด์ฟิลด์: ละเว้นฟิลด์ที่ไม่รู้จัก
ไม่สนใจฟีลด์ฟิลด์: ไม่ว่าจะเพิกเฉยต่อฟิลด์ที่ไม่สามารถตรวจสอบได้หรือไม่ คุณเข้าใจสิ่งนี้ได้อย่างไร? ตัวอย่างเช่นหากเรากำหนดค่าตัวแปรของประเภทสตริงในไฟล์การกำหนดค่าและฟิลด์ในคลาสเป็นประเภท int มันจะรายงานข้อผิดพลาดอย่างแน่นอน หากสิ่งนี้เกิดขึ้นเราสามารถทนต่อมูลค่าทรัพย์สินนั้นจะต้องกำหนดค่าให้เป็นจริง ค่าพารามิเตอร์นี้เป็นค่าเริ่มต้นเป็นเท็จ
บทความนี้จะอธิบายที่นี่ ในบทความที่ตามมาเราจะอธิบายว่า @PropertySource Annotation สามารถตระหนักถึงการอ่านไฟล์การกำหนดค่าในสภาพแวดล้อมที่แตกต่างกันอย่างไร ไฟล์ในสภาพแวดล้อมที่แตกต่างกันจะเปลี่ยนเป็นแบบไดนามิกเพื่ออ่าน PropertySource ไม่ได้รับการสนับสนุนตามค่าเริ่มต้นดังนั้นเราจำเป็นต้องขยายซอร์สโค้ดที่สอดคล้องกับคำอธิบายประกอบนี้
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com