рдЬрдм рдПрдХ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЕрджреНрдпрддрди рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдХрднреА рднреА рд╕рд░рд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ рдЕрд╡рд┐рд╡реЗрдХ рдХреА рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рд░реЗрдХ)ред рдФрд░ рдлрд┐рд░, рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЕрдиреБрднрд╡ - рдЖрдкрдХрд╛ рдЕрдкрдирд╛ рдпрд╛ рдХрд┐рд╕реА рдФрд░ рдХрд╛ - рдХреБрдЫ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░реЗрдЧрд╛ред
рдЬреЛрдХрд░ 2018 рд╕рдореНрдореЗрд▓рди рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2 рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рд╕реНрд╡рдпрдВ рдХрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдм рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╣реИрдмрд░ рдХреЗ рд▓рд┐рдП - рдЗрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдкрд╛рда рд╕рдВрд╕реНрдХрд░рдгред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдкреЛрд╕реНрдЯ рдореЗрдВ рдПрдХ рд╡реАрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ: рдЖрдк рдкреВрд░реА рдмрд╛рдд рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реАрдзреЗ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдЬрд╛рдПрдВ рдЬреЛ рдЖрдкрдХреЛ рдЪрд┐рдВрддрд┐рдд рдХрд░рддреА рд╣реИред
рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛
рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛ! рдореИрдВ рдЖрдкрдХреЛ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ рд░реЗрдХ рдХрд╣рддреЗ рд╣реИрдВ) рдЬреЛ рдЖрдкрдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЗ рдСрдкрд░реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореЗрд░рд╛ рдирд╛рдо рд╡реНрд▓рд╛рджрд┐рдореАрд░ рдкреНрд▓рд┐рдЬрд╝рдЧрд╛ (рдЧрд┐рдЯрд╣рдм) рд╣реИ, рдореИрдВ рд░реВрд╕ рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдФрд░ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдиреЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ, рд╕реАрдПрдлрдЯреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рд╕реЗ, рдореИрдВ рд╡рд╣рд╛рдВ рдмреИрдХрдПрдВрдб рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдкреНрд░реАрдкреЗрдб рдХрд╛рд░реНрдб рдХреЗ рдСрдирд▓рд╛рдЗрди рдмреИрдВрдХ рдХреЗ рддрдХрдиреАрдХреА рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╣ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдерд╛ рдХрд┐ рдореИрдВ рдПрдХ рдореЛрдиреЛрд▓рд┐рдерд┐рдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╕реЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЛрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (рдЬреЛ рдЕрднреА рднреА рдЬрд╛рд░реА рд╣реИ) рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд░реНрдЬрдХ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрдХ рдмрдиреЗред рдЦреИрд░, рдЪреВрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬреНрдЮрд╛рди рдЬреЛ рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЬрдорд╛ рд╣реБрдЖ рд╣реИ, рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдмрддрд╛рдКрдВрдЧрд╛ред
рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдЙрддреНрдкрд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ
рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдиреЗрдЯ рдмреИрдВрдХ рд╣реИ рдЬреЛ рд░реВрд╕ рднрд░ рдореЗрдВ рджреЛ-рджрд░реНрдЬрди рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдЭреЗрджрд╛рд░ рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЛ рдПрдХрд▓-рд╕реЗрд╡рд╛рд░рдд рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рджреВрд░рд╕реНрде рдмреИрдВрдХрд┐рдВрдЧ рд╕реЗрд╡рд╛рдУрдВ (рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рд╕рд╛рдЗрдЯреНрд╕) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдкреИрд╕реЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рднрд╛рдЧреАрджрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмреАрд▓рд╛рдЗрди рдФрд░ рдЗрд╕рдХрд╛ рднреБрдЧрддрд╛рди рдХрд╛рд░реНрдб рд╣реИред рдпрд╣ рдЗрдВрдЯрд░рдиреЗрдЯ рдмреИрдВрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд░рд╣рд╛,
рдорд╛рд░реНрдХрд╕реНрд╡реЗрдм рдореЛрдмрд╛рдЗрд▓ рдмреИрдВрдХрд┐рдВрдЧ рд░реИрдВрдХ рдХреА рд░реЗрдЯрд┐рдВрдЧ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдЙрддреНрдкрд╛рдж рдиреЗ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╕реНрдерд╛рди рд▓реЗ рд▓рд┐рдПред
"рд╣рд┐рдореНрдордд" рдЕрднреА рднреА рд╕рдВрдХреНрд░рдордг рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдореЛрдиреЛрд▓рд┐рде, рддрдерд╛рдХрдерд┐рдд рдХреЛрд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ 23 рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдирд┐рд░реНрдорд┐рдд рд╣реИрдВред рдЕрдВрджрд░, рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рдЙрдб рдиреЗрдЯрдлреНрд▓рд┐рдХреНрд╕ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕, рд╕реНрдкреНрд░рд┐рдВрдЧ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2 рдкрд░, рдпрд╣ рдкреВрд░реА рдЪреАрдЬ рдЬреБрд▓рд╛рдИ рдХреЗ рдорд╣реАрдиреЗ рд╕реЗ рдЙрдбрд╝рд╛рди рднрд░ рд░рд╣реА рд╣реИред рдФрд░ рдмрд╕ рдЗрд╕ рдЬрдЧрд╣ рдкрд░ рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд░рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдХреБрдЫ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдорд┐рд▓реАрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред
рд░рд┐рдкреЛрд░реНрдЯ рдХреА рд░реВрдкрд░реЗрдЦрд╛

рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2 рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреАрдВ, рд╣рдо рд╕рднреА рдкрд░ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЕрдиреБрднрд╡реА рдЬрд╛рд╕реВрд╕ рдпрд╛ рдЕрдиреНрд╡реЗрд╖рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдХреЛрдИ рд╣реИ рдЬреЛ рдЗрд╕ рд╕рдм рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдПред рдЪреВрдВрдХрд┐ рд╣реЛрдореНрд╕ рдФрд░ рд╡реЙрдЯрд╕рди рдкрд╣рд▓реЗ
рд╕реЗ рд╣реА рдЬреЛрдХрд░ рдореЗрдВ
рдПрдХ рдкреНрд░рд╕реНрддреБрддрд┐ рджреЗ рдЪреБрдХреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдПрдХ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд▓реЗрдлреНрдЯрд┐рдиреЗрдВрдЯ рдХреЛрд▓рдВрдмреЛ рджреНрд╡рд╛рд░рд╛ рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдПрдЧреАред рдЖрдЧреЗ рдмрдврд╝реЛ!
рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ / 2
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдгред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд▓ рдирд╣реАрдВ: 1 рдорд╛рд░реНрдЪ 2018 рдХреЛ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрд▓рдмреНрдзрддрд╛ рдореЗрдВ рдерд╛ред рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдкреАрдЫрд╛ рдХрд┐рдпрд╛ рдерд╛ рд╡рд╣ рд╕реНрд░реЛрдд рд╕реНрддрд░ рдкрд░ рдЬрд╛рд╡рд╛ 8 рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдерд╛ред рдпрд╣реА рд╣реИ, рдпрд╣ рдПрдХ рдЫреЛрдЯреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд░рдирдЯрд╛рдЗрдо рд╕рдВрдЧрдд рд╣реИред рдкрд╛рдВрдЪрд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ, рдЬрд┐рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдкрд╣рд▓реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИред рдЙрдирдХреЗ рдкрд╛рд╕
BOM (рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдмрд┐рд▓) рдЬреИрд╕реЗ рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рднреА рд╣реИ - рдпрд╣ рдПрдХ рд╡рд┐рд╢рд╛рд▓ XML рд╣реИ рдЬреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ (рддреГрддреАрдпрдХ) рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░, рдЕрддрд┐рд░рд┐рдХреНрдд рдврд╛рдВрдЪреЗ, рдЙрдкрдХрд░рдг, рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рддрджрдиреБрд╕рд╛рд░, рд╕рднреА рд╡рд┐рд╢реЗрд╖ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдЬреЛ рджреВрд╕рд░реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рд╕реНрд╡рдпрдВ рдпрд╛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЖрддреЗ рд╣реИрдВред рдЗрд╕ рдкреВрд░реЗ рдлрд╝рд╛рд░реНрдо рдХреЗ рд▓рд┐рдП рджреЛ рдЙрддреНрдХреГрд╖реНрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ:
рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯреНрд╕ рдФрд░
рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб ред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╢рд╛рдВрдд рд╣реИрдВ, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рд╡рд╕рдВрдд рдЖрдо рддреМрд░ рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдХрд╡рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ: рдХреБрдЫ рд╡рд┐рд╢реЗрд╖, рд╡рд┐рдЪрд▓рди, рдЖрджрд┐ рд╣реИрдВ рдЬреЛ рдпрд╛ рддреЛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдРрд╕реЗ рдлреАрдЪрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рд╕рдВрдХрд▓рди рд╕рдордпред рдПрдкреАрдЖрдИ рдЙрджрд╛рд╣рд░рдг рдмрджрд▓рддреЗ рд╣реИрдВ
рдЪрд▓реЛ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реЗрдХ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: рдпреЗ рд╡реЗ рд╣реИрдВ рдЬреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдХреБрдЫ рдРрд╕рд╛ рднреА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ рдпрджрд┐ рдЖрдк рдмрд╕ рдмреВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдирдВрдмрд░ 1 рдХреЛ 2 рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВред
рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдореБрдЦреНрдп рд╕реНрд░реЛрдд, рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдкрд╛рджрди рдХрд╛ рдЖрдзрд╛рд░ рдмрди рдЧрдпрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЬрд╛рд╡рд╛ 8 рдореЗрдВ рд╡рд╕рдВрдд рдХрд╛ рд╕рдВрдХреНрд░рдордг рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдкреНрд░рд┐рдВрдЧ 5 рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2 рдХрд╛ рд╡реЗрдм рд╕реНрдЯреИрдХ, рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдмреЛрд▓рдиреЗ рд╡рд╛рд▓рд╛, рджреЛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИред рдЕрдм рдпрд╣ рд╕рд░реНрд╡рд▓реЗрдЯ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд╛рд░рдВрдкрд░рд┐рдХ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рдХрдИ рдХрдорд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢реБрд░реВ рд╣реБрдИ (рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ)ред рдпрджрд┐ рдЖрдк рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдордХреНрдЦреА рдкрд░ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рджрд┐рдЦреЗрдЧрд╛ рдФрд░, рдЦреБрд▓рдХрд░, рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдиреЛрдЯреНрд╕ рд░рд┐рд▓реАрдЬрд╝ рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рд╡рд╣рд╛рдБ рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛ред рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдерд╛:
рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред
рд╕рдВрдХрд▓рди рдХреНрдпрд╛ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг 1):- рдХреНрдпреЛрдВ :
WebMvcConfigurerAdapter
рд╡рд░реНрдЧ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ; - рдХреНрдпреЛрдВ : рдЬрд╛рд╡рд╛ 8 рдЪрд┐рдкреНрд╕ (рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реАрдХреЗ) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП;
- рдХреНрдпрд╛ рдХрд░реЗрдВ :
WebMvcConfigurer
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ рдХрд┐ рдХреБрдЫ рдХрдХреНрд╖рд╛рдПрдВ рдмрд╕ рдЕрдм рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред рдХреНрдпреЛрдВ? рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд╡рд╛ 8 рдореЗрдВ рдЙрдирдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдпреЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЖрджрд┐рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдбреЗрдкреНрдЯрд░ рдереЗ, рддреЛ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ-рд╡рд┐рдзрд┐рдпрд╛рдВ рдпрд╣ рд╕рдм рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд░рддреА рд╣реИрдВред рдпрд╣рд╛рдВ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рдПрдбреЗрдкреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдХреНрдпрд╛ рд╕рдВрдХрд▓рди рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг 2):- рдХреНрдпреЛрдВ :
PropertySourceLoader#load
рд╡рд┐рдзрд┐ рдиреЗ рдПрдХ рдХреЗ рдмрдЬрд╛рдп рд╕реНрд░реЛрддреЛрдВ рдХреА рд╕реВрдЪреА рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛; - рдХреНрдпреЛрдВ : рдмрд╣реБ-рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, YAML;
- рдХреНрдпрд╛ рдХрд░реЗрдВ :
singletonList()
рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓рдкреЗрдЯреЗрдВ singletonList()
(рдУрд╡рд░рд░рд╛рдЗрдб рд╣реЛрдиреЗ рдкрд░)ред
рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдгред рдХреБрдЫ рддрд░реАрдХреЛрдВ рдиреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рднреА рдмрджрд▓ рджрд┐рдП рд╣реИрдВред рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА PropertySourceLoader рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдм рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЗрд╕рдиреЗ рдмрд╣реБ-рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдХреА рдЕрдиреБрдорддрд┐ рджреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, YAML рдореЗрдВ, рддреАрди рдбреИрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЖрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЕрдм рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛ рд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреНрдпрд╛ рд╕рдВрдХрд▓рди рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг 3):- рдХреНрдпреЛрдВ :
.servlet
рдкреИрдХреЗрдЬ рд╕реЗ рдХреБрдЫ рд╡рд░реНрдЧреЛрдВ рдиреЗ .servlet
рд╕рдВрдХреБрд▓ - .servlet
рд╕реЗ .reactive
; - рдХреНрдпреЛрдВ : рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХреЗ рд╕рд╛рде рд╕рдордореВрд▓реНрдп рдкрд░ рдЬреЗрдЯ рд╕реНрдЯреИрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП;
- рдХреНрдпрд╛ рдХрд░реЗрдВ : рдЕрдкрдбреЗрдЯ рдЖрдпрд╛рдд рдХрд░реЗрдВред
рдФрд░ рднреА рдЕрдзрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рд╕реНрдЯреИрдХрд┐рдВрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА рд╡реЗрдм рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЛ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛, рд╡рд╣ рдЕрдм рд╡рд░реНрдЧреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рджреЛ рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпреЗ
.servlet
рдФрд░
.reactive
ред рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдЬреЗрдЯ рд╕реНрдЯреИрдХ рдХреЛ рд╕рд░реНрд╡рд▓реЗрдЯ рдХреЗ рдКрдкрд░ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдмреИрд╕рд╛рдЦреА рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред рдРрд╕рд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рддрд╛рдХрд┐ рд╡реЗ рдЕрдкрдиреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЛ рдмрдирд╛рдП рд░рдЦ рд╕рдХреЗрдВ, рдЕрдкрдиреА рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд╕рдХреЗрдВ рдФрд░ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░ рд╕рдХреЗрдВред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдЖрдпрд╛рдд рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд: рдЗрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд░реНрдЧ рдПрдкреАрдЖрдИ рд╕реНрддрд░ рдкрд░ рд╕рдВрдЧрдд рдмрдиреЗ рд░рд╣реЗред рдЕрдзрд┐рдХрд╛рдВрд╢, рд▓реЗрдХрд┐рди рд╕рднреА рдирд╣реАрдВред
рдХреНрдпрд╛ рд╕рдВрдХрд▓рди рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг 4):- рдХреНрдпреЛрдВ :
ErrorAttributes
рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ ErrorAttributes
: RequestAttributes
рдмрдЬрд╛рдп, WebRequest(servlet)
рдФрд░ ServerRequest(reactive)
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд▓рдЧрд╛; - рдХреНрдпреЛрдВ : рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХреЗ рд╕рд╛рде рд╕рдордореВрд▓реНрдп рдкрд░ рдЬреЗрдЯ рд╕реНрдЯреИрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП;
- рдХреНрдпрд╛ рдХрд░реЗрдВ : рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рд╡рд░реНрдЧ рдирд╛рдореЛрдВ рдХреЛ рдмрджрд▓реЗрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ErrorAttributes рд╡рд░реНрдЧ рдореЗрдВ, рдЕрдм, RequestAttributes рдХреЗ рдмрдЬрд╛рдп, рджреЛ рдЕрдиреНрдп рдХрдХреНрд╖рд╛рдПрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд▓рдЧреАрдВ: рдпреЗ WebRequest рдФрд░ ServerRequest рд╣реИрдВред рдХрд╛рд░рдг рд╡рд╣реА рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдпрджрд┐ рдЖрдк рдкрд╣рд▓реА рд╕реЗ рджреВрд╕рд░реА рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ RequestAttributes рдХреЛ WebRequest рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреВрд╕рд░реЗ рдкрд░ рд╣реИрдВ, рддреЛ ServerRequest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣реИ рдирд╛?
рдХреИрд╕реЗ рд╣реЛ?
рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ; рд╣рдо рдЙрди рд╕рднреА рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдордп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2.0 рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб рдореЗрдВ рджреЗрдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрд▓рд┐рдкреНрдд рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИред рдлрд┐рд░ рднреА, рдЕрдЧрд░ рдХрд┐рд╕реА рдЪреАрдЬ рдиреЗ рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ "рд╡реЗрдм" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ 2 рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ: "рд╕рд░реНрд╡рд▓реЗрдЯ" рдФрд░ "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓"ред рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдФрд░ рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде, рдпрд╣ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рди рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдЦреБрдж рдХрд╛ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдмрд▓реНрдХрд┐ рд╕рдВрдкреВрд░реНрдг рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдФрд░ рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рднреА рдереАрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рдЙрдб рдХреЗ рд╕рд╛рде рд╣реБрдЖред
рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ред HTTP рдкреНрд░рддрд┐рд╕рд╛рдж рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг
рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рд╕реЗ рдЗрди рд╕рд░рд▓ рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рд░рд▓ рд╣реИред рдЖрдЗрдП рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рддрджрдиреБрд╕рд╛рд░, рд╢реВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2 рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реЛред рдЪрд▓реЛ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдкреЗрдЬ рдФрд░ рдЖрд░рдИрдПрд╕рдЯреА рджреЛрдиреЛрдВ рдПрдкреАрдЖрдИ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ рд╡рд╣ рдПрдХреНрд╕рдПрдордПрд▓, рдЬреЗрдПрд╕рдПрди рдпрд╛ рдХреБрдЫ рдФрд░ рд╣реЛред рдФрд░ рдПрдХ рдЖрдХрд░реНрд╖рдг рд╣реИ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдЗрддрдирд╛ рд╢реМрдХреАрди рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рджрд┐рдП рдЬрд╛ рд░рд╣реЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдкрдбрд╝реЗрдЧрд╛ред рдЖрдк рдЬрд╛рджреВ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЬрд╛рджреВ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рддреЛ: рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдЖрдП рдПрдХреНрд╕реЗрдкреНрдЯ рд╣реЗрдбрд░ рдкрд░ рдпрд╛ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреА рдЧрдИ рдлрд╛рдЗрд▓ рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ URL рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдЯреЗрдпрд░ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг (
рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб ) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдЧреНрд░реИрдбрд▓ рд╕реЗ рд╕рдВрдХреЗрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдорд╛рд╡реЗрди рдкреНрд░рд╢рдВрд╕рдХ рд╣реИрдВ, рддреЛ рднреА рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ: рд╣рдо рдкрд╣рд▓реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдкрд░ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯрд░ рд╡реЗрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг (v1.x):
dependencies { ext { springBootVersion = '1.5.14.RELEASE' } compile("org.springframework.boot:spring-boot-starter-web:$springBootVersion") }
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдХрд▓ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐ рддреБрд░рдВрдд рдШреЛрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
@GetMapping(value = "/download/{fileName: .+}", produces = {TEXT_HTML_VALUE, APPLICATION_JSON_VALUE, TEXT_PLAIN_VALUE}) public ResponseEntity<Resource> download(@PathVariable String fileName) {
рдпрд╣ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрдиреЗрдЧрд╛ рдФрд░ рджреЗрдЧрд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреАрди рдЗрдВрдЧрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдмрдирд╛рддрд╛ рд╣реИ (рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╕реЗ рдЗрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╕рдВрдд рд╣реИ, рд╡рд╣ рд╕рдм рдХреБрдЫ рдЦреБрдж рдХрд░реЗрдЧрд╛ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджрд░рдЕрд╕рд▓, рдпрджрд┐ рд╣рдо рдПрдХ рд╣реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рд╣реА рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рд╣рдо рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░: рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ - json, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ - txt, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ - html рдпрд╣ рдПрдХ рдкрд░реА рдХрдерд╛ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
V2.x рдкрд░ рдЕрдкрдбреЗрдЯ рд╣реЛ рд░рд╣рд╛ рд╣реИ
dependencies { ext { springBootVersion = '2.0.4.RELEASE' } compile("org.springframework.boot:spring-boot-starter-web:$springBootVersion") }
рдпрд╣ рджреВрд╕рд░реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рд╣рдо рд╕рд┐рд░реНрдл рдирдВрдмрд░ 1 рд╕реЗ 2 рдмрджрд▓рддреЗ рд╣реИрдВред
рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдкрде рдорд┐рд▓рд╛рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░рд┐рд╡рд░реНрддрдирд▓реЗрдХрд┐рди рд╣рдо рдЗрдВрдЬреАрдирд┐рдпрд░ рд╣реИрдВ, рд╣рдо рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВрдЧреЗ, рдФрд░ рдЕрдЪрд╛рдирдХ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ "рдкреНрд░рддреНрдпрдп рдкрде рдорд┐рд▓рд╛рди" рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИред рдпрд╣ рдПрдХ рдпреВрдЖрд░рдПрд▓ рдХреЗ рд╕рд╛рде рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдореИрдк рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░рд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдереЛрдбрд╝рд╛ рд╕рд╛ рдкрд╕рдВрдж рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕реНрдХреЛрд░, рдЪреЗрдХ рдФрд░ рдзрдорд╛рдХрд╛ рдХрд░рддреЗ рд╣реИрдВ! - рдЕрдЪрд╛рдирдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдмрд╕ рдЯреЗрдХреНрд╕реНрдЯ / html рд╣рд░ рдЬрдЧрд╣ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЦреЛрджрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдЯреЗрдХреНрд╕реНрдЯ / html рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рд╣реИ рдЬреЛ @GetMapping рдПрдиреЛрдЯреЗрд╢рди рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХреНрдпреЛрдВ? рдпрд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рд╣рд▓реНрдХрд╛, рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдФрд░ рдпрд╣рд╛рдВ, рдХреЛрдИ рднреА рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯреНрд╕ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред
ContentNegotiationManagerFactoryBean
public ContentNegotiationManagerFactoryBean build() { List<ContentNegotiationStrategy> strategies = new ArrayList<>(); if (this.strategies != null) { strategies.addAll(this.strategies); } else { if (this.favorPathExtension) { PathExtensionContentNegotiationStrategy strategy;
рд╡рд╣рд╛рдВ рдЖрдк рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдордЭрджрд╛рд░ рд▓реИрдХреЛрдирд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдзреНрд╡рдЬ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ, рдЬрд┐рд╕реЗ "рд░рд╛рд╕реНрддреЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ" (рдПрд╣рд╕рд╛рдирдлрд░рд╛рдореЛрд╢ рддрдирд╛рд╡) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдзреНрд╡рдЬ рдХрд╛ рдореВрд▓реНрдп "рд╕рддреНрдп" рдПрдХ рдЕрдиреНрдп рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд▓рдШреБ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рдгрдиреАрддрд┐ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЭрдВрдбрд╛ рдЧрд▓рдд рд╣реИ, рддреЛ рд░рдгрдиреАрддрд┐ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдЧреАред

рд╣рд╛рдВ, рд╢рд╛рдпрдж, рдХрдИ рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╡рд╕рдВрдд рдореЗрдВ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рддрд╛рдХрд┐ рдирд╛рдо рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣реЛ, рдХрдо рд╕реЗ рдХрдо рдмреАрд╕ рдорд┐рдирдЯ рд▓рдВрдмрд╛ рд╣реЛред

рдпрджрд┐ рдЖрдк рдереЛрдбрд╝рд╛ рдЧрд╣рд░рд╛ рдЧрдбреНрдврд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЦреЛрдж рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ, рдФрд░ рдкрд╛рдВрдЪрд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдирд╣реАрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдИ рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ "рд╕рдЪ" рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдореЗрдВ рдФрд░ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЗрд╕реЗ рдПрдХ рджреВрд╕рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдЕрдм рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдм рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдкреНрд░рдмрдВрдзрди рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ? рд╡рд╣рд╛рдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА "рдЧрд▓рдд" рдХрд╛ рдЕрд░реНрде рдорд╛рди рд▓рд┐рдпрд╛ред рдпрд╣реА рд╣реИ, рд╡реЗ рдЪрд╛рд╣рддреЗ рдереЗ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдбрд╛рд▓реЗрдВ (рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЛ рджреВрд╕рд░реЗ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдпрд╣ рдмрд╣реБрдд рдирд╣реАрдВ рд╣реИ)ред
рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдбреЗрд╡рд▓рдкрд░ рд▓реЛрдЧ рднреА рд╣реИрдВ, рд╡реЗ рднреА рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдХреЗрд╡рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреА рдЕрдВрддрд░рд╛рддреНрдорд╛ рдХреА рдЖрд╡рд╛рдЬ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рдХрд┐рд╕реА рднреА рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реИред рдФрд░ рд╡рд╣рд╛рдБ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреБрдЫ рдЕрдЬреАрдм рд╕рдВрджрд░реНрдн рдореЗрдВ:
рдпрджрд┐ рдЖрдк рдХреИрд╡рд┐рдЯреНрд╕ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рднреА рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рддреНрдпрдп рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ, рддреЛ рдирд┐рдореНрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
spring.mvc.contentnegotiation.favor-path-extension = true
...
рдпрд╣ рд▓рд┐рдЦрд╛ рд╣реИ, рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рд╕рднреА рдЪрд╛рд▓реЛрдВ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рднреА рдкреНрд░рддреНрдпрдп рдкрде рдорд┐рд▓рд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдмреЙрдХреНрд╕ рдХреЛ рдЬрд╛рдВрдЪреЗрдВред рд╡рд┐рд╕рдВрдЧрддрд┐ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдо рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдо рдЬрд╛рд╡рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ URL рдХреЗ рдорд┐рд▓рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред
рд╣рдореЗрдВ рдФрд░ рдЦреБрджрд╛рдИ рдХрд░рдиреА рд╣реЛрдЧреАред GitHub рдкрд░ рдРрд╕рд╛
рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╣реИ:

рдЗрд╕ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░, рдпреЗ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рдЧрдП рдереЗ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ - рдФрд░ рд╡рд╣рд╛рдБ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рд╕реЗ рдПрдХ рд▓реЗрдЦрдХ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рджреЛ рдкрд╣рд▓реВ рд╣реИрдВ: рдПрдХ рд╕рд┐рд░реНрдл рдкрде рдорд┐рд▓рд╛рди рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ ред рдпрд╣реА рд╣реИ, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдзреНрд╡рдЬ рджреЛрдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдЕрдЯреВрдЯ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВред
рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕реЗ GitHub рдкрд░ рддреБрд░рдВрдд рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдирддреЗ рдереЗ рдХрд┐ рдХрд╣рд╛рдБ рджреЗрдЦрдирд╛ рд╣реИред
рдкреНрд░рддреНрдпрдп рдорд┐рд▓рд╛рдирдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдпрд╣ рднреА рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдЗрд╕реЗ рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╕рд╛рдмрд┐рдд рд╣реБрдЖред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдзреНрд╡рдЬ рдорд╛рди рдХреЛ рдмрджрд▓рдирд╛ рдмрд┐рд▓рдХреБрд▓ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдпрд╣ рдорд╛рд░реНрдЧ рдорд┐рд▓рд╛рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдЕрдЯреВрдЯ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдЗрд╕реЗ
рддреАрди рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдо рдХрдо рдХрд░реЗрдВ (рдЬреЛ рд▓реЛрдЧ, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреВрдВрдЧрд╛);
- WebFlux рдФрд░ WebMvc рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ, рд╡реЗ рдЗрд╕ рдкрд╣рд▓реВ рдореЗрдВ рднрд┐рдиреНрди рдереЗ;
- рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВред
рдХреИрд╕реЗ рд╣реЛ?
рдкрд╣рд▓реЗ, рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ, рдЖрдкрдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВрдиреЗ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдпрд╛, рд╡рд╣ рдкреНрд░рддрд┐рд╡рд╛рдж рд╣реИ, рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ! рд╕рд╛рде рд╣реА рдпрд╣ рдЗрд╕ рддрдереНрдп рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ "GET something.json" рдлреЙрд░реНрдо рдХреЗ рдЕрдиреБрд░реЛрдз, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдмрд╕ рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ"ред рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ 4 рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 1 рдореЗрдВ рдпрд╣реА рд╕реНрдерд┐рддрд┐ рдереАред рдпрд╣ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореИрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЗрдбрд░ рдпрд╛ URL рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдЖрдк рдбреНрд░рд╛рдЗрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдкреБрд░рд╛рдиреЗ рдореЛрдмрд╛рдЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкрд┐рдЫрд▓реА рд╢рддрд╛рдмреНрджреА рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдерд╛, рдЖрдкрдХреЛ рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕реЗ "рд╕рд╣реА" рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЕрдзреНрдпрд╛рдп "рд╕рдлрд╝рд┐рдХреНрд╕ рдореИрдЪ" рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдкрд░рд┐рдЪрд┐рдд
рдХрд░рд╛рдПрдВ рдХрд┐
рд╣рдорд▓реЗ рдХреЗ рджреМрд░рд╛рди
рд░рд┐рдлреНрд▓реЗрдХреНрдЯреЗрдб рдлрд╝рд╛рдЗрд▓ рдХреНрдпрд╛
рд╣реИ , рдмрд╕
рдЗрд╕реЗ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рдиред
рдирд┐рд░реНрдзрд╛рд░рдгред рдЕрдиреБрд╕реВрдЪрд┐рдд рдпрд╛ рдЖрд╡рдзрд┐рдХ рдХрд╛рд░реНрдп
рдЖрдЗрдП рдЧреБрдВрдЬрд╛рдЗрд╢ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджреЗрдВ рдФрд░ рд╢реЗрдбреНрдпреВрд▓ рдпрд╛ рд╕рдордп-рд╕рдордп рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВред
рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХрд╛ рдЙрджрд╛рд╣рд░рдгред рд╣рд░ 3 рд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдВрджреЗрд╢ рд▓реЙрдЧ рдХрд░реЗрдВ
рдЬреЛ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ, рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рдо рддреБрд░рдВрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдореЗрдЧрд╛-рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ рдХрд╛рд░реНрдп рд╣реИ: рд╣рд░ 3 рд╕реЗрдХрдВрдб рдореЗрдВ рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмрддрдЦ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ, рдЙрдирдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╡рд╕рдВрдд рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╣реИред рдФрд░ рдЗрд╕реЗ рдЦреЛрдЬреЗрдВ - рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реАрдХреЗред
рд╡рд┐рдХрд▓реНрдк 1: рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ
@Service public class ReallyBusinessService {
рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рд╢рд╛рдпрдж рдХреБрдЫ рдРрд╕рд╛ рдкрд╛рдПрдВрдЧреЗред рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐ рдкрд░ рд▓рдЯрдХрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЗрд╕реЗ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдПрдХ рдкрд░реА рдХрдерд╛ рдХреА рддрд░рд╣ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рдХрд▓реНрдк 2: рд╡рд╛рдВрдЫрд┐рдд рдПрдиреЛрдЯреЗрд╢рди рдХреА рдЦреЛрдЬ рдХрд░реЗрдВ

рдЖрдк рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд╕реАрдзреЗ рдирд╛рдо рд╕реЗ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ - рдФрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рдХрд▓реНрдк 3: Googling
рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрдк рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЧреВрдЧрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬреЛ рдЖрдкрдиреЗ
рдкрд╛рдпрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдЧрд╛ред
@Component public class EventCreator { private static final Logger LOG = LoggerFactory.getLogger(EventCreator.class); private final EventRepository eventRepository; public EventCreator(final EventRepository eventRepository) { this.eventRepository = eventRepository; } @Scheduled(fixedRate = 1000) public void create() { final LocalDateTime start = LocalDateTime.now(); eventRepository.save( new Event(new EventKey("An event type", start, UUID.randomUUID()), Math.random() * 1000)); LOG.debug("Event created!"); } }
рдЗрд╕рдореЗрдВ рдХреИрдЪ рдХреМрди рджреЗрдЦрддрд╛ рд╣реИ? рд╣рдо рд╕рдм рдХреЗ рдмрд╛рдж рдЗрдВрдЬреАрдирд┐рдпрд░ рд╣реИрдВ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдореБрдЭреЗ рдХреЛрдб рджрд┐рдЦрд╛рдУ!
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп (рдХрд╛рд░реНрдп рд╕реНрд╡рдпрдВ рдФрд░ рдХреЛрдб
рдореЗрд░реЗ рднрдВрдбрд╛рд░ рдореЗрдВ рд╣реИрдВ ) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдХреМрди рдирд╣реАрдВ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЖрдк рд╡реАрдбрд┐рдпреЛ рдХреЗ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдПрдХ рдкреНрд░рджрд░реНрд╢рди (22 рд╡реЗрдВ рдорд┐рдирдЯ рддрдХ) рдХреЗ рд╕рд╛рде рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рджреЛ рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдПрдХ рд╡реЗрдм рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░рд╛ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдПрдХреНрдЯреНрдпреВрдПрдЯрд░ рд╣реИ, рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрддреНрдкрд╛рджрди-рддреИрдпрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реЛрдВ, рддрд╛рдХрд┐ рд╣рдо рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреА рддрд░рд╣ рд╣реЛрдВред
dependencies { ext { springBootVersion = '1.5.14.RELEASE'
рдФрд░ рд╣рдорд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдФрд░ рднреА рд╕рд░рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
package tech.toparvion.sample.joker18.schedule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.Scheduled; @SpringBootApplication public class EnableSchedulingDemoApplication { private static final Logger log = LoggerFactory.getLogger(EnableSchedulingDemoApplication.class); public static void main(String[] args) { SpringApplication.run(EnableSchedulingDemoApplication.class, args); } @Scheduled(fixedRate = 3000L) public void doOnSchedule() { log.info(тАЬ 3 тАжтАЭ); } }
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЬрд┐рд╕ рдкрд░ рд╣рдордиреЗ рдПрдиреЛрдЯреЗрд╢рди рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдерд╛ред рд╣рдордиреЗ рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рдХреЙрдкреА рдХрд┐рдпрд╛ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреАред
рдЖрдЗрдП рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЗрдВрдЬреАрдирд┐рдпрд░ рд╣реИрдВред рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рд░ рддреАрди рд╕реЗрдХрдВрдб рдореЗрдВ рдРрд╕рд╛ рд╕рдВрджреЗрд╢ рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдм рдХреБрдЫ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдкрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рд▓рд╛рдЗрди рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рддреАрди рд╕реЗрдХрдВрдб рдкрд╛рд╕ - рдПрдХ рд▓рд╛рдЗрди рдЖрдЙрдЯрдкреБрдЯ рд╣реИ, рдЫрд╣ рдкрд╛рд╕ - рдПрдХ рд▓рд╛рдЗрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдЖрд╢рд╛рд╡рд╛рджреА рдЬреАрддреЗ, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдХреЗрд╡рд▓ рджреВрд╕рд░реА рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХреЗ рдЙрдиреНрдирдпрди рдХрд╛ рд╕рдордп рдЖрддрд╛ рд╣реИред рд╣рдо рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдмрд╕ рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ:
dependencies { ext {
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб рдиреЗ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджреА, рдФрд░ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╡рд┐рдЪрд▓рди рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдЕрдиреНрдп рд░реЗрдХ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ (рдПрдкреАрдЖрдИ рд╕реНрддрд░ рдкрд░ рдЕрд╕рдВрдЧрддрд┐ рдпрд╛ рдХреБрдЫ рдФрд░), рдХреНрдпреЛрдВрдХрд┐ рдЖрд╡реЗрджрди рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд╣реИред
рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЖрд╢реНрд╡рд╕реНрдд рд╣реИрдВ рдХрд┐ рд╣рдо рджреВрд╕рд░реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВ рд╣реИрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдХреЛрдИ рд╡рд┐рдЪрд▓рди рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, 3 рд╕реЗрдХрдВрдб рдкрд╛рд╕, 6, 9, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рд╣рд░рдорди рдирд╣реАрдВ рд╣реИ - рдХреЛрдИ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд╣реАрдВ, рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рдЙрдореНрдореАрджреЗрдВ рдХрдо рд╣реЛрддреА рд╣реИрдВред рд╡реЗ рдЕрдХреНрд╕рд░ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╣рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдореЗрдВ рд╕рдм рдХреБрдЫ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╣рдо рдмрд╕ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдиреНрдпреВрдирддрдо рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рдЕрдХреНрд╕рд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдЕрднреА рднреА рджрд╕реНрддрд╛рд╡реЗрдЬ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдпрд╣рд╛рдБ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
7.3.1ред рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ рдПрдиреЛрдЯреЗрд╢рди рд╕рдХреНрд╖рдо рдХрд░реЗрдВ
@Scheduled рдФрд░ Async рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдиреЗ @Configuration рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ @EnableScheduling рдФрд░ @EnableAsync рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╕реВрдЪрд┐рдд рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ рдкрд░ рдПрдХ рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рд▓рдЯрдХрд╛ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдареАрдХ рд╣реИ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╡рд╕рдВрдд рдореЗрдВред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рдо рдХреНрдпреЛрдВ рдХрд┐рдпрд╛? рд╣рдордиреЗ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдПрдиреЛрдЯреЗрд╢рди рдХрд╣реАрдВ рдкрд╣рд▓реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдореЗрдВ рд▓рдЯрдХрд╛ рд╣реБрдЖ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ рджреВрд╕рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред

рд╣рдо рдкрд╣рд▓реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдлрд╡рд╛рд╣ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣рд╛рдБ рдХреБрдЫ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИред рд╣рдо рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЗрд╕реЗ "MetricExportAutoConfiguration" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрди рдкреНрд░рджрд░реНрд╢рди рдореАрдЯреНрд░рд┐рдХ рдХреЛ рдХреБрдЫ рдХреЗрдВрджреНрд░реАрдХреГрдд рдПрдЧреНрд░реАрдЧреЗрдЯрд░реЛрдВ рдХреЗ рдмрд╛рд╣рд░ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдПрдиреЛрдЯреЗрд╢рди рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░ рдЕрдкрдирд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд▓рдЯрдХрд╛рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╣ рд╡рд░реНрдЧ рдерд╛ рдЬреЛ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдирд╣реАрдВред рдХреНрдпреЛрдВ?

рд╕рднреА рд╕рдорд╛рди GitHub рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреБрд░рд╛рддрд╛рддреНрд╡рд┐рдХ рдЦреБрджрд╛рдИ рдореЗрдВ рдзрдХреЗрд▓ рджреЗрддрд╛ рд╣реИ: рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХреЗ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдиреАрдЪреЗ рдЙрддрд╛рд░рд╛ рдЧрдпрд╛ рдерд╛ред рдХреНрдпреЛрдВ? рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╡рд┐рддрд░рдг рдЗрдВрдЬрди рднреА рдмрджрд▓ рдЧрдпрд╛ рд╣реИ: рд╡реЗ рдЕрдм рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдорд╛рдЗрдХреНрд░реЛрдореАрдЯрд░ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рд░реНрдердХ рд╕рдорд╛рдзрд╛рдиред рдмрд╕ рдЙрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрдзреВрд░рд╛ рдмрдЪрд╛ рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рд╕рд╣реА рднреА рд╣реИред
рдХреМрди рдкрдврд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛, 30 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдбреЗрдореЛ рджреЗрдЦреЗрдВ:
рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдЕрдм рдЕрдкрдиреЗ рдореВрд▓ рд╡рд░реНрдЧ рдореЗрдВ рд▓рд╛рдкрддрд╛ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ, рддреЛ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
package tech.toparvion.sample.joker18.schedule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; @SpringBootApplication @EnableScheduling public class EnableSchedulingDemoApplication { private static final Logger log = LoggerFactory.getLogger(EnableSchedulingDemoApplication.class); public static void main(String[] args) { SpringApplication.run(EnableSchedulingDemoApplication.class, args); } @Scheduled(fixedRate = 3000L) public void doOnSchedule() { log.info(тАЬ 3 тАжтАЭ); } }
рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛? рдЖрдЗрдП рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ 3 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж, 6 рдХреЗ рдмрд╛рдж рдФрд░ 9 рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рдВрджреЗрд╢ рдЕрднреА рднреА рд▓реЙрдЧ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдХреИрд╕реЗ рд╣реЛ?
рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдиреИрддрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рди рдХреЗрд╡рд▓ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреА рдирдХрд▓ рдХреА, рдмрд▓реНрдХрд┐ рдереЛрдбрд╝рд╛ рд╡реНрдпрд╛рдкрдХ рднреА рд╣реИ, рдмрд╕ рдРрд╕реЗ рдкрд╣рд▓реБрдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рджреВрд╕рд░реЗ, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдореЗрдВ рднрд▓реЗ рд╣реА рдХрдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛрдВ (рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ, рдПрд╕рдХреНрдпреВрдПрди, рдХреИрд╢рд┐рдВрдЧ, ...), рд╡реЗ рд╣рдореЗрд╢рд╛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рддреАрд╕рд░рд╛, рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ
рд╕рдХреНрд╖рдо рдХрд░реЗрдВ * рдПрдиреЛрдЯреЗрд╢рди (рдФрд░ рдЙрдирдХреЗ рдкреВрд░реЗ рдкрд░рд┐рд╡рд╛рд░) рдХреЛ рдЬреЛрдбрд╝реЗрдВ, рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рдЙрдореНрдореАрдж рди рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╕рдВрдпреЛрдЧ рд╕реЗ рдореИрдВ рдФрд░ рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рдХреБрдЫ рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВрдЧреЗ? , . : . , .
, @EnableAsync
Enable Caching , , , , , . , . ? javadoc , . , . ,
Enable *, , . ? .
Spring Cloud & Co.

Spring Boot 2 , Spring Cloud тАФ Service Discovery ( ). JavaMelody. - . , , JDBC, H2.

, , JavaMelody тАФ , , . dev-, test, - , Prometheus.
Gradle :
dependencies { ext { springBootVersion = '2.0.4.RELEASE' springCloudVersion = '2.0.1.RELEASE' } compile("org.springframework.boot:spring-boot-starter-web:$springBootVersion") runtime("org.springframework.boot:spring-boot-starter-jdbc:$springBootVersion") runtime group: "org.springframework.cloud", name: "spring-clooud-starter-netflix-eureka-client", version: springCloudVersion runtime("net.bull.javamelody:javamelody-spring-boot-starter:1.72.0")
( )Spring Boot тАФ web jdbc, Spring Cloud eureka (, , Service Discovery), JavaMelody. .
@SpringBootApplication public class HikariJavamelodyDemoApplication { public static void main(String[] args) { SpringApplication.run(HikariJavamelodyDemoApplication.class, args); } }
рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

. , , - com.sun.proxy Hikari, HikariDataSource. , Hikari тАФ , Tomcat, C3P0 .
? .
Spring Cloud dataSource
, Spring Cloud , dataSource ( ), . , AutoRefresh RefreshScope тАФ . . CGLIB.
, , Spring Boot Spring : JDK ( , ) CGLIB ( ). BeanPostProcessor' BeanDefinition , .
JavaMelody dataSource
тАФ JavaMelody. DataSource , , . JavaMelody JDK-, , . тАФ BeanPostProcessor.
, , DataSource JDK-, CGLIB-. :

. , .
Spring Boot dataSource.unwrap()
Spring Boot, DataSource#unwrap(), JMX. JDK- ( ), CGLIB-, Spring Cloud, Spring Context. , , JDK-, CGLIB API .
, :
https://jira.spring.io/browse/SPR-17381, , , . , , , , - .

. Hikari?
, Hikari - , Spring Cloud . : Hikari Spring Boot 2. ? - - . , Spring Cloud? , - , ? . , .
тАж
org.springframework.cloud.autoconfigure.RefreshAutoConfiguration .RefreshScopeBeanDefinitionEnhancer: private Set<String> refreshables = new HashSet<>( Arrays.asList("com.zaxxer.hikari.HikariDataSource"));
Spring Cloud autoconfiguration, Enhancer BeanDefinition', , Hikari. Spring Cloud . .
? Spring Cloud , CGLIB-. , , , , - . (jira.spring.io/browse/SPR-17381). BeanPostProcessor, . BeanDefinition , BeanPostProcessor'. Stack Overflow , - , , proxyTargetClass true false , . , . .
, - , .
:
- (, Tomcat JDBC Pool)
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
runtime 'org.apache.tomcat:tomcat-jdbc:8.5.29'
Hikari , , , , , Tomcat, Spring Boot. - JavaMelody, JDBC-, .
javamelody.excluded-datasources=scopedTarget.dataSource - Spring Cloud.
spring.cloud.refresh.enabled=false
, , , Service Discovery, .
. , .
( *)
* Spring Cloud ( JavaMelody)
@Component @ManagedResource @EnableAsync public class MyJmxResource { @ManagedOperation @Async public void launchLongLastingJob() {
:
github.com/toparvion/joker-2018-samples/tree/master/jmx-resource .
. , Spring Cloud. JavaMelody , Spring-, . , , , JMX . - , Async, JMX- . JMX, @ManagedOperation, , ( Spring тАФ , OK).
, , , , , myJMXResource JMX, . , тАФ , CGLIB JDK.

JDK CGLIB-. , - BeanPostProcessor.
, BeanPostProcessor':
AsyncAnnotationBeanPostProcessor
- : Async
- : org.springframework.scheduling
- : @EnableAsync ( Import )
2. DefaultAdvisorAutoProxyCreator
- : AOP-,
- : org.springframework.aop.framework.autoproxy
- : @Configuration- PointcutAdvisorConfig ( )
DefaultAdvisorAutoProxyCreator @Configuration-. , , JavaMelody, configuration-. , PointcutAdvisorConfig, .

, . PointcutAdvisorConfig, AdvisorConfig, , configuration-, , , , , .
, , , , -.

BeanPostProcessor'. , , , BeanPostProcessor . , Advised ( BeanPostProcessor'), , , , , , JDK-, . .
. , :

JMX . BeanPostProcessor. BeanPostProcessor', , , , , JAR, , .
рдХреИрд╕реЗ рд╣реЛ?
-, , Spring AOP, , . ┬л ┬╗? , - Advice Advisor, , .
-, best practices. , JMX- , . - , , , . , autowire' () . . , , - .
Order , . , , , .. proxyTargetClass, .
: , . -, ┬лKeep calm and YAGNI┬╗. , . ┬л ┬╗, - , - , , , . , , : -, , тАФ , . . , Spring , , .
tolkkv , , 436- , . , .
Relax Binding. ()
, .
https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#boot-features-external-config-relaxed-binding, Relax Binding Spring Boot. - . , - firstName , acme.my-project.person, Spring Boot . : camel case, , , - тАФ firstName. Relax Binding.
Spring Boot' , , тАФ . , , , :
, , . - . , .
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
dependencies { ext { springBootVersion = '1.5.4.RELEASE' } compile("org.springframework.boot:spring-boot-starter:$springBootVersion") }
(
)
- , web, Spring Boot, - .
@SpringBootApplication public class RelaxBindingApplication implements ApplicationRunner { private static final Logger log = LoggerFactory.getLogger(RelaxBindingDemoApplication.class); @Autowired private SecurityProperties securityProperties; public static void main(String[] args) { SpringApplication.run(RelaxBindingDemoApplication.class, args); } @Override public void main run(ApplicationArguments args) { log.info("KEYSTORE TYPE IS: {}", securityProperties.getKeyStoreType()); } }
, POJO- ( ) , KEYSTORE TYPE. POJO , applications.properties application.yaml, .
keystoreType, private String keystoreType, applications.properties: security.keystoreType=jks.
@Component @ConfigurationProperties(prefix = "security") public class SecurityProperties { private String keystorePath; private String keystoreType; public String getKeystorePath() { return keystorePath; } public void setKeystorePath(String keystorePath) { this.keystorePath = keystorePath; } public String getKeyStoreType() { return keystoreType; } public void setKeystoreType(String keystoreType) { this.keystoreType = keystoreType; } }
Spring Boot .

, , , . , .

, . , , , - , , - key-store-type. , , , .
. , .

. 2 , , . Java properties тАФ , . , , , , , . тАФ Java bean . , , . , ┬лkeystore┬╗ , : ┬лKey┬╗ ┬лStore┬╗. тАж

, , ? .
, , Relax Binding ( getStoreType()). , . , . , keyStoreType, . , Relax Binding, , , .
, - , - , . , . :

, - , , , , -, . .
рдХреИрд╕реЗ рд╣реЛ?
: - . -, , dev- , , YAML properties, тАФ , , . -,
c , Relax Binding, . , , , Spring Boot .
Unit Testing. Mockito 2
, - , Mockito.
Mockito , Spring Boot Starter, Spring, Mockito.
$gradle -q dependencyInsight --configuration testCompile --dependency mockito org.mockito:mockito-core:2.15.0 variant "runtime" /--- org.springframework.boot:spring-boot-starter-test:2.0.2.RELEASE /---testCompile
? . Spring Boot Mockito , 1.5.2 Spring Boot Mockito 2, . - . Mockito 2.
Mockito , 2016- Mockito 2.0 Mockito.2.1тАФ : Java 8 , Hamcrest - . , , .
, , ( ) .

, , JButton Swing, null, , - . , string' null, , null instanceof string. , Mockito 1 , Mockito 2 , anyString null , , . : null, .
, , , Mockito 1.
, , .
public class MyService { public void setTarget(Object target) {
, , . JButton. anyString. , : , тАФ . , . - 10- , . Mockito 1 , :

Mockito 2 , , , anyString :

. , . , , , , SocketTimeoutException, - . , SocketTimeoutException , . Mockito 1.

Mockito 2 , :

, Mockito 1 , , . new SocketTimeoutException new, constructor, Mockito 1 .
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? , , RuntimeException, , Mockito .
. , . compile-time. - , Hamcrest. Spring Boot, Mockito 1 @MockBean @SpyBean. , Spring Integration, review.
(:
https://docs.spring.io/spring-integration/docs/5.0.0.RELEASE/reference/htmlsingle/#testing )
рдХреИрд╕реЗ рд╣реЛ?
, , Mockito 1, Mockito 2 (
dzone.com/refcardz/mockito ).
-, , , Spring Boot 1.5.2 Mockito 2.
-, , , Mockito 2, :
,
.
Gradle Plugin. Spring Boot
, , тАФ Spring Boot- Gradle.
Migration Guide , Spring Boot Gradle . , . : Gradle 4 (, settings.gradle ). dependency management plugin, . bootRepackage, , : bootWar bootJar. bootJar .
bootJar:
- , org.springframework.boot java;
- jar;
- mainClassName ( ) ( , - ).
, , тАФ , , Gradle, Spring Boot.
? - Spring Boot 2, , , Gradle 4 Spring Boot-. , , : , , ( , ).

, . app1 , app2, app3 . . app1 lib.
┬лShow me the code!┬╗
subprojects { repositories { mavenCentral() } apply plugin: 'java' apply plugin: 'org.springframework.boot' }
тАФ : java Spring Boot .
, , , . , , , . .
app1:
dependencies { ext { springBootVersion = '2.0.4.RELEASE' } compile("org.springframework.boot:spring-boot-starter:$springBootVersion") compile project(':lib') }
lib , Spring Boot-.
app1:
@SpringBootApplication public class GradlePluginDemoApplication implements ApplicationRunner {
Util, .
lib:
public abstract class Util { public static String getAppVersion(Class<?> appClass) { return appClass.getPackage().getImplementationVersion(); } }
Util getAppVersion , , ImplementationVersion . .

IDE, , , . gradle build IDE , . Util. , , , , .
:
:
- ;
- , jar ( ImplementationVersion), .
? : .

Spring Boot- , , lib . .
2: SB Gradle Plugin Spring Boot-
bootJar { enabled = false }
, - , , , , , bootJar . , jar , .
, , , Spring Boot. .

Spring Boot : web-, , . - , , Spring Boot properties migrator, , , . , , -, .
Actuator. , () , Spring Security. .

Spring Cloud . , . , Netflix Feign.

Spring Integration, , Spring Framework, . тАФ , Java DSL , , . , , , , handle handleWithAdapter.
.
, , :

, , , Web, .
(Properties Binding), , , Relax Binding.
тАФ , : , AOP , , Spring Boot 2 .
, , , тАФ , Mockito 1 Mockito 2. - , ?
-, , , , YAGNI. , - , . , , .
-, - - , , , . , , , , . Migration Guide. , , , , , .
, Spring Boot. , Spring Boot, , тАж .
, : 5-6 JPoint , Spring Boot: Spring Boot- Java 8 Java 11. тАФ .