Երբևէ մտածե՞լ եք, թե իրականում ինչ է պատահել, երբ սեղմում եք «Գործարկել գարնանային հավելվածը»:

Այս կոնֆիգուրացիայի դասերի խորը ուսումնասիրությունից մի քանի օր հետո ես հասկացա (մի փոքր) ինչպես է այս շրջանակը սկզբնավորում Spring հավելվածը:

Ավելին, ես գնահատում եմ յուրաքանչյուր մեկնաբանություն, որը կառուցում է այս թեման: Ինձ համար պատիվ կլինի, երբ այս թեման ձեզ որոշակի արժեքավոր գիտելիքներ բերի:

Ես խրախուսում եմ ձեզ խորացնել այս վերացական դասերը և ինտերֆեյսները ձեր IDE-ում, որպեսզի խորապես հասկանաք այս շրջանակը: Հավատացեք ինձ, դա բացարձակապես հիասքանչ է: Եվ եթե դուք նկատում եք ինչ-որ հետաքրքիր բան Գարնան մասին, պարզապես մեկնաբանեք ստորև, դա լավագույնն է սովորել միմյանցից:

Իմ կոնտակտը

Իմ մյուս հոդվածները

Ջերմություն

Ամենացածր դասը մեր հատուկ կոնֆիգուրացիան է: Որպեսզի պարզեցնեք և ձեր կատարածը ուղու վրա պահեմ, ես հեռացրել եմ որոշ չօգտագործված մեթոդներ, ինչպես նաև կոդերի մի շարք, որոնք չեն ազդում մեր ցուցադրման վրա:

Հիմնական քննարկում

ինտերֆեյս 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()-ին կկանչվի AbstractAnnotationConfigDispatcherServletInitializergetRootConfigClasses() մեթոդը: Այդ մեթոդը պարունակում է ցանկացած դաս՝ կապված արմատական ​​հավելվածի համատեքստի սկզբնավորման հետ:

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 դասից:

Ամփոփել

Շատ վերացական դասեր և ինտերֆեյսներ ժառանգված և ներդրված լինելը կարող է ձեզ մի փոքր շփոթեցնել: Սա իրականում կատարվածի հերթականությունն է։ Կոդը կարող եք տեսնել ստորև:

Հղումներ