مقدمة
تحلل هذه المقالة مبدأ العمل في Spring Boot 1.3. حذاء الربيع 1.4. بعد ذلك ، تم العثور على هيكل التغليف للتغيير وأضيف دليل Boot-Inf ، ولكن المبدأ الأساسي يبقى دون تغيير.
للتغييرات في classloader في Spring Boot 1.4.*، يرجى الرجوع إلى: http://www.vevb.com/article/141479.htm
بدء تشغيل SPRING BOOT السريع
في SPRING BOOT ، تتمثل الميزة الجذابة للغاية في أنه يمكن تعبئة التطبيق مباشرة في جرة/حرب ، ثم يمكن بدء تشغيل الجرة/الحرب مباشرة دون تكوين خادم ويب آخر.
إذا لم تكن قد استخدمت SPRING BOOT من قبل ، فيمكنك تجربته من خلال العرض التوضيحي أدناه.
فيما يلي مشروع كمثال لتوضيح كيفية بدء مشروع Boot Boot:
git clone [email protected]: hengyunabc/spring-boot-demo.gitmvn spring-boot-demojava -jar target/demo-0.0.1-snapshot.jar
إذا كانت IDE المستخدمة هي SPRING STS أو IDEA ، فيمكنك إنشاء مشروع التمهيد الربيعي من خلال المعالج.
يمكنك أيضًا الرجوع إلى البرنامج التعليمي الرسمي:
http://docs.spring.io/spring-boot/docs/current-snapshot/reference/htmlsingle/#getting-first-application
سؤالان حول حذاء الربيع
عندما تبدأ أولاً في الاتصال بـ Spring Boot ، عادة ما يكون لديك هذه الأسئلة
دعنا نحلل كيف يتم تمهيد الربيع.
كيف يتم تشغيل الحذاء الربيعي عند تعبئته كجرة واحدة
بعد تعبئة Maven ، سيتم إنشاء ملفين جرة:
DEMO-0.0.1-SNAPSHOT.JARDEMO-0.0.1-SNAPSHOT.JAR.ORIGINAL
حيث Demo-0.0.1-snapshot.jar.original هو حزمة Maven-Jar-Plugin الافتراضية.
DEMO-0.0.1-SNAPSHOT.JAR عبارة عن حزمة جرة تم إنشاؤها بواسطة مكون Spring Boot Maven ، والذي يحتوي على تبعيات للتطبيق والفئات المتعلقة بالتمهيد الربيعي. فيما يلي ، يطلق عليه سمين جرة.
أولاً ، دعنا نتحقق من بنية الدليل للحزم التي أعدتها SPRING BOOT (حذفها إذا لم تكن مهمة):
├ meta-inf│ ├ ├ manif missest.mf├ application.properties├ ├ └ └ └ └ springbootdemoapplication.class├ ├ lib│ lib│ upalliance-1.0.jar│ ├ spring-beans-4.2.3. boot └ loader ├ Executivearchivelauncher.class ├ jarlauncher.class ├ javaagentdetector.class ├ LaunchedUrlClassloader.class ├ Launcher.class ├ mainmethodrunner.class ├ ...
دعونا نلقي نظرة على هذه المحتويات بدوره.
بيان
بيان العرض: 1.0START-CLASS: com.example.SpringBOOTDEMOAPPLICATIONINGEMPLIGETINGE-PENDOND-ID: COM.EXAMPLESPRING-BOOT-Version: 1.3.0.RELEASECREATED-BY: APACHE MAVEN 3.3.3BUILD-JDK: 1.8.0_60IMPLEMITOR: PIVOTAL org.springframework.boot.loader.jarlauncher
يمكنك أن ترى أن الفئة الرئيسية هي org.springframework.boot.loader.jarlauncher ، وهي الوظيفة الرئيسية التي بدأتها JAR.
هناك أيضًا فئة بدءية وهي com.example.SpringBootDemOapplication ، وهي الوظيفة الرئيسية التي نطبقها.
springbootapplicationpublicpublicpublic springbootdemoapplication {public static void main (string [] args) {springapplication.run (springbootdemoapplication.class ، args) ؛ }} com/مثال الدليل
هنا ملف .class التطبيق.
دليل lib
فيما يلي ملف حزمة JAR الذي يعتمد عليه التطبيق.
على سبيل المثال ، فونز الربيع ، Spring-MVC وغيرها من الجرار.
org/springframework/boot/loader دليل
هنا ملف .class من لوادر التمهيد الربيع.
مفهوم الأرشيف
في الحذاء الربيعي ، يتم استخلاص مفهوم الأرشيف.
يمكن أن يكون الأرشيف جرة (جارفيلي بحثية) أو دليل ملفات (OperEdEdarchive). يمكن فهمه على أنه طبقة موارد الوصول الموحدة التي تم استخلاصها بواسطة SPRING BOOT.
العرض التوضيحي أعلاه-0.0.1-snapshot.jar هو أرشيف ، ثم كل حزمة جرة تحت /دليل lib في العرض التوضيحي-0.1.1-snapshot.jar هي أيضًا أرشيف.
Archive Class Archive العامة {Public Abstract URL geturl () ؛ السلسلة العامة getMainClass () ؛ مجموعة التجريد العامة <TENTROM> getEntries () ؛ قائمة المجردة العامة <Archive> getNtedArchives (مرشح الدخول) ؛يمكنك أن ترى أن الأرشيف له عنوان URL الخاص به ، مثل:
جرة: ملف: /tmp/target/demo-0.0.1-snapshot.jar!/
هناك أيضًا وظيفة getNtedArchives ، والتي تُرجع بالفعل قائمة أرشيف الجرار بموجب العرض التجريبي-0.0.1-snapshot.jar/lib. عناوين URL الخاصة بهم هي:
jar: ملف: /tmp/target/demo-0.0.1-snapshot.jar! /lib/aopalliance-1.0.jarjar: ملف: /tmp/target/demo-0.0.1-snapshot.jar!
Jarlauncher
من Meantest.mf ، يمكننا أن نرى أن الوظيفة الرئيسية هي Jarlauncher. دعنا نحلل سير العمل أدناه.
هيكل الميراث لفئة jarlauncher هو:
Class jarlauncher يمتد ExecutivearchivelauncherClass Executivearchivelauncher يمتد قاذفة
قم بإنشاء أرشيف مع Demo-0.0.1-snapshot.jar:
يجد Jarlauncher أولاً مسار الجرة التي يوجد بها ، أي عرضًا لـ 0.0.1-snapshot.jar ، ثم يقوم بإنشاء أرشيف.
يعرض الرمز التالي خدعة كيفية العثور على موقع التحميل من الفصل:
Archive Final Archive CreateSearchive () يلقي الاستثناء {protectomain protectomain = getClass (). getProtectionDomain () ؛ CODESORCE CODESORCE = Protectomain.getCodesource () ؛ موقع URI = (CODESORCE == NULL؟ NULL: CODESORCE.GETLOCATION (). touri ()) ؛ مسار السلسلة = (الموقع == null؟ null: location.getScheMespecificPart ()) ؛ if (path == null) {رمي New IllegalStateException ("غير قادر على تحديد أرشيف مصدر الكود") ؛ } جذر الملف = ملف جديد (path) ؛ if (! root.exists ()) {رمي جديد alficalstateException ("غير قادر على تحديد أرشيف مصدر الكود من" + root) ؛ } return (root.isdirectory ()؟ OperDedarchive الجديد (الجذر): New Jarfilearchive (root)) ؛} احصل على الجرة أدناه lib/ وقم بإنشاء أداة تشغيل
بعد أن يقوم Jarlauncher بإنشاء أرشيف ، يستخدم وظيفة GetNtedArchives للحصول على جميع ملفات JAR أدناه DEMO-0.0.1-SNAPSHOT.JAR/LIB ويقوم بإنشاءها كقائمة.
لاحظ أنه كما ذكر أعلاه ، يحتوي الأرشيف على عنوان URL الخاص به.
بعد الحصول على عناوين URL لأرشيف ، ستحصل على صفيف عنوان URL [] ، واستخدم هذا لإنشاء جهاز تشغيل مخصص: LaunchedUrlClassloader.
بعد إنشاء classloader ، اقرأ فئة البدء من manitest.mf ، أي com.example.springbootdemoapplication ، ثم قم بإنشاء مؤشر ترابط جديد لبدء الوظيفة الرئيسية للتطبيق.
/*** قم بتشغيل التطبيق الذي تم إعطاء ملف الأرشيف و ClassLoader تم تكوينه بالكامل. */إطلاق الفراغ المحمي (string [] args ، سلسلة mainclass ، classloader classloader) يلقي استثناء {runnable runner = createMainMethodRunner (mainclass ، args ، classloader) ؛ Thread RunnerThRead = New Thread (Runner) ؛ RunnerThread.setContextClassLoader (classloader) ؛ RunnerThread.setName (thread.currentThRead (). getName ()) ؛ RunnerThread.start () ؛}/*** إنشاء {Code MainMethodRunner} المستخدم لإطلاق التطبيق. */محمي Runnable CreateMainMethodRunner (سلسلة mainclass ، string [] args ، classloader classloader) يلقي الاستثناء {class <؟ مُنشئ <؟> constructor = runnerclass.getConstructor (string.class ، string []. class) ؛ عودة (Runnable) Constructor.newinstance (mainclass ، args) ؛} LaunchedUrlClassloader
الفرق بين LaunchedUrlClassloader و urlClassLoader العادي هو أنه يوفر القدرة على تحميل .Class من الأرشيف.
الجمع بين وظيفة getentries التي توفرها الأرشيف ، يمكنك الحصول على المورد في الأرشيف. بالطبع لا يزال هناك العديد من التفاصيل في الداخل ، لذلك سأصفها أدناه.
ملخص لعملية بدء تشغيل تطبيق Boot
بعد رؤية ذلك ، يمكنك تلخيص عملية بدء تشغيل تطبيق Boot SPRING:
التفاصيل في تحميل الحذاء الربيعي
عنوان الرمز: https://github.com/spring-projects/spring-boot/tree/master/spring-boot-tools/spring-boot-loader
امتدادات عناوين URL Jarfile
يمكن أن يبدأ Boot Boot مع جرة سمين. أهم شيء هو أنه ينفذ طريقة التحميل للجرة في جرة.
يمكن العثور على تعريف عنوان URL Jarfile الأصلي لـ JDK هنا:
http://docs.oracle.com/javase/7/docs/api/java/net/jarurlconnection.html
يبدو أن عنوان URL الأصلي Jarfile مثل هذا:
جرة: ملف: /tmp/target/demo-0.0.1-snapshot.jar!/
عنوان URL للموارد في حزمة جرة:
انسخ الرمز على النحو التالي: jar: ملف: /tmp/target/demo-0.0.1-snapshot.jar! /com/example/springbootdemoapplication.class
يمكنك أن ترى أنه بالنسبة للموارد في جرة ، يتم فصل التعريف بـ "!/". عنوان URL الأصلي Jarfile يدعم واحد فقط '!/'.
يمتد SPRING BOOT هذا البروتوكول لدعم متعددة "!/" ، والذي يمكن أن يمثل جرة في جرة ، جرة في موارد الدليل.
على سبيل المثال ، يمثل عنوان URL التالي BANS-BEANS-4.2.3
انسخ الرمز كما يلي: jar: ملف: /tmp/target/demo-0.0.1-snapshot.jar! /lib/spring-beans-4.2.3.release.jar!
urlstreamhandler المخصص ، تمديد Jarfile و JarurlConnection
عند إنشاء عنوان URL ، يمكنك تمرير معالج ، ويأتي JDK مع فئة معالج افتراضي. يمكن للتطبيق تسجيل المعالج نفسه للتعامل مع عناوين URL المخصصة.
عنوان URL العام (بروتوكول السلسلة ، مضيف السلسلة ، منفذ int ، ملف السلسلة ، معالج urlstreamhandler) يلقي malformedurlexception
الرجوع إلى:
https://docs.oracle.com/javase/8/docs/api/java/net/url.html#url-java.lang.string-java.lang.string-int-java.lang.string-
يتولى SPRING BOOT منطق الجرار المتعددة في الجرار عن طريق تسجيل فئة معالج مخصصة.
سوف يستخدم هذا المعالج softreference لتخزين جميع جارفيل المفتوحة.
عند معالجة عناوين URL مثل ما يلي ، تتم معالجة فاصل '!/'. ابتداءً من الطبقة العليا ، قم ببناء أولا Demo-0.0.1-snapshot.jar ، ثم بناء jarfile Spring-Beans-4.2.3.Release.jar ، ثم بناء jarurlconnection مشيرا إلى manesest.mf.
انسخ الرمز كما يلي: jar: ملف: /tmp/target/demo-0.0.1-snapshot.jar! /lib/spring-beans-4.2.3.release.jar!
//org.springframework.boot.loader.jar.HandlerPublic Class Handler يمتد urlstreamhandler {private static final string seplator = "!/" ؛ softreference ثابت خاص <map <file ، jarfile >> rootfilecache ؛ Override محمي urlConnection OpenConnection (url url) يلقي ioException {if (this.jarfile! = null) {return new jarurlconnection (url ، this.jarfile) ؛ } جرب {return new jarurlConnection (url ، getRootjarfileFromurl (url)) ؛ } catch (استثناء ex) {return OpenFallBackConnection (url ، ex) ؛ }} public jarfile getRootjarfileFromurl (url url) يلقي ioException {String spec = url.getFile () ؛ int explatorIndEx = spec.indexof (فاصل) ؛ if (QuipatorIndex == -1) {رمي مشجل جديد ("url url لا يحتوي على!/ فاصل") ؛ } اسم السلسلة = spec.subString (0 ، explatorIndex) ؛ إرجاع getRootjarfile (الاسم) ؛ } كيف يقرأ classloader للموارد
ما هي القدرات التي تتطلبها لمحول الفصل؟
واجهة برمجة التطبيقات المقابلة هي:
عنوان URL العام FindResource (اسم السلسلة) Public InportStream getResourCeasStream (اسم السلسلة)
كما هو مذكور أعلاه ، عندما يتم تشغيل Boot Boot Spring TarchedUrlClassLoader ، فإنه يمرر عنوان URL []. الصفيف هو عنوان URL للجرة تحت دليل LIB.
كيف تعرف JDK أو ClassLoader كيفية قراءة المحتوى فيه لعنوان URL؟
في الواقع ، تبدو العملية هكذا:
المكالمة النهائية هي وظيفة getInputStream () من JarurlConnection.
//org.springframework.boot.loader.jar.jarurlConnection Override publicstream getInputStream () رمي ioException {connect () ؛ if (this.jarentryname.isempty ()) {رمي iOexception جديد ("لم يحدد اسم الإدخال") ؛ } إرجاع this.jarentrydata.getInputStream () ؛ }من عنوان URL إلى قراءة المحتوى أخيرًا في عنوان URL ، تكون العملية برمتها معقدة للغاية. دعونا نلخص:
هناك العديد من التفاصيل هنا ، يتم سرد بعض النقاط المهمة فقط.
ثم ، كيف urlclassloader getResource؟
عند إنشاء urlClassloader ، يحتوي على معلمات صفيف URL [] ، وسوف تستخدم هذه الصفيف لإنشاء urlclasspath:
urlClassPath UCP = urlClasspath جديد (urls) ؛
في urlclasspath ، سيتم بناء محمل لجميع عناوين URL ، ثم عند الحصول على Betresource ، سيحاول الحصول عليها من هذه اللوادر واحدة تلو الأخرى.
إذا نجحت عملية الاستحواذ ، يتم تعبئتها كمورد على النحو التالي.
Resource GetResource (اسم السلسلة النهائية ، فحص منطقي) {url url النهائي ؛ حاول {url = url جديد (قاعدة ، parseutil.encodepath (الاسم ، خطأ)) ؛ } catch (malformedUrlexception e) {throw new alficalArgumentException ("name") ؛ } urlconnection النهائي UC ؛ حاول {if (check) {urlClassPath.check (url) ؛ } uc = url.openconnection () ؛ inputStream في = uc.getInputStream () ؛ إذا كان (uc extryof jarurlConnection) { / * بحاجة إلى تذكر ملف الجرة حتى يمكن إغلاقه * على عجل. */ jarurlConnection Juc = (jarurlConnection) UC ؛ jarfile = jarloader.checkjar (juc.getjarfile ()) ؛ }} catch (استثناء e) {return null ؛ } إرجاع New Resource () {public string getName () {return name ؛ } url public geturl () {return url ؛ } URL العام getCodesourceUrl () {return base ؛ } public inputstream getInputStream () يلقي ioException {return uc.getInputStream () ؛ } public int getContEntLength () remrows ioException {return uc.getContentLength () ؛ }} ؛}كما ترون من الكود ، يسمى url.openconnection () بالفعل. بهذه الطريقة يمكن توصيل السلسلة الكاملة.
لاحظ أن رمز فئة urlclasspath لا يأتي مع JDK. هنا يمكنك رؤية http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/misc/urlclasspath.java#506
ابدأ تطبيق Boot Spring في IDE/Open Directory
ما سبق ذكر فقط عملية بدء تطبيق التمهيد الربيع في جرة الدهون. فيما يلي تحليل لكيفية بدء تشغيل الحذاء الربيعي في IDE.
في IDE ، فإن الوظيفة الرئيسية التي يتم تشغيلها مباشرة هي تطبيق وظيفتها الرئيسية الخاصة بها:
springbootapplicationpublicpublicpublic springbootdemoapplication {public static void main (string [] args) {springapplication.run (springbootdemoapplication.class ، args) ؛ }}في الواقع ، يعد بدء تشغيل SPRING BOOT في IDE أسهل حالة ، لأن الجرار التبعية يتم وضعها في ClassPath ، لذلك تم بدء تشغيل SPRING BOOT للتو.
هناك موقف آخر هو بدء تشغيل Spring Boot في دليل مفتوح. الدليل المفتوح المزعوم هو فك ضغط الجرة الدهنية ثم بدء التطبيق مباشرة.
java org.springframework.boot.loader.jarlauncher
في هذا الوقت ، سيحدد Spring Boot ما إذا كان موجودًا حاليًا في دليل. إذا كان الأمر كذلك ، فقم ببناء explodarchive (السابق هو jarfilearchive) ، وعملية بدء التشغيل اللاحقة تشبه جرة الدهون.
حماية عملية بدء تشغيل Tomcat
حدد ما إذا كان في بيئة الويب
عند بدء تشغيل Boot Spring ، حدد أولاً ما إذا كان في بيئة الويب من خلال البحث ببساطة في فئة Servlet:
السلسلة النهائية الثابتة الخاصة الخاصة [] web_environment_classes = {"javax.servlet.servlet" ، "org.springframework.web.context.configableWableBaplicationContex (! classutils.ispresent (className ، null)) {return false ؛ }} إرجاع صحيح ؛}إذا كان الأمر كذلك ، فسيتم إنشاء encontationConfigEmMedDedWebapplicationContext ، وإلا
//org.springframework.boot.springapplication محمية configurableApplicationContext CreateApplicationContext () {class <؟> contextClass = this.applicationContextClass ؛ if (contextClass == null) {try {contextClass = class.forname (this.webenvironment؟ default_web_context_class: default_context_class) ؛ } catch (classnotfoundException ex) {رمي جديد غير aluvalstateException ("غير قادر على إنشاء تطبيق applicationcontext افتراضي ،" + "يرجى تحديد ApplicationContextClass" ، ex) ؛ }} return (configurableApplicationContext) BeanUtils.instantiate (contextClass) ؛ } احصل على فئة التنفيذ في inmbedservletcontainerfactory
يبدأ SPRING BOOT خادم الويب المقابل من خلال الحصول على umbedServletContainerFactory.
فئتي التنفيذ الشائعة الاستخدام هما TomCatemBedDedServletContainerFactory و JetTyembedDedServletContainerFactory.
رمز لبدء tomcat:
// tomcatembeddedservletcontainerfactory@overridepublic inmbeddedservletcontainer getembeddedservletcontainer (servletContextInitializer ... initializers) {tomcat tomcat = tomcat () ؛ file riledir = (this.basedirectory! = null؟ this.basedir: createTempdir ("tomcat")) ؛ tomcat.setbasedir (ripalir.getabsolutepath ()) ؛ موصل الموصل = موصل جديد (this.protocol) ؛ tomcat.getService (). addConnector (موصل) ؛ CustomIzeConnector (موصل) ؛ tomcat.setConnector (موصل) ؛ tomcat.gethost (). setautodeploy (false) ؛ tomcat.getEngine (). setbackgroundprocessordelay (-1) ؛ لـ (Connector extraConnector: this.additionaltomcatconnectors) {tomcat.getService (). addConnector (addaConnector) ؛ } prepareContext (tomcat.gethost () ، initializers) ؛ إرجاع getTomCatemBedDedServletContainer (tomcat) ؛} سيتم إنشاء دليل ملفات مؤقت لـ Tomcat ، مثل:
/tmp/tomcat.2233614112516545210.8080 ، كأساس Tomcat. سيتم وضع ملفات Tomcat المؤقتة ، مثل دليل العمل ، في الداخل.
سيتم أيضًا تهيئة بعض servlets tomcat ، مثل الافتراضي الأكثر أهمية/JSP Servlet:
private void addDefaultServlet (Context Context) {wrapper defaultServlet = context.createwRapper () ؛ DefaultServlet.setName ("Default") ؛ DefaultServlet.SetServletClass ("org.apache.catalina.servlets.defaultservlet") ؛ DefaultServlet.addinitParameter ("Debug" ، "0") ؛ DefaultServlet.addinitParameter ("قوائم" ، "خطأ") ؛ DefaultServlet.setLoadonStartup (1) ؛ // وإلا لا يمكن تعيين الموقع الافتراضي لرسالة SPRING SPATCHERSEVLET. context.addchild (DefaultServlet) ؛ context.addservletmapping ("/" ، "افتراضي") ؛} private void addjspservlet (سياق السياق) {clospper jspservlet = context.createwRapper () ؛ JSpservlet.setName ("JSP") ؛ jSpservlet.SetServletClass (getJSpservletClassName ()) ؛ jspservlet.addinitparameter ("fork" ، "false") ؛ jSpservlet.setloadonstartup (3) ؛ context.addchild (jspservlet) ؛ context.addservletmapping ("*. JSP" ، "JSP") ؛ context.addservletmapping ("*. JSPX" ، "JSP") ؛} كيفية الوصول إلى الموارد مع تطبيق Spring Boot Web
كيف يمكنني الوصول إلى مورد الويب عندما يتم تعبئة تطبيق SPRING Boot كجرة سمينة؟
يتم تنفيذها فعليًا من خلال عنوان URL الذي يوفره الأرشيف ثم من خلال القدرة على الوصول إلى مورد ClassPath الذي يوفره ClassLoader.
index.html
على سبيل المثال ، تحتاج إلى تكوين index.html ، والتي يمكن وضعها مباشرة في الدليل SRC/Main/Resources/Static في الرمز.
بالنسبة لصفحة الترحيب index.html ، عند تهيئة Boot Spring ، سيتم إنشاء ViewController للتعامل مع:
. السلسلة النهائية الثابتة الخاصة [] classpath_resource_locations = {"classpath:/meta-inf/" ، "classpath:/" ، "classpath:/static/" ، "classpath:/public/"} ؛ // webmvcautoconfigurationAdAdeRdride public void addViewControllers (viewControllerRegistry Recistry) {page rogresistr = this.resourceProperties.getWelcomePage () ؛ if (page! = null) {logger.info ("إضافة صفحة الترحيب:" + page) ؛ registry.addviewController ("/"). setViewName ("forward: index.html") ؛ }} نموذج
على سبيل المثال ، يمكن وضع ملف قالب الصفحة في دليل SRC/Main/Resources/قالب. ولكن يتم التعامل مع هذا بالفعل من قبل فئة تنفيذ القالب نفسها. على سبيل المثال ، في فئة ThymeleafProperties:
السلسلة النهائية الثابتة العامة default_prefix = "classpath:/templates/" ؛
JSP
تشبه صفحة JSP القالب. يتم التعامل معها بالفعل من خلال JSTLVIEW التي تم بناؤها في الربيع MVC.
يمكنك تكوين spring.view.prefix لتعيين دليل صفحة JSP:
spring.view.prefix:/web-inf/jsp/
التعامل مع صفحات الأخطاء الموحدة في صندوق الربيع
بالنسبة لصفحات الخطأ ، يتم التعامل مع SPRING BOOT بشكل موحد عن طريق إنشاء BasicErrorController.
@controller@requestmapping ("$ {server.error.path: $ {error.path:/error}}")العرض المقابل هو تذكير HTML بسيط:
@configuration@intevalonproperty (prefix = "server.error.whitelabel" ، name = "enabled" ، matchifmissing = true) conditional (errortempateMissingCondition.class) فئة ثابتة من الفئة وايتلابيلرورورورور. "<html> <body> <h1> صفحة خطأ Whitelabel </h1>" + "<p> لا يحتوي هذا التطبيق على رسم خرائط صريح لـ/خطأ ، لذلك فأنت ترى هذا على أنه احتياطي. </p> الحالة = $ {الحالة}). </div> " +" <viv> $ {message} </viv> </body> </html> ") ؛ bean (name = "error") conditionalonMissingBean (name = "error") عرض عام DefaulterRorView () {return this.defaulterrorview ؛ }يعد Spring Boot ممارسة جيدة ، تتجنب الاستثناء الافتراضي الذي يتم طرحه عندما ترتكب تطبيقات الويب التقليدية أخطاء ، مما يجعل من السهل تسرب الأسرار.
عملية تغليف Maven لتطبيق Boot
أولاً ، قم بإنشاء جرة تحتوي على تبعيات من خلال maven-shade-plugin ، ثم قم بتعبئة الفصول المتعلقة بمسند الحذاء الربيعي و manesest.
تنفيذ سجلات الألوان في صندوق الربيع
عند بدء تشغيل تطبيق Boot Spring في shell ، ستجد أن إخراج المسجل الخاص به ملون ، وهو أمر مثير للاهتمام للغاية.
يمكن إيقاف تشغيل هذا الإعداد:
spring.output.ansi.Endabled = false
المبدأ هو الحصول على هذا التكوين من خلال ANSIOUTPUPPLICATIONLICATIONLICATIONLICATION ، ثم تعيين التسجيل على الإخراج ، وإضافة colorConverter ، وتقديم بعض الحقول من خلال org.springframework.boot.ansi.ansioutput.
بعض نصائح الكود
عند تطبيق classloader ، دعم تحميل JDK7 الموازي
يمكنك الرجوع إلى Lockprovider في LaunchedUrlClassloader
يمتد فئة Public LaunchedUrlClassladerer urlClassloader {private static lockprovider lock_provider = setuplockprovider () ؛ خاص ثابت lockprovider setuplockprovider () {try {classLoader.registerAsparaldallecable () ؛ إرجاع New Java7lockProvider () ؛ } catch (nosuchmethoderror ex) {return new lockprovider () ؛ }} Override فئة محمية <؟> loadclass (اسم السلسلة ، حل منطقي) يلقي classnotfoundException {synchronized (launchedUrlClassloader.lock_provider.getlock (هذا ، الاسم)) {class <؟ if (loadedClass == null) {handler.setusefastConnectionExceptions (true) ؛ حاول {loadedClass = doloadClass (name) ؛ } أخيرًا {handler.setusefastConnectionExceptions (false) ؛ }} if (حل) {solveClass (loadedClass) ؛ } إرجاع loadedClass ؛ }} تحقق مما إذا كان يتم تحميل حزمة الجرة من خلال الوكيل
InputArgumentsJavaAgentDetector ، المبدأ هو اكتشاف ما إذا كان عنوان URL في الجرة لديه بادئة "-javaagent:".
السلسلة النهائية الثابتة الخاصة java_agent_prefix = "-javaagent:" ؛
احصل على PID من العملية
ApplicationPid ، يمكنك الحصول على PID.
سلسلة خاصة getPid () {try {string jvMname = managementfactory.getRuntimeMxBean (). getName () ؛ إرجاع jvmname.split ("@") [0] ؛ } catch (throwable ex) {return null ؛ }} فئة المسجل التغليف
يحتوي Spring Boot على مجموعة من عمليات تسجيل الدخول التي تدعم Java و Log4J و Log4J2 و Logback. يمكنك الرجوع إلى هذا عندما تحتاج إلى حزم سجلاتك بنفسك في المستقبل.
تحت الحزمة org.springframework.boot.logging.
احصل على الوظيفة الرئيسية الأصلية
من خلال الطريقة التي تم الحصول عليها في المكدس ، احكم على الوظيفة الرئيسية وابحث عن الوظيفة الرئيسية الأصلية.
فئة خاصة <؟> dervucemainapplicationClass () {try {StackTraceElement [] stackTrace = new RunTimeException (). getStackTrace () ؛ لـ (StackTraceElement stackTraceElement: stacktrace) {if ("main" .equals (stackTraceElement.getMethodName ())) {return class.forname (stackTraceElement.getClassName ()) ؛ } { بعض عيوب SPIRNG BOOT:
عندما يعمل تطبيق Boot Spring في جرة سمينة ، سيتم مواجهة بعض المشكلات. ها هي آرائي الشخصية:
لخص
يمتد SPRING BOOT على بروتوكول JAR ، وتجريد مفهوم الأرشيف ، ودعم Jarfile ، jarurlConnection ، و LaunchedUrlClassloader ، وبالتالي تحقيق تجربة تطوير الجميع في واحد دون تصور لتطبيق الطبقة العليا. على الرغم من أن الحرب القابلة للتنفيذ ليست مفهومًا يقترحه الربيع ، إلا أن SPRING BOOT يتيح أن يتم نقله إلى الأمام.
Spring Boot هو مشروع رائع ، يمكن القول أنه ربيع الربيع الثاني. الربيع السحابي ، وجلسة الربيع ، والمقاييس ، والقذيفة عن بُعد ، وما إلى ذلك ، جميع المشاريع والميزات التي يحبها المطورون. من المؤكد تقريبًا أن المصمم لديه تجربة غنية في تطوير الخط الأمامي ويدرك جيدًا نقاط الألم للمطورين.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.