คำอธิบายประกอบในฤดูใบไม้ผลิสามารถแบ่งออกเป็นสองประเภท:
1) คำอธิบายประกอบที่เกี่ยวข้องกับภาชนะถั่วฤดูใบไม้ผลิหรือโรงงานถั่ว
2) คำอธิบายประกอบที่เกี่ยวข้องกับ SpringMVC
คำอธิบายประกอบที่เกี่ยวข้องกับคอนเทนเนอร์ถั่วของฤดูใบไม้ผลิรวมถึง: @Required, @AutoWired, @PostConstruct, @Predestory และคำอธิบายประกอบใน JSR-330 javax.inject.* ที่สปริง 3.0 ได้รับการสนับสนุน (@Inject, @Named, @qualifier
คำอธิบายประกอบที่เกี่ยวข้องกับ SpringMVC รวมถึง: @Controller, @requestmapping, @requestparam, @ResponseBody ฯลฯ
เพื่อให้เข้าใจคำอธิบายประกอบในฤดูใบไม้ผลิคุณต้องเข้าใจคำอธิบายประกอบใน Java ก่อน
1. คำอธิบายประกอบใน Java
คำอธิบายประกอบได้รับการแนะนำใน Java 1.5 คนที่เราคุ้นเคยมากที่สุดควร: @Override ซึ่งกำหนดไว้ดังนี้:
/** * ระบุว่าการประกาศวิธีการมีวัตถุประสงค์เพื่อแทนที่การประกาศวิธี A * ใน supertype หากวิธีการใส่คำอธิบายประกอบด้วย * คอมไพเลอร์ประเภทคำอธิบายประกอบนี้จะต้องสร้างข้อความผิดพลาด * เว้นแต่ว่าอย่างน้อยหนึ่งเงื่อนไขต่อไปนี้จะถือ: * วิธีการแทนที่หรือใช้วิธีที่ประกาศใน A * supertype * วิธีนี้มีลายเซ็นที่เทียบเท่ากับวิธีการสาธารณะ * วิธีการใด ๆ ที่ประกาศในวัตถุ * * @author Peter von der Ahé * @author Joshua Bloch * @jls 9.6.1.4 @Override * @Since 1.5 */ @Target (ElementType.method) @retention
จากคำอธิบายประกอบเราจะเห็นว่าฟังก์ชั่นของ @Override คือการแจ้งให้คอมไพเลอร์ว่าวิธีการที่ใช้โดยคำอธิบายประกอบ @Override จะต้องแทนที่คลาสแม่หรือวิธีการที่มีชื่อเดียวกันใน java.lang.Object เราเห็นว่า @target และ @retention ใช้ในคำจำกัดความของ @Override พวกเขาเป็นสิ่งที่เรียกว่า "meta-annotations"-พวกเขาเป็นคำอธิบายประกอบที่กำหนดคำอธิบายประกอบหรือคำอธิบายประกอบที่คำอธิบายประกอบ (เวียนหัว ... ) มาดู @retention
/** * ระบุระยะเวลาที่คำอธิบายประกอบกับประเภทคำอธิบายประกอบจะถูกเก็บไว้ * หากไม่มีคำอธิบายประกอบการเก็บรักษาไว้ใน * การประกาศประเภทคำอธิบายประกอบนโยบายการเก็บข้อมูลเริ่มต้นเป็น * RECENTIONPOLICY.CLASS * /@documented@retention (RetentionPolicy.runtime) @Target (ElementType.Annotation_Type) การเก็บรักษาสาธารณะ @Interface retention { /*** ส่งคืนนโยบายการเก็บรักษา * @return นโยบายการเก็บรักษา */ มูลค่าการเก็บรักษา () ();}@retention ใช้เพื่อแจ้งระยะเวลาที่คำอธิบายประกอบถูกเก็บไว้ มีสามค่า:
Public Enum RetentionPolicy { /*** คำอธิบายประกอบจะถูกเปิดเผยโดยคอมไพเลอร์ * / แหล่งที่มา / ** * คำอธิบายประกอบจะถูกบันทึกไว้ในไฟล์คลาสโดยคอมไพเลอร์ * แต่ไม่จำเป็นต้องเก็บไว้โดย VM ในเวลาทำงาน นี่คือพฤติกรรม * เริ่มต้น * / class, / ** * คำอธิบายประกอบจะถูกบันทึกในไฟล์คลาสโดยคอมไพเลอร์และ * เก็บไว้โดย VM ในเวลาทำงานดังนั้นพวกเขาอาจอ่านได้ * * @see java.lang.reflect.annotatedElement */ runtime} RetentionPolicy.Source ยังคงอยู่ที่ระดับซอร์สโค้ดและถูกทอดทิ้งโดยคอมไพเลอร์ (@Override เป็นแบบนี้); RetentionPolicy.class ถูกเก็บไว้ที่ระดับไฟล์คลาสที่รวบรวมโดยคอมไพเลอร์ แต่ถูกทิ้งโดยเครื่องเสมือน
RetentionPolicy.runtime สงวนไว้จนถึงรันไทม์และสามารถอ่านได้โดยการสะท้อนกลับ
ดูที่ @target:
แพ็คเกจ java.lang.annotation;/*** หมายถึงบริบทที่มีการใช้ประเภทคำอธิบายประกอบ บริบท * การประกาศและบริบทประเภทซึ่งประเภทคำอธิบายประกอบอาจมีการใช้งาน * มีการระบุไว้ใน JLS 9.6.4.1 และแสดงในซอร์สโค้ดโดย enum * ค่าคงที่ของ java.lang.annotation.ElementType * @Since 1.5 * @JLS 9.6.4.1 @TAR */@documented@retention (RetentionPolicy.runtime) @Target (ElementType.Annotation_Type) เป้าหมายสาธารณะ @Interface เป้าหมาย {/** * ส่งคืนอาร์เรย์ประเภทขององค์ประกอบประเภทคำอธิบายประกอบ * สามารถนำไปใช้ได้ * @return อาร์เรย์ขององค์ประกอบชนิดที่คำอธิบายประกอบ * สามารถนำไปใช้กับ */elementType [] ค่า ();}@Target ใช้เพื่อแจ้งการใช้คำอธิบายประกอบนี้และค่าคือ:
public enum elementType { /** คลาสอินเตอร์เฟส (รวมถึงประเภทคำอธิบายประกอบ) หรือการประกาศ enum* /ประเภท, /** การประกาศฟิลด์ (รวมถึงค่าคงที่ enum)* /ฟิลด์, /** การประกาศวิธีการ* /วิธีการประกาศพารามิเตอร์* การประกาศ */ Annotation_type,/ ** การประกาศแพ็คเกจ */ แพ็คเกจ,/ ** * ประเภทการประกาศพารามิเตอร์ * @since 1.8 */ type_parameter,/ ** * ใช้ประเภท * @since 1.8 */ type_use}ระบุตำแหน่งที่คำอธิบายประกอบนี้สามารถใช้แยกกันได้: 1) คลาส, อินเตอร์เฟส, คำอธิบายประกอบ, enum; 2) แอตทริบิวต์โดเมน; 3) วิธีการ; 4) พารามิเตอร์; 5) ตัวสร้าง; 6) ตัวแปรท้องถิ่น 7) ประเภทคำอธิบายประกอบ; 8) แพ็คเกจ
ดังนั้น:
@Target (ElementType.Method) @retention (RetentionPolicy.Source) Public @Interface Override {}หมายความว่า @Override สามารถใช้กับวิธีการเก็บรักษาไว้ที่ระดับซอร์สโค้ดซึ่งประมวลผลโดยคอมไพเลอร์แล้วทิ้ง
นอกจากนี้ยังมีคำอธิบายประกอบเมตาที่ใช้บ่อย @documented:
/** * ระบุว่าคำอธิบายประกอบที่มีประเภทจะต้องบันทึกโดย Javadoc * และเครื่องมือที่คล้ายกันโดยค่าเริ่มต้น ประเภทนี้ควรใช้ในการใส่คำอธิบายประกอบ * การประกาศประเภทที่มีคำอธิบายประกอบมีผลต่อการใช้องค์ประกอบ * ที่ลูกค้าของพวกเขา หากการประกาศประเภทมีคำอธิบายประกอบด้วย * บันทึกไว้คำอธิบายประกอบของมันจะกลายเป็นส่วนหนึ่งของ API สาธารณะ * ขององค์ประกอบที่มีคำอธิบายประกอบ */@documented@retention (RetentionPolicy.runtime) @Target (ElementType.Annotation_type) สาธารณะ @Interface เอกสาร {}ระบุว่า Javadoc สามารถประมวลผลคำอธิบายประกอบได้หรือไม่และเก็บไว้ในเอกสารหรือไม่
2. ปรับแต่งและประมวลผลคำอธิบายประกอบที่กำหนดเองด้วยคำอธิบายประกอบเมตา
ด้วยคำอธิบายประกอบเมตาฉันสามารถใช้เพื่อปรับแต่งคำอธิบายประกอบที่เราต้องการ การรวมคำอธิบายประกอบแบบกำหนดเองและ AOP หรือตัวกรองเป็นอาวุธที่ทรงพลังมาก ตัวอย่างเช่นคำอธิบายประกอบสามารถใช้เพื่อให้ได้การควบคุมการอนุญาตอย่างละเอียด - ใช้คำอธิบายประกอบการอนุญาตในชั้นเรียนหรือวิธีการจากนั้นสกัดกั้นพวกเขาใน AOP หรือตัวกรอง นี่คือการดำเนินการตามคำอธิบายประกอบเกี่ยวกับสิทธิ์ในการเข้าสู่ระบบ:
/*** ไม่จำเป็นต้องมีคำอธิบายประกอบการเข้าสู่ระบบ*/@Target ({ElementType.method, ElementType.type})@retention(retentionPolicy.runtime)@documentedPublic @interface nologin {}เรามีคำอธิบายประกอบที่กำหนดเอง @Nologin ซึ่งสามารถใช้กับวิธีการและคลาส คำอธิบายประกอบจะถูกเก็บไว้จนกว่าจะมีการรันไทม์และสามารถอ่านได้โดยการสะท้อนกลับ ความหมายของคำอธิบายประกอบนี้คือ: คลาสหรือวิธีการที่มีคำอธิบายประกอบโดย @Nologin สามารถเข้าถึงได้แม้ว่าผู้ใช้จะไม่ได้เข้าสู่ระบบสิ่งต่อไปนี้เป็นกระบวนการของคำอธิบายประกอบ:
/*** ตรวจสอบการล็อกอิน interceptor* หากคุณไม่จำเป็นต้องตรวจสอบการเข้าสู่ระบบคุณสามารถเพิ่ม @Nologin ลงในวิธีการหรือคอนโทรลเลอร์*/คลาสสาธารณะตรวจสอบความเป็นไปได้ Handler Object) โยนข้อยกเว้น {if (! (handler instanceof handlermethod)) {logger.warn ("ตัวจัดการการทำงานปัจจุบันไม่ใช่ handlermethod =" + handler.getClass (). getName () + ", req =" + request.getQueryString (); handlermethod.getMethod (). getName (); // พิจารณาว่าคุณจำเป็นต้องตรวจสอบการเข้าสู่ระบบ nologin = handlermethod.getMethod (). getannotation (nologin.class); if (null! = nologin) {ถ้า (logger.isdebugenabled ()) {logger.debug ("วิธีการใช้งานปัจจุบัน methodname =" + methodname + "ไม่จำเป็นต้องตรวจสอบการเข้าสู่ระบบ");} กลับจริง; if (null! = nologin) {ถ้า (logger.isdebugenabled ()) {logger.debug ("วิธีการใช้งานปัจจุบัน methodname =" + methodname + "ไม่จำเป็นต้องตรวจสอบการเข้าสู่ระบบ");} return true;} ถ้า (null == request.getSession () "ผู้ใช้ไม่ได้เข้าสู่ระบบ, ip =" + request.getRemoteaddr ()); response.getWriter (). เขียน (jsonConvertor.convertFailResult (errorcodeenum.not_login) .toString (); Handler, ModelAndView ModelandView) พ่นข้อยกเว้น {} @Override โมฆะสาธารณะ ftercompletion (คำขอ httpservletRequest, การตอบสนอง httpservletResponse, ตัวจัดการวัตถุ, ข้อยกเว้น) โยนข้อยกเว้น {}}}}ข้างต้นเรากำหนดตัวดักจับเข้าสู่ระบบก่อนใช้การสะท้อนเพื่อตรวจสอบว่าวิธีการที่มีคำอธิบายประกอบโดย @Nologin:
nologin nologin = handlermethod.getMethod (). getannotation (nologin.class);
จากนั้นตรวจสอบว่าชั้นเรียนมีคำอธิบายประกอบโดย @Nologin:
nologin = handlermethod.getMethod (). getdeclaringclass (). getannotation (nologin.class);
ถ้าเป็นคำอธิบายประกอบมันจะกลับมาเป็นจริง หากไม่มีคำอธิบายประกอบจะมีการพิจารณาว่ามีการลงชื่อเข้าใช้หรือไม่หากไม่ได้ลงชื่อเข้าใช้จะส่งกลับข้อความแสดงข้อผิดพลาดไปยังเบื้องหน้าและเท็จ นี่เป็นตัวอย่างง่ายๆของการใช้คำอธิบายประกอบและตัวกรองสำหรับการประมวลผลการอนุญาต หากเราขยายเราสามารถใช้คำอธิบายประกอบเพื่อระบุว่าวิธีการหรือคลาสบางอย่างสามารถเข้าถึงได้โดยผู้ใช้ที่มีบทบาทหรือสิทธิ์บางอย่างเท่านั้นจากนั้นตัดสินในตัวกรอง
3. คำอธิบายประกอบที่เกี่ยวข้องกับภาชนะถั่วฤดูใบไม้ผลิ
1) @autowired เป็นคำอธิบายประกอบที่เราใช้มากที่สุด ในความเป็นจริง AutoWire = ByType เป็นการพึ่งพาการฉีดอัตโนมัติตามประเภท (การฉีดขึ้นอยู่กับการพึ่งพาคำอธิบายประกอบ) ซึ่งสามารถใช้ในโดเมนวิธีการและตัวสร้าง
2) @qualifier เป็น autoWire = byname เมื่อคำอธิบายประกอบ @autowired กำหนดว่าถั่วหลายชนิดเหมือนกันคุณต้องใช้ @qualifier ("xxbean") เพื่อระบุ ID ของถั่วขึ้นอยู่กับ:
@controller @requestmapping ("/user") ชั้นเรียนสาธารณะ hellocontroller {@autowired @qualifier ("ผู้ใช้") ผู้ใช้ส่วนตัวผู้ใช้บริการผู้ใช้บริการ;3) @Resource เป็นของมาตรฐาน JSR250 และใช้ในโดเมนและวิธีการ นอกจากนี้ยังเป็นการฉีดขึ้นอยู่กับประเภท byname วิธีการใช้งาน: @Resource (name = "xxbean") @Resource ที่ไม่มีพารามิเตอร์ชื่อคลาสค่าเริ่มต้นมีตัวพิมพ์เล็ก
4) คำอธิบายประกอบใน JSR-330 javax.inject.* (@Inject, @Named, @qualifier, @Provider, @Scope, @Singleton) @Inject เทียบเท่ากับ @autowired, @named เทียบเท่ากับ @qualifier และ @named ยังใช้ในคลาสเป็น @component
5) @component, @Controller, @Service, @Repository, คำอธิบายประกอบเหล่านี้แตกต่างจากคำอธิบายประกอบข้างต้น คำอธิบายประกอบข้างต้นถูกฉีดเข้าไปในถั่วขึ้นอยู่กับการทำงานของคำอธิบายประกอบเหล่านี้คือการผลิตถั่ว คำอธิบายประกอบเหล่านี้มีคำอธิบายประกอบในชั้นเรียนใส่คำอธิบายประกอบชั้นเรียนเป็นถั่วทีละคนในโรงงานถั่วฤดูใบไม้ผลิ @Controller, @Service, @Repository นั้นเป็น @component ที่มีความหมายที่ละเอียดมากขึ้น
6) @postconstruct และ @predestroy ไม่ได้ใช้สำหรับการฉีดพึ่งพา แต่สำหรับวงจรชีวิตของถั่ว คล้ายกับ init-method (InitializingBean) Destory-method (DisposableBean)
4. การประมวลผลคำอธิบายประกอบในฤดูใบไม้ผลิ
การประมวลผลคำอธิบายประกอบในฤดูใบไม้ผลิทำได้โดยการใช้อินเตอร์เฟส BeanPostProcessor:
ส่วนต่อประสานสาธารณะ BeanPostProcessor {Object PostprocessBeforeInitialization (Object Bean, String Beanname) พ่น beansexception; Object postprocessafterinitialization (Object Bean, String Beanname) พ่น beansexception;}คลาสการประมวลผลที่เกี่ยวข้อง ได้แก่ : AutoWiredannotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor
คลาสการประมวลผลเหล่านี้สามารถกำหนดค่าโดยปริยายลงในคอนเทนเนอร์สปริงผ่าน <บริบท: Annotation-config/> ทั้งหมดนี้เป็นการประมวลผลของการฉีดพึ่งพารวมถึงการประมวลผลคำอธิบายประกอบถั่วการผลิต (@component, @Controller, @Service, @Repository):
<บริบท: Component-Scan base-package = "net.aazj.service, net.aazj.aop" />
สิ่งเหล่านี้ทำได้โดยการระบุเส้นทางแพ็คเก็ตฐานสแกนสแกนลงในภาชนะถั่วฤดูใบไม้ผลิ โปรดทราบว่าบริบท: Component-Scan จะกำหนดค่า AutoWiredannotationBeanPostProcessor และ CommonAnnotationBeanPostProcessor โดยค่าเริ่มต้น ดังนั้น <บริบท: Annotation-config/> สามารถละเว้นได้ นอกจากนี้บริบท: ส่วนประกอบ-สแกนยังสามารถสแกนคำอธิบายประกอบ AOP สไตล์ @Aspect ได้ แต่จำเป็นต้องเพิ่ม <AOP: ASPASTJ-AUTOPROXY/> ลงในไฟล์กำหนดค่าสำหรับความร่วมมือ
5. ความแตกต่างระหว่างคำอธิบายประกอบฤดูใบไม้ผลิและคำอธิบายประกอบมาตรฐาน JSR-330:
สรุป
ข้างต้นคือทั้งหมดที่เกี่ยวกับการทำความเข้าใจคำอธิบายประกอบต่าง ๆ ในฤดูใบไม้ผลิอย่างรวดเร็ว ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!