
рдкрд░рд┐рдЪрдп
рд╣рд░ рдиреМрд╕рд┐рдЦрд┐рдП рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЗрдирд╡рд░реНрдЬрди рдСрдл рдХрдВрдЯреНрд░реЛрд▓ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд▓рдЧрднрдЧ рд╣рд░ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЕрдм рдПрдХ рдврд╛рдВрдЪреЗ рдХреА рдкрд╕рдВрдж рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрдирд╡рд░реНрдЯрд░ рдСрдл рдХрдВрдЯреНрд░реЛрд▓ (IoC) рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдВрдкреНрдпреВрдЯрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдореЛрдВ рдФрд░ рдПрдХрд╛рдВрдд рдХреЗ рдкрд╛рдВрдЪ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдЬ, рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрдИ рдореБрдЦреНрдп рд░реВрдкрд░реЗрдЦрд╛рдПрдБ рд╣реИрдВ:
1.
рдЦрдВрдЬрд░2.
Google Guice3.
рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХрдореИрдВ рдЕрднреА рднреА рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдкрдиреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдФрд░ рдореЗрд░реЗ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рд╣реИ рдирд╛?
рдЕрдкрдиреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдореЗрд░рд╛ рдирд╛рдо рдирд┐рдХрд┐рддрд╛ рд╣реИ, рдореИрдВ 24 рд╕рд╛рд▓ рдХреА рд╣реВрдБ, рдФрд░ рдореИрдВ 3 рд╕рд╛рд▓ рд╕реЗ рдЬрд╛рд╡рд╛ (рдмреИрдХреЗрдВрдб) рдХрд░ рд░рд╣реА рд╣реВрдБред рдЙрдиреНрд╣реЛрдВрдиреЗ рдХреЗрд╡рд▓ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛, рдЬрдмрдХрд┐ рд╕рд╛рде рд╣реА рд╕рд╛рде рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕реНрдкреЗрдХ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдлрд┐рд▓рд╣рд╛рд▓ рдореИрдВ (рдлреНрд░реАрд▓рд╛рдВрд╕) рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рдПрдХ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реАрдПрдордПрд╕ рд▓рд┐рдЦрдирд╛, рдЬрд╣рд╛рдВ рдореИрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЧреМрд░ рдХрд┐рдпрд╛ - "рдЕрдкрдиреА рджреГрд╖реНрдЯрд┐ рдФрд░ рдЗрдЪреНрдЫрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрдиреЗ IoC (DI) рдХрдВрдЯреЗрдирд░ рдХреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛?"ред рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдмреЛрд▓ рд░рд╣рд╛ рд╣реВрдБ - "рдореИрдВ рдЕрдкрдиреА рдЦреБрдж рдХреА рд▓рд╛рдареА рдХреЗ рд╕рд╛рде рдЪрд╛рд╣рддрд╛ рдерд╛ ..."ред рдЗрд╕ рдкрд░ рдЖрдЬ рдЪрд░реНрдЪрд╛ рд╣реЛрдЧреАред рдЦреИрд░, рдХреГрдкрдпрд╛, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВрд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ
- рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рд╣реИред
3 рдореБрдЦреНрдп рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
- рдХреНрд▓рд╛рд╕ рдлреАрд▓реНрдбреНрд╕
- рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░
- рдХреНрд▓рд╛рд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ (рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╕реЗрдЯрд░)
* рдиреЛрдЯ:
- рдХрд┐рд╕реА рдХрдХреНрд╖рд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░рддреЗ рд╕рдордп, рдпрджрд┐ рд╕рднреА рддреАрди рдЗрдВрдЬреЗрдХреНрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ @IoCD рдирд┐рд░реНрднрд░рддрд╛ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрдХреНрд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдЬреЗрдХреНрд╢рди рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реЛрдЧреАред рдпрд╛рдиреА рдХреЗрд╡рд▓ рдПрдХ рдЗрдВрдЬреЗрдХреНрд╢рди рд╡рд┐рдзрд┐ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИред
- рдШрдЯрдХреЛрдВ рдХреА рдЖрд▓рд╕реА рдЖрд░рдВрднреАрдХрд░рдг (рдорд╛рдВрдЧ рдкрд░);
- рдирд┐рд░реНрдорд┐рдд рд▓реЛрдбрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ (рдкреНрд░рд╛рд░реВрдк: рдЖрдИрдПрдирдЖрдИ, рдПрдХреНрд╕рдПрдордПрд▓, рдЧреБрдг);
- рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рд╣реИрдВрдбрд▓рд░;
- рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЙрдбреНрдпреВрд▓;
- рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдШрдЯрдирд╛рдУрдВ рдФрд░ рд╢реНрд░реЛрддрд╛рдУрдВ;
- рдПрдХ рдШрдЯрдХ, рдХрд╛рд░рдЦрд╛рдиреЗ, рд╢реНрд░реЛрддрд╛, рдкреНрд░реЛрд╕реЗрд╕рд░ (рдХреЙрдореНрдкреЛрдиреЗрдиреНрдЯрдкреНрд░реЛрд╕реЗрд╕рд░) рдХреЛ "рд╕реВрдЪрд┐рдд" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдЯ-рдЗрди рдЗрдирдлреЙрд░реНрдореЗрдВрдЯреНрд╕ (рд╕реЗрдВрд╕рд┐рдмрд▓реНрд╕) рдХрд┐ рд╕реВрдЪрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП;
- рдереНрд░реЗрдб рдкреВрд▓ рдХреЗ рдкреНрд░рдмрдВрдзрди / рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓, рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреВрд▓ рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕рд┐рдВрдкреНрд▓реАрдЯреИрд╕реНрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИред
рдкреИрдХреЗрдЯ рд╕реНрдХреИрдирд┐рдВрдЧ рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИ:рдпрд╣ рдПрдХ рдорд╛рдирдХ рд╕реНрдХреИрдирд░ рдХреЗ рд╕рд╛рде рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рдкрд░рд╛рд╡рд░реНрддрди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд╣рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди, рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдорд┐рд▓рддрд╛ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ @IoCComponent, @Property рдФрд░ рдкреВрд░реНрд╡рдЬ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ <R, T> рд╣реИрдВ
рдкреНрд░рд╕рдВрдЧ рдЖрд░рдВрднрд┐рдХ рдХреНрд░рдо:1) рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдХрд╛рд░ рдЖрд░рдВрднреАрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВред
* рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:
рдПрдиреЛрдЯреЗрд╢рди @Property рдореЗрдВ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ - рдкрде (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде)ред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
PropertiesLoader рд╡рд░реНрдЧ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЖрд░рдореНрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╡рд░реНрдЧ рд╣реИред
рдХрд╛рд░реНрдп рдирд┐рд░реНрднрд░рддрд╛рдлреИрдХреНрдЯрд░реА # addInstalledConfiguration (рдСрдмреНрдЬреЗрдХреНрдЯ) - рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ SINGLETON рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ (рдЕрдиреНрдпрдерд╛ рдпрд╣ рдорд╛рдВрдЧ рдкрд░ рдирд╣реАрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ)ред
2) рдПрдирд╛рд▓рд╛рдЗрдЬрд░ рдХрд╛ рдкреНрд░рд╛рд░рдВрдн
3) рдкрд╛рдпрд╛ рдШрдЯрдХреЛрдВ рдХреА рд╢реБрд░реВрдЖрдд (@IoCComponent рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрдХреНрд╖рд╛рдПрдВ)
* рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:
ClassAnalyzer рд╡рд░реНрдЧ - рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдкрджреНрдзрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ,
рднрд▓реЗ рд╣реА рдПрдиреЛрдЯреЗрд╢рди, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдШреЛрд╖рдгрд╛рдУрдВ, рд╡рд┐рдзрд┐ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЧрд▓рдд рдирд┐рдпреБрдХреНрддрд┐ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдВ - рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдХ <R, T> #analyze (T) - рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдХ <R, T> #supportFor (T) - рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╢рд░реНрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдмреВрд▓рд┐рдпрди рдкреИрд░рд╛рдореАрдЯрд░ рджреЗрддрд╛ рд╣реИред
рдЖрд╢реНрд░рд┐рддрддрд╛
рдирд┐рд░реНрднрд░рддрд╛ # рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ (рдХрдХреНрд╖рд╛, рдЖрд░) - рдХреНрд▓рд╛рд╕рдЕрдирд▓реАрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рдЯрд╛рдЗрдк рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдпрджрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдпрд╛ рд╡рд╕реНрддреБ рдХреЛ рдЖрд░рдореНрдн рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛ рддреЛ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИред
3) рд╕реНрдХреИрдирд┐рдВрдЧ рдХреЗ рддрд░реАрдХреЗ
- рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐
private <O> O instantiateConstructorType(Class<O> type) { final Constructor<O> oConstructor = findConstructor(type); if (oConstructor != null) { final Parameter[] constructorParameters = oConstructor.getParameters(); final List<Object> argumentList = Arrays.stream(constructorParameters) .map(param -> mapConstType(param, type)) .collect(Collectors.toList()); try { final O instance = oConstructor.newInstance(argumentList.toArray()); addInstantiable(type); final String typeName = getComponentName(type); if (isSingleton(type)) { singletons.put(typeName, instance); } else if (isPrototype(type)) { prototypes.put(typeName, instance); } return instance; } catch (Exception e) { throw new IoCInstantiateException("IoCError - Unavailable create instance of type [" + type + "].", e); } } return null; }
- рдХрдХреНрд╖рд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐
private <O> O instantiateFieldsType(Class<O> type) { final List<Field> fieldList = findFieldsFromType(type); final List<Object> argumentList = fieldList.stream() .map(field -> mapFieldType(field, type)) .collect(Collectors.toList()); try { final O instance = ReflectionUtils.instantiate(type); addInstantiable(type); for (Field field : fieldList) { final Object toInstantiate = argumentList .stream() .filter(f -> f.getClass().getSimpleName().equals(field.getType().getSimpleName())) .findFirst() .get(); final boolean access = field.isAccessible(); field.setAccessible(true); field.set(instance, toInstantiate); field.setAccessible(access); } final String typeName = getComponentName(type); if (isSingleton(type)) { singletons.put(typeName, instance); } else if (isPrototype(type)) { prototypes.put(typeName, instance); } return instance; } catch (Exception e) { throw new IoCInstantiateException("IoCError - Unavailable create instance of type [" + type + "].", e); } }
- рдХрдХреНрд╖рд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐
private <O> O instantiateMethodsType(Class<O> type) { final List<Method> methodList = findMethodsFromType(type); final List<Object> argumentList = methodList.stream() .map(method -> mapMethodType(method, type)) .collect(Collectors.toList()); try { final O instance = ReflectionUtils.instantiate(type); addInstantiable(type); for (Method method : methodList) { final Object toInstantiate = argumentList .stream() .filter(m -> m.getClass().getSimpleName().equals(method.getParameterTypes()[0].getSimpleName())) .findFirst() .get(); method.invoke(instance, toInstantiate); } final String typeName = getComponentName(type); if (isSingleton(type)) { singletons.put(typeName, instance); } else if (isPrototype(type)) { prototypes.put(typeName, instance); } return instance; } catch (Exception e) { throw new IoCInstantiateException("IoCError - Unavailable create instance of type [" + type + "].", e); } }
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдкреАрдЖрдИ1. рдХреЙрдореНрдкреЛрдиреЗрдиреНрдЯрдкреНрд░реЛрд╕реЗрд╕рд░ - рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЬреЛ рдЖрдкрдХреЛ рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рдПрдХ рдШрдЯрдХ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рджреЛрдиреЛрдВ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕рдХреЗ рдЖрд░рдВрдн рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВред
public interface ComponentProcessor { Object afterComponentInitialization(String componentName, Object component); Object beforeComponentInitialization(String componentName, Object component); }
* рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:рдлрд╝рдВрдХреНрд╢рди #afterComponentInitialization (рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдСрдмреНрдЬреЗрдХреНрдЯ) - рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЖрдиреЗ рдХреЗ рдмрд╛рдж рдШрдЯрдХ рдХреЛ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ - (рдШрдЯрдХ рдХрд╛ рдирд┐рд╢реНрдЪрд┐рдд рдирд╛рдо, рдШрдЯрдХ рдХрд╛ рддрддреНрдХрд╛рд▓ рдирд╛рдо)ред
рдлрд╝рдВрдХреНрд╢рди #beforeComponentInitialization (рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдСрдмреНрдЬреЗрдХреНрдЯ) - рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдШрдЯрдХ рдХреЛ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЖрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдкрджрдВрдбреЛрдВ - (рдШрдЯрдХ рдХрд╛ рдирд┐рд╢реНрдЪрд┐рдд рдирд╛рдо, рдШрдЯрдХ рдХрд╛
рддреНрд╡рд░рд┐рдд рдирд╛рдо)ред
2. CommandLineArgumentResolver
public interface CommandLineArgumentResolver { void resolve(String... args); }
* рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:#Resolve (рд╕реНрдЯреНрд░рд┐рдВрдЧ ...) рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ cmd рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬреЗ рдЧрдП рд╡рд┐рднрд┐рдиреНрди рдХрдорд╛рдВрдб рдХреЛ
рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ ред рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ (рдкреИрд░рд╛рдореАрдЯрд░) рдХрд╛ рдПрдХ рдЕрд╕реАрдорд┐рдд рд╕рд░рдгреА рд╣реИред
3. рдореБрдЦрдмрд┐рд░ (Sensibles) - рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореБрдЦрдмрд┐рд░ рдХреЗ рдмрд╛рд▓ рд╡рд░реНрдЧ рдХреЛ opr рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЦрдмрд┐рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (ContextSensible, EnvironmentSensible, ThreadFactorySensible, рдЖрджрд┐)
4. рд╕реБрдирдиреЗ рд╡рд╛рд▓реЗ
рд╢реНрд░реЛрддрд╛рдУрдВ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдмрд╣реБ-рдереНрд░реЗрдбрд┐рдВрдЧ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрд╛рд░рдВрдЯреА рдЕрдиреБрдХреВрд▓рд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╡рд┐рд╡рд░рдгреЛрдВ рдХреА рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛рддреА рд╣реИред
@org.di.context.annotations.listeners.Listener
** рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:рдкреНрд░реЗрд╖рдг (рдЗрд╡реЗрдВрдЯ) рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рд╕реНрдЯрдо рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реИред
- рдШрдЯрдирд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ {@link рдлрд╝рд┐рд▓реНрдЯрд░} рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдорд╛рдирдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: AndFilter, ExcludeFilter, NotFilter, OrFilter, InstanceFilter (рдХрд╕реНрдЯрдо)ред рдорд╛рдирдХ рд╢реНрд░реЛрддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
рдлрд╝рд┐рд▓реНрдЯрд░реНрдбрд▓рд┐рд╕реНрдЯ рдФрд░ рдЯрд╛рдЗрдкрд▓реЗрд╕реНрдЯрдирд░ред рдкрд╣рд▓реА рдЖрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛ рд╡рд╕реНрддреБ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдИрд╡реЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд┐рд╕реА рдЕрдиреНрдп рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред
рдореЙрдбреНрдпреВрд▓1) рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓
- рдирд┐рд░реНрднрд░рддрд╛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
<repositories> <repository> <id>di_container-mvn-repo</id> <url>https://raw.github.com/GenCloud/di_container/threading/</url> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> </snapshots> </repository> </repositories> <dependencies> <dependency> <groupId>org.genfork</groupId> <artifactId>threads-factory</artifactId> <version>1.0.0.RELEASE</version> </dependency> </dependencies>
- рд╕рдВрджрд░реНрдн рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдорд╛рд░реНрдХрд░ (@ThreadingModule)
@ThreadingModule @ScanPackage(packages = {"org.di.test"}) public class MainTest { public static void main(String... args){ IoCStarter.start(MainTest.class, args); } }
- рдЖрд╡реЗрджрди рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдШрдЯрдХ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
@IoCComponent public class ComponentThreads implements ThreadFactorySensible<DefaultThreadingFactory> { private final Logger log = LoggerFactory.getLogger(AbstractTask.class); private DefaultThreadingFactory defaultThreadingFactory; private final AtomicInteger atomicInteger = new AtomicInteger(0); @PostConstruct public void init() { defaultThreadingFactory.async(new AbstractTask<Void>() { @Override public Void call() { log.info("Start test thread!"); return null; } }); } @Override public void threadFactoryInform(DefaultThreadingFactory defaultThreadingFactory) throws IoCException { this.defaultThreadingFactory = defaultThreadingFactory; } @SimpleTask(startingDelay = 1, fixedInterval = 5) public void schedule() { log.info("I'm Big Daddy, scheduling and incrementing param - [{}]", atomicInteger.incrementAndGet()); } }
* рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:рдереНрд░реЗрдбрдлреИрдХреНрдЯрд░реАрд╕реЗрдВрдмрд▓ рдУрдбреАрдП рдХреЗ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рдШрдЯрдХ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдмрдЪреНрдЪреЗ рдХреЗ рдореБрдЦрдмрд┐рд░ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЬрд╛рдирдХрд╛рд░реА (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рд╕рдВрджрд░реНрдн, рдореЙрдбреНрдпреВрд▓, рдЖрджрд┐)ред
DefaultThreadingFactory - рд╕реВрддреНрд░рдг-рдХрд╛рд░рдЦрд╛рдирд╛ рдореЙрдбреНрдпреВрд▓ рдХрд╛рд░рдЦрд╛рдирд╛ред
рдХрд╛рд░реНрдп рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдШрдЯрдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдПрдиреЛрдЯреЗрд╢рди @SimpleTask рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдпреЛрдЧреНрдп рдорд╛рд░реНрдХрд░ рдПрдиреЛрдЯреЗрд╢рди рд╣реИред (рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдзрд╛рд░рд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ)ред
- рдорд╛рдирдХ рдХрд╛рд░реНрдп рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдп
*** рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдиреБрд╕реВрдЪрд┐рдд рдзрд╛рдЧрд╛ рдкреВрд▓ рдореЗрдВ рд╕рдВрд╕рд╛рдзрди рд╕реАрдорд┐рдд рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреВрд▓ рд╡рд┐рдиреНрдпрд╛рд╕
# Threading threads.poolName=shared threads.availableProcessors=4 threads.threadTimeout=0 threads.threadAllowCoreTimeOut=true threads.threadPoolPriority=NORMAL
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдпрд╛ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
<repositories> <repository> <id>di_container-mvn-repo</id> <url>https://raw.github.com/GenCloud/di_container/context/</url> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> </snapshots> </repository> </repositories> ... <dependencies> <dependency> <groupId>org.genfork</groupId> <artifactId>context</artifactId> <version>1.0.0.RELEASE</version> </dependency> </dependencies>
рдЯреЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕ рдПрдкреНрд▓реАрдХреЗрд╢рдиред
@ScanPackage(packages = {"org.di.test"}) public class MainTest { public static void main(String... args) { IoCStarter.start(MainTest.class, args); } }
** рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:
@ScanPackage рдПрдиреЛрдЯреЗрд╢рди - рдЙрди рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдШрдЯрдХреЛрдВ (рд╡рд░реНрдЧреЛрдВ) рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдкреИрдХреЗрдЬ рд╕реНрдХреИрди рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдкреИрдХреЗрдЬ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╡рд░реНрдЧ рдХреЗ рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдХреИрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
IoCStarter # рдкреНрд░рд╛рд░рдВрдн (рдСрдмреНрдЬреЗрдХреНрдЯ, рд╕реНрдЯреНрд░рд┐рдВрдЧ ...) - рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрджрд░реНрдн рдХрд╛ рдкреНрд░рд╛рд░рдВрднред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд╕реАрдзреЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдХрдИ рдШрдЯрдХ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдПрдВрдЧреЗред
Componenta @IoCComponent @LoadOpt(PROTOTYPE) public class ComponentA { @Override public String toString() { return "ComponentA{" + Integer.toHexString(hashCode()) + "}"; } }
ComponentB @IoCComponent public class ComponentB { @IoCDependency private ComponentA componentA; @IoCDependency private ExampleEnvironment exampleEnvironment; @Override public String toString() { return "ComponentB{hash: " + Integer.toHexString(hashCode()) + ", componentA=" + componentA + ", exampleEnvironment=" + exampleEnvironment + '}'; } }
ComponentC @IoCComponent public class ComponentC { private final ComponentB componentB; private final ComponentA componentA; @IoCDependency public ComponentC(ComponentB componentB, ComponentA componentA) { this.componentB = componentB; this.componentA = componentA; } @Override public String toString() { return "ComponentC{hash: " + Integer.toHexString(hashCode()) + ", componentB=" + componentB + ", componentA=" + componentA + '}'; } }
ComponentD @IoCComponent public class ComponentD { @IoCDependency private ComponentB componentB; @IoCDependency private ComponentA componentA; @IoCDependency private ComponentC componentC; @Override public String toString() { return "ComponentD{hash: " + Integer.toHexString(hashCode()) + ", ComponentB=" + componentB + ", ComponentA=" + componentA + ", ComponentC=" + componentC + '}'; } }
* рдиреЛрдЯ:
- рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдПрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдЯрдм рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рд╕реНрдХреИрди рдХрд┐рдП рдЧрдП рд╕рдВрдХреБрд▓ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╡рд░реНрдЧреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд▓реВрдк рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИред
** рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:
@IoCComponent рдПрдиреЛрдЯреЗрд╢рди - рд╕рдВрджрд░реНрдн рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдШрдЯрдХ рд╣реИ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ (рдЖрд╡рд╢реНрдпрдХ рдПрдиреЛрдЯреЗрд╢рди) рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдПрдиреЛрдЯреЗрд╢рди @IoCD рдирд┐рд░реНрднрд░рддрд╛ - рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдШрдЯрдХ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ рдФрд░ рдШрдЯрдХ рдореЗрдВ рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдиреЛрдЯреЗрд╢рди @LoadOpt - рд╕рдВрджрд░реНрдн рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХ рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ, 2 рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕рд┐рдВрдЧрд▓рдЯрди рдФрд░ рдкреНрд░реЛрдЯреЙрдЯрд╛рдЗрдк (рдПрдХрд▓ рдФрд░ рдПрдХрд╛рдзрд┐рдХ)ред
рдЖрдЗрдП рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ:
MainTest @ScanPackage(packages = {"org.di.test", "org.di"}) public class MainTest extends Assert { private static final Logger log = LoggerFactory.getLogger(MainTest.class); private AppContext appContext; @Before public void initializeContext() { BasicConfigurator.configure(); appContext = IoCStarter.start(MainTest.class, (String) null); } @Test public void printStatistic() { DependencyFactory dependencyFactory = appContext.getDependencyFactory(); log.info("Initializing singleton types - {}", dependencyFactory.getSingletons().size()); log.info("Initializing proto types - {}", dependencyFactory.getPrototypes().size()); log.info("For Each singleton types"); for (Object o : dependencyFactory.getSingletons().values()) { log.info("------- {}", o.getClass().getSimpleName()); } log.info("For Each proto types"); for (Object o : dependencyFactory.getPrototypes().values()) { log.info("------- {}", o.getClass().getSimpleName()); } } @Test public void testInstantiatedComponents() { log.info("Getting ExampleEnvironment from context"); final ExampleEnvironment exampleEnvironment = appContext.getType(ExampleEnvironment.class); assertNotNull(exampleEnvironment); log.info(exampleEnvironment.toString()); log.info("Getting ComponentB from context"); final ComponentB componentB = appContext.getType(ComponentB.class); assertNotNull(componentB); log.info(componentB.toString()); log.info("Getting ComponentC from context"); final ComponentC componentC = appContext.getType(ComponentC.class); assertNotNull(componentC); log.info(componentC.toString()); log.info("Getting ComponentD from context"); final ComponentD componentD = appContext.getType(ComponentD.class); assertNotNull(componentD); log.info(componentD.toString()); } @Test public void testProto() { log.info("Getting ComponentA from context (first call)"); final ComponentA componentAFirst = appContext.getType(ComponentA.class); log.info("Getting ComponentA from context (second call)"); final ComponentA componentASecond = appContext.getType(ComponentA.class); assertNotSame(componentAFirst, componentASecond); log.info(componentAFirst.toString()); log.info(componentASecond.toString()); } @Test public void testInterfacesAndAbstracts() { log.info("Getting MyInterface from context"); final InterfaceComponent myInterface = appContext.getType(MyInterface.class); log.info(myInterface.toString()); log.info("Getting TestAbstractComponent from context"); final AbstractComponent testAbstractComponent = appContext.getType(TestAbstractComponent.class); log.info(testAbstractComponent.toString()); } }
рд╣рдо рдЖрдкрдХреА IDE рдпрд╛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо Connected to the target VM, address: '127.0.0.1:55511', transport: 'socket' 0 [main] INFO org.di.context.runner.IoCStarter - Start initialization of context app 87 [main] DEBUG org.reflections.Reflections - going to scan these urls: file:/C:/Users/GenCloud/Workspace/di_container/context/target/classes/ file:/C:/Users/GenCloud/Workspace/di_container/context/target/test-classes/ [main] DEBUG org.reflections.Reflections - could not scan file log4j2.xml in url file:/C:/Users/GenCloud/Workspace/di_container/context/target/test-classes/ with scanner SubTypesScanner [main] DEBUG org.reflections.Reflections - could not scan file log4j2.xml in url file:/C:/Users/GenCloud/Workspace/di_container/context/target/test-classes/ with scanner TypeAnnotationsScanner [main] INFO org.reflections.Reflections - Reflections took 334 ms to scan 2 urls, producing 21 keys and 62 values [main] INFO org.di.context.runner.IoCStarter - App context started in [0] seconds [main] INFO org.di.test.MainTest - Initializing singleton types - 6 [main] INFO org.di.test.MainTest - Initializing proto types - 1 [main] INFO org.di.test.MainTest - For Each singleton types [main] INFO org.di.test.MainTest - ------- ComponentC [main] INFO org.di.test.MainTest - ------- TestAbstractComponent [main] INFO org.di.test.MainTest - ------- ComponentD [main] INFO org.di.test.MainTest - ------- ComponentB [main] INFO org.di.test.MainTest - ------- ExampleEnvironment [main] INFO org.di.test.MainTest - ------- MyInterface [main] INFO org.di.test.MainTest - For Each proto types [main] INFO org.di.test.MainTest - ------- ComponentA [main] INFO org.di.test.MainTest - Getting ExampleEnvironment from context [main] INFO org.di.test.MainTest - ExampleEnvironment{hash: 6f96c77, nameApp='Di Container (ver. 0.0.0.2)', components=[ComponentD, ComponentC, ComponentB, ComponentA]} [main] INFO org.di.test.MainTest - Getting ComponentB from context [main] INFO org.di.test.MainTest - ComponentB{hash: be64738, componentA=ComponentA{3ba9ad43}, exampleEnvironment=ExampleEnvironment{hash: 6f96c77, nameApp='Di Container (ver. 0.0.0.2)', components=[ComponentD, ComponentC, ComponentB, ComponentA]}} [main] INFO org.di.test.MainTest - Getting ComponentC from context [main] INFO org.di.test.MainTest - ComponentC{hash: 49d904ec, componentB=ComponentB{hash: be64738, componentA=ComponentA{3ba9ad43}, exampleEnvironment=ExampleEnvironment{hash: 6f96c77, nameApp='Di Container (ver. 0.0.0.2)', components=[ComponentD, ComponentC, ComponentB, ComponentA]}}, componentA=ComponentA{48e4374}} [main] INFO org.di.test.MainTest - Getting ComponentD from context [main] INFO org.di.test.MainTest - ComponentD{hash: 3d680b5a, ComponentB=ComponentB{hash: be64738, componentA=ComponentA{3ba9ad43}, exampleEnvironment=ExampleEnvironment{hash: 6f96c77, nameApp='Di Container (ver. 0.0.0.2)', components=[ComponentD, ComponentC, ComponentB, ComponentA]}}, ComponentA=ComponentA{4b5d6a01}, ComponentC=ComponentC{hash: 49d904ec, componentB=ComponentB{hash: be64738, componentA=ComponentA{3ba9ad43}, exampleEnvironment=ExampleEnvironment{hash: 6f96c77, nameApp='Di Container (ver. 0.0.0.2)', components=[ComponentD, ComponentC, ComponentB, ComponentA]}}, componentA=ComponentA{48e4374}}} [main] INFO org.di.test.MainTest - Getting MyInterface from context [main] INFO org.di.test.MainTest - MyInterface{componentA=ComponentA{cd3fee8}} [main] INFO org.di.test.MainTest - Getting TestAbstractComponent from context [main] INFO org.di.test.MainTest - TestAbstractComponent{componentA=ComponentA{3e2e18f2}, AbstractComponent{}} [main] INFO org.di.test.MainTest - Getting ComponentA from context (first call) [main] INFO org.di.test.MainTest - ComponentA{10e41621} [main] INFO org.di.test.MainTest - Getting ComponentA from context (second call) [main] INFO org.di.test.MainTest - ComponentA{353d0772} Disconnected from the target VM, address: '127.0.0.1:55511', transport: 'socket' Process finished with exit code 0
+ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ (рдЖрдИрдПрдирдЖрдИ, рдПрдХреНрд╕рдПрдордПрд▓, рдЧреБрдг) рдХреА рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдПрдкреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╣реИред
рд░рди-рдЗрди рдЯреЗрд╕реНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╣реИред
рднрд╡рд┐рд╖реНрдп
рдпрдерд╛рд╕рдВрднрд╡ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ред
рдореИрдВ рдХреНрдпрд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
- рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдирд╛ - рдиреЗрдЯрд╡рд░реНрдХ / рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ / рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд▓рд┐рдЦрдирд╛ред
- CGLIB рдХреЗ рд╕рд╛рде рдЬрд╛рд╡рд╛ рдкрд░рд╛рд╡рд░реНрддрди рдПрдкреАрдЖрдИ рдХреА рдЬрдЧрд╣
- рдЖрджрд┐ (рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реБрдирддрд╛ рд╣реВрдВ, рдпрджрд┐ рдХреЛрдИ рд╣реЛ)
рдЗрд╕рдХреЗ рдмрд╛рдж рд▓реЗрдЦ рдХрд╛ рддрд╛рд░реНрдХрд┐рдХ рдЕрдВрдд рд╣реЛрдЧрд╛ред
рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдИ рдореЗрд░реЗ рдХрд╛рдо рдХреЛ рдЙрдкрдпреЛрдЧреА рдкрд╛рдПрдЧрд╛ред
рдпреБрдкреАрдбреАред рд▓реЗрдЦ рдЕрдкрдбреЗрдЯ - 09/15/2018
рд░рд┐рд▓реАрдЬрд╝ 1.0.0