مقدمة
في القسم السابق ، فك تشفير الربيع - تحليل العلامات الافتراضية ، نركز على تحليل كيفية توحيد الربيع العلامات الافتراضية. لذلك يستمر هذا الفصل في شرح تحليل التسمية ، مع التركيز على كيفية تحليل العلامات المخصصة. بدون مزيد من اللغط ، دعونا نلقي نظرة على المقدمة التفصيلية.
العلامات المخصصة
قبل شرح تحليل العلامات المخصصة ، يرجى الاطلاع على كيفية تخصيص العلامات
تحديد ملف XSD
تحديد ملف XSD لوصف محتوى المكون
<؟ xmlns: beans = "http://www.springframework.org/schema/beans مساحة الاسم = "http://www.springframework.org/schema/beans"/> <xsd: element name = "application"> <xsd: complextype> <xsd: complexcontent> <xsd: extension base = "beans: IdentificeType"> <xsd: </xsd: extension> </xsd: ComplexContent> </ssd: complextype> </ssd: element> </ssd: schema>
تحديد قواعد التحليل
1. إنشاء فئة لتنفيذ واجهة BeanDefinitionParser (يمكن أيضًا أن ترث الفئات التي توفرها الربيع) لتحليل التعاريف وتعريفات المكونات في ملف XSD.
application applicationbeandefinitionparser يمتد ملخصات exctractlebeandefinitionparser {Override الفئة المحمية getBeanclass (عنصر العنصر) {// نوع الكائن المستلم مثل: string name = (string) context.getBean ("battcn") ؛ إرجاع string.class ؛ } override void void doparse (عنصر العنصر ، BeanDefinitionBuilder Bean) {// سمة الاسم المحددة في اسم سلسلة XSD = element.getattribute ("name") ؛ Bean.AddConstructorArgValue (name) ؛ }}فيما يلي applicationbeandefinitionparser يرث الملخصات. ينصب التركيز على تجاوز علامات Doparse ، Parse XML فيه ، ثم حقن القيمة المحفورة (Levin) في المنشئ.
2. قم بإنشاء فئة لروث فئة التجريد
الطبقة العامة BattcnnamesPaceHandler تمتد الاسم BattPaceHandLersupport {Override public void init () {registerBeanDefinitionParser ("Application" ، ApplicationBeanDefinitionParser ()) ؛ }} وظيفة battcnnamespaceHandler بسيطة للغاية ، وهي إخبار حاوية الربيع بأن العلامة <battcn:application /> يجب أن يتم تحليلها بواسطة المحلل (هنا قمنا بتخصيص: ApplicationBeanDefinitionParser) ، وهو مسؤول عن تسجيل المكونات في حاوية الربيع.
3. اكتب spring.handlers و spring.schemas ملفات
يوجد الدليل الذي يتم تخزين الملف في اسم الموارد/meta-inf/file
Spring.Handlers
http/: //www.battcn.com/schema/battcn=com.battcn.handler.battcnnamespacehandler
Spring.Schemas
http/: //www.battcn.com/schema/battcn.xsd=battcn.xsd
4. استخدم العلامات المخصصة
إعلان ملف bean.xml ، محدد على النحو التالي
<؟ xmlns: battcn = "http://www.battcn.com/schema/battcn" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/beans http://www.battcn.com/schema/battcn
إنشاء فئة اختبار. إذا رأيت كلمة Levin Word Console ، فهذا يعني أن الملصق المخصص طبيعي.
تطبيق الفئة العامة {public static void main (string [] args) {applicationContext context = new ClassPathxMlapplicationContext ("bean.xml") ؛ اسم السلسلة = (سلسلة) context.getBean ("battcn") ؛ system.out.println (name) ؛ }}5. كما هو مبين في الشكل
تحليل رمز المصدر
بوابة دقة العلامة المخصصة
الفئة العامة beandefinitionparserdelegate {nullable publicipenition parsecustomelement (Element ele ، @nullable BeanDefinition containsbd) {// الحصول على عنوان مساحة الاسم http://www.battcn.com/schema/battcn. if (namespaceuri == null) {return null ؛ }. if (handler == null) {error ("" غير قادر على تحديد موقع Spring NamespaceHandler لـ XML Schema Namepace [" + namespaceuri +"] "، ele) ؛ العودة لاغية. } return handler.parse (ele ، new parsercontext (this.readercontext ، this ، continingBd)) ؛ }} مثل قواعد دقة العلامة الافتراضية ، يتم الحصول على مساحة الاسم من خلال getNamespaceURI(Node node) . إذن أين يتم الحصول على this.readerContext.getNamespaceHandlerResolver() ؟ نحن نتتبع الرمز ويمكننا أن نجد أنه عند بدء تشغيل المشروع ، سيتم تحليل جميع محتويات ملف meta-inf/spring.handles في XmlBeanDefinitionReader و SchoD في معالجات المعالجة (A concurrenthashmap). عندما يتم استدعاء resolve(namespaceUri) للتحقق ، سيتم استخراج المحتوى المخزونات للمقارنة.
الفئة العامة xmlbeandefinitionReader {public namespacehandlerresolver getNamesPacePaceHandlerResolver () {if (this.namespacehandlerresolver == null) {this.namespacehandlerresolver = createfaultnamespacehandlerres () ؛ } إرجاع this.namespacehandlerresolver ؛ }}حل
1. قم بتحميل خريطة مساحة الاسم المحددة ، ويتم تخزين الأسماء المستخرجة ، ثم العودة ، ثم العودة
الفئة العامة defaultNamesPacePaceHandLerResolver {OverRide @nullable مقبول الاسم publicshandler حل (string namespaceuri) {map <string ، object> handlermappings = gethandlermappings () ؛ // استخراج معالجات ClassName من HandlerMappings معالج الكائنات = HandlerMappings.get (namepaceuri) ؛ if (HandlerorClassName == null) {return null ؛ } آخر إذا كان (HandlerorClassName مثيل اسم namespacehandler) {return (namespaceHandler) HandlerorClassName ؛ } آخر {String className = (String) HandlerorClassName ؛ حاول {class <؟> handlerClass = classUtils.forname (className ، this.classloader) ؛ if (! namespacehandler.class.isAsasSignableFrom (HandlerClass)) {رمي new fatalBeanException ("class [" + className + "] for namepace [" + namespaceuri + "] }. // معالج تهيئة اسم الاسم. HandlerMappings.put (Namespaceuri ، NamePaceHandler) ؛ إرجاع أسماء الاسم ؛ } catch (classnotfoundException ex) {رمي new fatalbeanexception ( } catch (linkageerror err) {رمي new fatalBeanException ("فئة الاسم غير صالحة [ + className +"] لمساحة الاسم [" + namespaceuri +"]: مشكلة مع ملف فئة المعالج أو الفئة المعتمدة "، err) ؛ }}}}تحليل العلامة
بعد تحميل أسماء الاسم ، تم تهيئة BattCnnamesPaceHandler ، ودعا BattCnnamesPaceHandler أيضًا طريقة init() لإكمال أعمال التهيئة. لذلك ، سأستمر في تنفيذ هذا الرمز: handler.parse(ele, new ParserContext(this.readerContext, this, containingBd)); حل علامة محددة.
Public Class NamespaceHandLersupport {Override @nullable public beandefinition (عنصر العنصر ، parsercontext parsercontext) {beandefinitionparser parser = findParserForelement (عنصر ، parsercontext) ؛ العودة (المحلل! = null؟ parser.parse (عنصر ، parsercontext): null) ؛ } nullable beandefinitionparser findParserForelement (عنصر العنصر ، parsercontext parsercontext) {// تحليل سلسلة التطبيق المحلية في <battcn: application /> .getDelegate (). getLocalName (عنصر) ؛ BeanDefinitionParser parser = this.parsers.get (localName) ؛ if (parser == null) {parsercontext.getReaderContext (). fatal ("لا يمكن أن تقع beandefinitionparser للعنصر [" + localname + "] ، element) ؛ } إرجاع المحلل ؛ }}ببساطة ، هو العثور على مثيل ApplicationBeanDefinitionParser من المحللين والاتصال بأسلوبه doparse لمزيد من التحليل. أخيرًا ، إنه نفس روتين تحليل العلامة الافتراضية ...
لخص
بعد بضع خريف غير معروف ، الشتاء والربيع والصيف ، سيتبع كل شيء الاتجاه الذي تريده ...
حسنًا ، ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.
قل شيئا
رمز النص الكامل: https://gitee.com/battcn/battcn-spring-source/tree/master/chapter2