1 คุณสมบัติสปริงพื้นฐาน
ฤดูใบไม้ผลิเป็นเฟรมเวิร์กโอเพ่นซอร์สที่ใช้งานอยู่มาก มันเป็นเฟรมเวิร์กที่สร้างระบบ Javaee หลายชั้นตามหลักและวัตถุประสงค์หลักคือเพื่อลดความซับซ้อนของการพัฒนาองค์กร
ฤดูใบไม้ผลิจัดการรหัสของคุณด้วยวิธีที่ไม่รุกราน สปริงสนับสนุน "การบุกรุกขั้นต่ำ" ซึ่งหมายความว่าคุณสามารถติดตั้งหรือถอนการติดตั้งสปริงในเวลาที่เหมาะสมและฤดูใบไม้ผลิทำให้จาวาสดใส (หลักการเปิดและปิด) นี่คือหลักการปิด
2. เครื่องมือที่จำเป็นในการพัฒนาฤดูใบไม้ผลิ
(ที่นี่เราเลือก Spring 2.5 ก่อนและ 3.0) ก่อน
2.1 แพ็คเกจ JAR ของฤดูใบไม้ผลิ
ดาวน์โหลด Spring ที่ http://www.springsource.org/download จากนั้นคลายการบีบอัด, ค้นหาไฟล์ JAR ต่อไปนี้ในไดเรกทอรีการบีบอัดและคัดลอกไปยัง ClassPath
- ไลบรารีคลาสหลักของฤดูใบไม้ผลิคือ dist/spring.jar ภายใต้ Dist ในเอกสารฤดูใบไม้ผลิ
-ห้องสมุดบุคคลที่สามที่แนะนำคือเอกสารฤดูใบไม้ผลิทั้งหมดภายใต้ LIB, LIB/จาการ์ตาคอมมอนส์/คอมมอนส์-logging.jar
ใช้การเขียนโปรแกรมแง่มุม (AOP) ไฟล์ JAR ต่อไปนี้ lib/appectj/appectjweaver.jar และ ectionjrt.jarlib/cglib/cglib-nodep-2.1_3.jar
-ถ้าคุณใช้คำอธิบายประกอบใน JSR-250 เช่น@resource/@postconstruct/@predestroy ไฟล์ jar lib/j2ee/annotations.jar ก็จำเป็นต้องใช้
หมายเหตุ: JSR (คำขอข้อมูลจำเพาะ Java) หมายถึงคำขออย่างเป็นทางการเพื่อเพิ่มข้อกำหนดทางเทคนิคที่ได้มาตรฐานให้กับ JCP (กระบวนการชุมชน Java) ทุกคนสามารถส่ง JSR (คำขอข้อกำหนด Java) เพื่อเพิ่ม API และบริการใหม่ไปยังแพลตฟอร์ม Java JSR ได้กลายเป็นมาตรฐานที่สำคัญในโลกชวา
2.2 ไฟล์การกำหนดค่าสปริง
โดยค่าเริ่มต้นคือไฟล์ ApplicationContext.xml สามารถสร้างไฟล์ XML จำนวนมากได้และโดยทั่วไปจะถูกกำหนดค่าในโครงการ (สร้างขึ้นในไดเรกทอรี SRC)
3 คำอธิบายโดยละเอียดเกี่ยวกับฟังก์ชั่นพื้นฐานของฤดูใบไม้ผลิ
3.1 SpringIoc
การผกผันการควบคุมของฤดูใบไม้ผลิ: ส่งมอบการสร้างการเริ่มต้นการทำลายล้างและงานอื่น ๆ ของวัตถุไปยังภาชนะสปริง ควบคุมวงจรชีวิตของวัตถุโดยภาชนะสปริง
ขั้นตอน:
•. เริ่มต้นคอนเทนเนอร์ฤดูใบไม้ผลิ
1. ค้นหาไฟล์การกำหนดค่าใน classPath เพื่อยกตัวอย่างคอนเทนเนอร์
การคัดลอกรหัสมีดังนี้: ApplicationContext CTX = ใหม่ classPathxMlApplicationContext (สตริงใหม่ [] {"ApplicationContext.xml"});
คุณสามารถค้นหาไฟล์ XML ใน ClassPath ทั้งหมด
* โหลดด้วยวิธีนี้ คุณต้องใส่ไฟล์การกำหนดค่าสปริงไว้ใต้เส้นทาง classpath ของโครงการปัจจุบัน
* เส้นทาง classpath หมายถึงไดเรกทอรี SRC ของโครงการปัจจุบันซึ่งเป็นตำแหน่งที่เก็บข้อมูลของไฟล์ต้นฉบับ Java
2. ค้นหาไฟล์การกำหนดค่าในพา ธ ระบบไฟล์เพื่อยกตัวอย่างคอนเทนเนอร์
ไฟล์การกำหนดค่าของสปริงสามารถระบุไฟล์การกำหนดค่าหลายไฟล์และสามารถส่งผ่านผ่านอาร์เรย์สตริง
หมายเหตุ: ใช้วิธีแรกเพื่อเริ่มคอนเทนเนอร์บ่อยครั้ง
• b. แยกวัตถุออกจากภาชนะสปริง
โครงสร้างคอนเทนเนอร์สปริง:
3.2 นามแฝง
<Beans> <นามแฝงชื่อ = "บุคคล" นามแฝง = "P" /// นามแฝงเป็นนามแฝงคุณสามารถรับถั่วบุคคลผ่าน p <bean name = "person"/> </ beans>
ด้วยการกำหนดค่าดังกล่าวผลของการตั้งชื่อในที่เดียวและการใช้ชื่อที่แตกต่างกันสามารถทำได้
3.3 วัตถุภายในคอนเทนเนอร์สปริง
1 วิธีสร้างวัตถุ
1.1 ไม่มีตัวสร้างพารามิเตอร์
<bean id = "helloWorld"> </ebean>
1.2 วิธีโรงงานคงที่
<Bean ID = "HelloWorld2"
Factory-method = "getInstance"> </ebean>
1.3 ตัวอย่างวิธีโรงงาน
<bean id = "helloWorldFactory"> </ebean>
<Bean ID = "HelloWorld3" Factory-Bean = "HelloWorldFactory" โรงงาน-วิธี = "getInstance"> </ebean>
เพียงจำแนวคิด วิธีแรกคือวิธีที่ใช้มากที่สุด แต่เมื่อรวมเข้ากับเครื่องมืออื่น ๆ จะใช้โมเดลโรงงานอินสแตนซ์
ตัวอย่าง :
กำหนดค่า ApplicationContext.xml
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <! คลาส -> <bean id = "helloWorld"> </ebean> - - โรงงาน-วิธี = "getInstance" > </ebean> <! -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -
สร้างคลาสเอนทิตี HelloWorld
แพ็คเกจ com.itheima10.spring.createObject; คลาสสาธารณะ HelloWorld {โมฆะสาธารณะ Hello () {System.out.println ("Hello"); -สร้างโรงงาน helloWorldFactory แบบคงที่
แพ็คเกจ com.itheima10.spring.createObject.method; ชั้นเรียนสาธารณะ HelloWorldFactory {สาธารณะ helloWorld getInstance () {system.out.println ("วิธีการคงที่"); คืน HelloWorld ใหม่ (); -สร้างโรงงานทางกายภาพ helloWorldFactory2
แพ็คเกจ com.itheima10.spring.createObject.method; คลาสสาธารณะ HelloWorldFactory2 { / *** วัตถุโรงงานจะต้องถูกสร้างขึ้นก่อนที่วิธีนี้จะเรียกได้ว่า* @return* / Public HelloWorld GetInstance () -วิธีทดสอบเขียน createObjectMethodtest
แพ็คเกจ com.itheima10.spring.createObject.method; นำเข้า org.junit.test; นำเข้า org.springframework.context.applicationContext; นำเข้า org.springframework.context.support.classpathxmlapplication; createObjectMethodTest { / *** โดยค่าเริ่มต้นคอนเทนเนอร์สปริงเรียกตัวสร้างเริ่มต้นของคลาสเพื่อสร้างวัตถุ* / @Test โมฆะสาธารณะ testCreateObject_default () {applicationContext บริบท = ใหม่ classPathxMlApplicationContext ("ApplicationContext.xml"); HelloWorld HelloWorld = (HelloWorld) บริบท GetBean ("HelloWorld"); HelloWorld.hello (); }/*** สร้างวัตถุโดยใช้โรงงานคงที่* <bean id = "helloWorld2" โรงงาน-เมธอด = "getInstance"> </ebean> สิ่งที่คอนเทนเนอร์สปริงทำ: วิธีการ getInstance เรียกว่าการใช้คลาส HelloWorldFactory*/@Test Public Public Void classpathxmlapplicationContext ("applicationcontext.xml"); HelloWorld HelloWorld = (HelloWorld) บริบท GetBean ("HelloWorld2"); HelloWorld.hello (); }/** * วิธีการเป็นโรงงานอินสแตนซ์สร้างวัตถุ * <bean id = "helloWorldFactory" *> </epean> * <bean id = "HelloWorld3" โรงงาน Bean = "HelloWorldFactory" HelloWorldld Obuctriny Object*/ @Test Public Void TestCreateObject_InstanceFactory () {applicationContext context = ใหม่ classPathxMlApplicationContext ("ApplicationContext.xml"); HelloWorld HelloWorld = (HelloWorld) บริบท GetBean ("HelloWorld3"); HelloWorld.hello (); -2 ขอบเขตของวัตถุ
ขอบเขตของวัตถุมีสองคุณสมบัติ: ซิงเกิลตันและต้นแบบ ซิงเกิลตันหมายถึงซิงเกิลตัน
2.1 Singleton (ค่าเริ่มต้น)
ในแต่ละคอนเทนเนอร์ IOC ของฤดูใบไม้ผลิมีเพียงอินสแตนซ์วัตถุเดียว (แชร์)
2.2 ต้นแบบ
อนุญาตให้ถั่วอินสแตนซ์หลายครั้ง (สร้างหนึ่งอินสแตนซ์หนึ่งครั้ง) ฤดูใบไม้ผลิไม่สามารถรับผิดชอบวัฏจักรชีวิตทั้งหมดของถั่วต้นแบบได้ ซึ่งหมายความว่ามันเป็นความรับผิดชอบของลูกค้าที่จะต้องชัดเจนเกี่ยวกับวัตถุที่มีขอบเขตต้นแบบและเพื่อเพิ่มทรัพยากรที่มีราคาแพงที่จัดขึ้นโดยถั่วต้นแบบใด ๆ
<bean id = "helloWorld" ขอบเขต = "Singleton"> </ebean>
<bean id = "helloWorld" ขอบเขต = "ต้นแบบ"> </ebean>
สร้างคลาส HelloWorld
ชั้นเรียนสาธารณะ HelloWorld {รายการสาธารณะ <String> lists = new ArrayList <String> (); public helloWorld () {system.out.println ("อินสแตนซ์ใหม่"); } โมฆะสาธารณะ Hello () {System.out.println ("Hello"); -สร้างคลาสทดสอบ scopetest
แพ็คเกจ com.itheima10.spring.scope; นำเข้า org.junit.test; นำเข้า org.springframework.context.applicationContext; นำเข้า org.springframework.context.support คอนเทนเนอร์และคลาสนี้เป็นซิงเกิลตันจากนั้นคุณสมบัติในชั้นเรียนจะถูกแชร์*/ @Test โมฆะสาธารณะ TestCreateObject_Scope_Default () {ApplicationContext context = ใหม่ classPathxMlApplicationContext ("ApplicationContext.xml"); HelloWorld Hello1 = (HelloWorld) บริบท GetBean ("HelloWorld"); hello1.lists.add ("aaaa"); hello2 = (helloWorld) บริบท getBean ("helloWorld"); hello2.lists.add ("BBBB"); System.out.println (helloWorld.lists.size ()); // 2 และเฉพาะอินสแตนซ์ใหม่}/** * หากไฟล์การกำหนดค่าของสปริงเป็นดังนี้: * <bean id = "helloWorld" scope = "ต้นแบบ"> </ebean> จากนั้นคอนเทนเนอร์สปริงจะสร้างวัตถุหลายรายการสำหรับ */@Test classpathxmlapplicationContext ("applicationcontext.xml"); HelloWorld Hello1 = (HelloWorld) บริบท GetBean ("HelloWorld"); hello1.lists.add ("aaaa"); hello2 = (helloWorld) บริบท getBean ("helloWorld"); hello2.lists.add ("BBBB"); System.out.println (helloWorld.lists.size ()); // 1 และเฉพาะอินสแตนซ์ใหม่}}3 เวลาเริ่มต้น
Lazy Loading - โดยค่าเริ่มต้นถั่วจะเริ่มต้นเมื่อคอนเทนเนอร์เริ่มต้น แต่เราสามารถระบุ lazy -init = "true" ของโหนดถั่วเพื่อชะลอการเริ่มต้นของถั่ว ในเวลานี้ถั่วจะเริ่มต้นได้ก็ต่อเมื่อการดึงถั่วเป็นครั้งแรก ชอบ:
<bean id = "xxx" lazy-init = "true"/>
หากคุณต้องการใช้การเริ่มต้นล่าช้ากับถั่วทั้งหมดคุณสามารถตั้งค่า default-lazy-init = "true" ในถั่วรูทดังต่อไปนี้:
<Beans Default-Lazy-Init = "true" ... >
ฤดูใบไม้ผลิอินสแตนติสถั่วซิงเกิลทั้งหมดล่วงหน้าเมื่อเริ่มต้นโดยค่าเริ่มต้น การสร้างอินสแตนซ์ในช่วงต้นหมายความว่าเป็นส่วนหนึ่งของการเริ่มต้น ApplicationContext จะสร้างและกำหนดค่าถั่วซิงเกิลทั้งหมดโดยอัตโนมัติ นี่เป็นสิ่งที่ดี เพราะด้วยวิธีนี้ข้อผิดพลาดใด ๆ ในการกำหนดค่าสามารถค้นพบได้ทันที
Lazy-init เป็นเท็จคอนเทนเนอร์สปริงจะรายงานข้อผิดพลาดเมื่อเริ่มต้น (วิธีที่ดีกว่า)
Lazy-init เป็นจริงและคอนเทนเนอร์สปริงจะทำให้เกิดข้อผิดพลาดเมื่อโทรเข้าชั้นเรียน
กำหนดค่า ApplicationContext.xml
<bean id = "helloWorld" scope = "ต้นแบบ"> </epean> </ebeans>
สร้างคลาสทดสอบ createObjecthentest
แพ็คเกจ com.itheima10.spring.createObject.when; นำเข้า org.junit.test; นำเข้า org.springframework.context.applicationContext; นำเข้า org.springframework.context.support.classpathxmlapplicationContext; 3. วิธีการเรียกวัตถุ * * <bean id = "helloWorld"> </epean> <bean id = "helloWorld2"> </epean> เนื่องจากมีการประกาศถั่วสองตัวในภาชนะสปริงคอนเทนเนอร์สปริงจะต้องสร้างวัตถุสองอย่าง แสดงโดยเฉพาะ แต่เนิ่นๆ หากถั่วเก็บข้อมูลจำนวนมากวิธีนี้ไม่ดีและข้อมูลอาจติดอยู่ในหน่วยความจำเร็วเกินไป หากถั่วไม่ใช่ซิงเกิลตันไม่ว่าจะมีการกำหนดค่าอย่างไรวัตถุจะต้องสร้างขึ้นเมื่อมันเป็นบริบท. Context.getBean ("HelloWorld"); } /*** <bean id = "helloWorld" lazy-init = "true"> </epean>* คำสั่ง* 1. เริ่มต้นคอนเทนเนอร์สปริง* 2. บริบท. getBean* 3 เรียกใช้ฟังก์ชั่นคอนสตรัคเตอร์เพื่อสร้างวัตถุ* คำอธิบาย: ถ้า struts2, ไฮเบอร์เนต หากถั่วเก็บข้อมูลจำนวนมากจำเป็นต้องโหลดข้อมูลเมื่อจำเป็น*/ @test โมฆะสาธารณะ testCreateObject_when_lazy () {applicationcontext context = ใหม่ classPathxMlApplicationContext ("applicationContext.xml"); Context.getBean ("HelloWorld"); -4 init, ทำลายวิธีการ
เมื่อฤดูใบไม้ผลิเริ่มต้นถั่วหรือทำลายถั่วบางครั้งการประมวลผลบางครั้งจำเป็นต้องใช้ดังนั้นฤดูใบไม้ผลิสามารถเรียกวิธีการใช้ชีวิตสองวิธีของถั่วเมื่อสร้างและถอดชิ้นถั่ว คุณสามารถระบุวิธีการทำงาน
<bean id = "foo" class = "... foo" init-method = "setup" decoration-method = "teardown"/>
โทรหาวิธีการเริ่มต้นเมื่อ Foo ถูกโหลดลงในภาชนะสปริง การเรียกใช้วิธีการปรับใช้เมื่อ FOO ถูกลบออกจากคอนเทนเนอร์ (ขอบเขต = Singleton ถูกต้อง)
เขียน helloWorld
ชั้นเรียนสาธารณะ helloWorld {public helloWorld () {system.out.println ("อินสแตนซ์ใหม่"); } โมฆะสาธารณะ init () {system.out.println ("init"); } โมฆะสาธารณะทำลาย () {system.out.println ("ทำลาย"); } โมฆะสาธารณะ Hello () {System.out.println ("Hello"); -เขียนคลาสทดสอบ initdestroytest
แพ็คเกจ com.itheima10.spring.ioc.initdestroy; นำเข้า org.junit.test; นำเข้า org.springframework.context.applicationContext; นำเข้า org.springframework.context.support.classpathxmlapplication คอนเทนเนอร์* 2. สร้างวัตถุ HelloWorld* 3. ดำเนินการวิธีการเริ่มต้น* การดำเนินการอัตโนมัติภายในคอนเทนเนอร์สปริง* 4. วิธีการเรียกวัตถุ* 5. วิธีการทำลายสามารถดำเนินการได้เมื่อภาชนะสปริงถูกปิดเท่านั้น: ถั่วเป็นซิงเกิล* วิธีนี้เรียกว่าสปริงคอนเทนเนอร์ * ในคอนเทนเนอร์ฤดูใบไม้ผลิเฉพาะถ้าถั่วตัวหนึ่งเป็นซิงเกิลตันคอนเทนเนอร์สปริงมีหน้าที่ในการสร้างการเริ่มต้นและการทำลายวัตถุ* หากถั่วไม่ใช่ซิงเกิลคอนเทนเนอร์สปริงมีหน้าที่เฉพาะในการสร้างและเริ่มต้น HelloWorld HelloWorld = (HelloWorld) บริบท GetBean ("HelloWorld"); HelloWorld.hello (); classPathxMlApplicationContext ApplicationContext = (classPathxMlApplicationContext) บริบท; ApplicationContext.close (); - แผนภาพลำดับการดำเนินการ:
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น