Երբևէ մտածե՞լ եք, թե իրականում ինչ է պատահել, երբ սեղմում եք «Գործարկել գարնանային հավելվածը»:
Այս կոնֆիգուրացիայի դասերի խորը ուսումնասիրությունից մի քանի օր հետո ես հասկացա (մի փոքր) ինչպես է այս շրջանակը սկզբնավորում Spring հավելվածը:
Ավելին, ես գնահատում եմ յուրաքանչյուր մեկնաբանություն, որը կառուցում է այս թեման: Ինձ համար պատիվ կլինի, երբ այս թեման ձեզ որոշակի արժեքավոր գիտելիքներ բերի:
Ես խրախուսում եմ ձեզ խորացնել այս վերացական դասերը և ինտերֆեյսները ձեր IDE-ում, որպեսզի խորապես հասկանաք այս շրջանակը: Հավատացեք ինձ, դա բացարձակապես հիասքանչ է: Եվ եթե դուք նկատում եք ինչ-որ հետաքրքիր բան Գարնան մասին, պարզապես մեկնաբանեք ստորև, դա լավագույնն է սովորել միմյանցից:
Իմ կոնտակտը
- Facebook. Phan Hoang Minh Luan
- LinkedIn. Phan Hoang Minh Luan
- Էլփոստ՝ [email protected]
Իմ մյուս հոդվածները
- «Ինչպե՞ս է Գարունը սկզբնավորվում գլխարկի տակ: - Մաս 1"
- Ինչպե՞ս է Գարունը սկզբնավորվում գլխարկի տակ: — Մաս 3
Ջերմություն
Ամենացածր դասը մեր հատուկ կոնֆիգուրացիան է: Որպեսզի պարզեցնեք և ձեր կատարածը ուղու վրա պահեմ, ես հեռացրել եմ որոշ չօգտագործված մեթոդներ, ինչպես նաև կոդերի մի շարք, որոնք չեն ազդում մեր ցուցադրման վրա:
Հիմնական քննարկում
ինտերֆեյս WebApplicationInitializer
Ցանկացած դաս, որն իրականացնում է այս ինտերֆեյսը, հավելվածի գործարկման ժամանակ սկանավորվելու է Spring Container-ի կողմից: Այս դասը միայն 1 դեր ունի՝ հավաքել վեբ հավելվածի շարժական մասը՝ xml
-ով կարգավորելու փոխարեն:
Կարծում եմ՝ հարց կունենաք. Ինչպես է գործարկվում onStartUp(ServletContext)
մեթոդը: Մանրամասները կբացահայտվեն իմ հաջորդ թեմայում, մնացեք լարված։
Նախ, երբ մենք գործարկում ենք հավելվածը, Spring Container-ը կկանչի onStartUp(ServletContex)
-ը WebApplicationInitializer
-ից: Այս մեթոդում կկանչվի ևս 2 մեթոդ՝ registerContextLoaderListener(ServletContext)
աբստրակտ դասի AbstractContextLoaderListener
արմատային հավելվածի համատեքստ ստեղծելու համար և registerDispatcherServlet(ServletContext)
աբստրակտ դասի AbstractDispatcherServletInitializer
՝ Dispatcher Servlet ստեղծելու համար: Ստորև մենք կուսումնասիրենք այս մեթոդները:
AbstractContextLoaderInitializer
Դասի անվանումը ակնհայտորեն բացահայտում է իր գործառույթը: Այս վերացական դասը պետք է գրանցի ContextLoaderListener
-ը Servlet համատեքստով:
ContextLoaderListener
-ը Servlet Context-ի համար լսող սարքելն է: Այս դասի դերը վեբ հավելվածի Servlet համատեքստի փոփոխությունների մասին ծանուցումներ ստանալն է:
ContextLoaderListener
-ում մենք ունենք 2 կարևոր մեթոդ, որոնք վերացված են ServletContextListener
( javax.servlet
) միջերեսից.
contextInitialized()
. զանգահարեք ցանկացած servlet-իinit()
մեթոդից կամ ցանկացած ֆիլտրի doFilter() մեթոդից առաջcontextDestroyed()
. կանչվել սերվերլետի կամ ֆիլտրիdestroy()
մեթոդից հետո:
AbstractDispatcherServletInitializer
Այս դասը պետք է ստեղծի Dispatcher Servlet-ը և ավելացվի Servlet Context-ին
n registerDispatcherServlet(ServletContext)
:
Servlet-ի անունը կստացվի getServletName()
-ի միջոցով (այս մեթոդը կարող է անտեսվել, եթե ոչ, ապա նրա անունը կլինի 'dispatcher-servlet '):
createServletApplicationContext()
մեթոդը կկանչվի և կվերադարձնի WebApplicationContext
օբյեկտ (այս մեթոդն իրականացվում է աբստրակտ AbstractAnnotationConfigDispatcherServlet
դասում, որը կքննարկվի ստորև):
Dispatcher Servlet-ը կստեղծվի որպես FrameworkServlet
ծնող դասից ժառանգված օբյեկտ: FrameworkServlet
-ը Spring Framework-ի բազային սերվերլետ է և ապահովում է WebApplicationContext
-ի հետ ինտեգրում:
AbstractAnnotationConfigDispatcherServletInitializer
Այս վերացական դասը մեր կողմից ստեղծված ցանկացած կոնֆիգուրացիայի դասի ուղղակի մայր դաս է:
createRootApplicationContext()
-ին կկանչվի AbstractAnnotationConfigDispatcherServletInitializer
-ի getRootConfigClasses()
մեթոդը: Այդ մեթոդը պարունակում է ցանկացած դաս՝ կապված արմատական հավելվածի համատեքստի սկզբնավորման հետ:
createServletApplicationContext()
-ում, ինչպես createRootApplicationContext()
-ին, այն նաև ստանում է կազմաձևման դասեր getServletConfigClasses()
-ից:
Բայց տարբերությունը createRootApplicationContext()
-ի և createServletApplicationContext()
-ի վերադարձի արժեքն է: Մինչդեռ առաջինը կարող է զրոյական լինել, երկրորդը չի կարող։ Քանի որ Spring MVC հավելվածը պետք է ունենա առնվազն մեկ դիսպետչեր սերվլետ՝ հաճախորդից հարցում ստանալու, վերահսկիչին քարտեզագրելու և հաճախորդին պատասխանելու համար:
Այսպիսով, եթե ունեք մեկ Dispatcher Servlet հավելված, ապա ձեզ հարկավոր է միայն կարգավորել արմատը կամ սերվիլետը: Օգտվելով 2 մեթոդի տարբերությունից՝ հեշտ է ստեղծել բազմակի դիսպետչեր Servlet հավելված, որը ծառայում է բազմաթիվ նպատակների: Օրինակ, դուք կարող եք առանձնացնել, թե որ սերվիլետը կկարգավորի api հարցումը, կամ որը կաշխատի MVC օրինակով հավելվածով: Api հարցումը կամ MVC նախշով հավելվածը կարող է ունենալ որոշ ընդհանուր կազմաձևեր, ինչպիսիք են HibernateConfig
կամ SecurityConfig
(որը կհայտարարվի createRootApplicationContext()
-ում) և որոշ տարբեր ռեսուրսներ, ինչպիսին է Controller-ը (որը կհայտարարվի createServletApplicationContext()
-ում, քանի որ RestController-ին պետք չեն կոնֆիգուրացիաներ, ինչպիսին է ViewResovler-ը, բայց պետք է Jackson-ը: օբյեկտը JSON-ին վերլուծելու համար):
Ես ձեզ ցույց կտամ, թե ինչպես ստեղծել մի քանի Dispatcher Servlets հավելված մեկ այլ թեմայում:
MyApplicationInitializer
Սա մեր հատուկ կազմաձևման դասն է, որն ունի 3 մեթոդ, որոնք վերացված են վերացական AbstractAnnotationConfigDispatcherServletInitializer
դասից:
Ամփոփել
Շատ վերացական դասեր և ինտերֆեյսներ ժառանգված և ներդրված լինելը կարող է ձեզ մի փոքր շփոթեցնել: Սա իրականում կատարվածի հերթականությունն է։ Կոդը կարող եք տեսնել ստորև: