рд╣рд╛рдЗрдмрд░рдиреЗрдЯ-рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдпрд╛ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдФрд░ рдУрдПрд╕рдЬреАрдЖрдИ


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдлрд┐рд▓рд╣рд╛рд▓, рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдореЗрдВ рдУрдПрд╕рдЬреАрдЖрдИ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдПрдХреАрдХрд░рдг рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдкреНрд░рдЧрддрд┐ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ (4 рд╡реАрдВ рд╢рд╛рдЦрд╛ рдореЗрдВ рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдУрдПрд╕рдЬреА-рдлрд┐рдХреНрд╢рди)ред рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддрдВрддреНрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдпрд╣ рд▓реЗрдЦ рдЙрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ рдЬреЛ рдЗрд╕рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ: рдореИрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ + рдУрдПрд╕рдЬреАрдЖрдИ рдХреЗ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ; рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдкреИрдЯрд░реНрди рдХреНрдпрд╛ рд╣реИ; рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде ClassLoader рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП; рд╡рд╕рдВрдд рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдФрд░ рдЗрд╕ рдХреЛрдб рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ред рдмреЗрд╢рдХ, рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ, рд╣рд╛рдЗрдмрд░рдиреЗрдЯ, рдУрдПрд╕рдЬреАрдЖрдИ рдХреА рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рднреА рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛ред рдЬреЛ рд▓реЛрдЧ OSGi рдкрд░рд┐рд╡реЗрд╢ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд╡реЗ рдкрд░рд┐рдЪрдп рд▓реЗрдЦ "OSGi рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛" рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рд╕реНрддреБрдд рд╕рднреА рдХреЛрдб рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬреЛ рд▓рд┐рдВрдХ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдкреИрдЯрд░реНрди



OSGi рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ (рдмрдВрдбрд▓) рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд░реНрддрд╡реНрдпреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред рдЬрдм рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рдХреБрдЫ рдЬрдЯрд┐рд▓ рд░рдирдЯрд╛рдЗрдо рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ? рдЬрд╡рд╛рдм рд╕реНрдкрд╖реНрдЯ рд╣реИ - OSGi рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЬрдм рдЗрди рддрдВрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрд░рдВрднреАрдХрд░рдг (рдПрдХ рд╕рд░реНрд╡рд▓реЗрдЯ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдПрдХ рд╕рд░реНрд╡рд▓реЗрдЯ рджрд░реНрдЬ рдХрд░рдирд╛ рдпрд╛, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдореИрдк рдХрд┐рдП рдЧрдП рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛)ред рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЗрд╡рд▓ рджреЛ рдореБрдЦреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: рдкрд╣рд▓рд╛ - рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдЬрд┐рд╕реЗ рдЗрд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рд╡рд╣ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдХрд╣рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдВрдбрд▓рдПрдХреНрдЯреАрд╡реЗрдЯрд░ рд╕реЗ); рджреВрд╕рд░рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрд╛рдо рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ OSGi рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдЗрд╡реЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рд╣реИред рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓рд╛рдн рд╣реИ - рд╣рдо рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕рдорд╛рди рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХреЗ рд╕рд╛рде рдЙрди рдкрд░ рдмреЛрдЭ рдирд╣реАрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЛ рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рджрд░рдЕрд╕рд▓, рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреАрдПрдо рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдСрдкрд░реЗрд╢рди рдХрд╛ рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдкреИрдЯрд░реНрди рд╣реИ [http://www.aqute.biz/Snippets/Extender] рдФрд░ рдпрд╣ OSGi рджреБрдирд┐рдпрд╛ рдореЗрдВ рдмрд╣реБрдд рдЖрдо рд╣реИред

C   Extender


рд╣рд╛рдЗрдмрд░рдиреЗрдЯ-рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдХреЗ рдХрд╛рдо рдХреА рд╕рдордЧреНрд░ рддрд╕реНрд╡реАрд░ рдХрд╛ рд╡рд┐рд╡рд░рдг



рд╣рдо рд╣рд╛рдЗрдмрд░рдиреЗрдЯ-рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдХреЗ рдХрд╛рдо рдХреА рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдзрдиреНрдпрд╡рд╛рдж рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдЙрди рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрд▓рдЧ рдХрд░ рджреЗрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рдЧреИрд░-рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдореЗрдЯрд╛-рдЗрди / MANIFEST.MF рдореЗрдВ рдПрдВрдЯрд┐рдЯреА-рдХреНрд▓рд╛рд╕ рд╣реЗрдбрд┐рдВрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ (рдПрдХреНрд╕рдПрдордПрд▓-рдореИрдкрд┐рдВрдЧ рдХреЗ рдкреНрд░реЗрдореА рдЕрдм рдХреЗ рд▓рд┐рдП рдХрд╛рдо рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛрдВрдЧреЗ)ред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╕рдХреНрд░рд┐рдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдФрд░ рдЗрд╕ рд░рд╛рдЬреНрдп рдХреЛ рдЫреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдИрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, OSGi рдЗрд╡реЗрдВрдЯ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ SynchronousBundleListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рд╣рдо рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдмрдВрдбрд▓ рдмрдВрдбрд▓рд┐рд╕реНрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рддреБрд░рдВрдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдПрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рд╣рдореЗрдВ рдШрдЯрдирд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдХрдо рд╕рдВрднрд╡ рд╕рдордп рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдХрд╛рд░рдг рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рди рдХрд░реЗрдВред рдпрд╣ рдирд┐рд░реНрдорд╛рддрд╛-рдЙрдкрднреЛрдХреНрддрд╛ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдорд╛рд░рд╛ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рд╕рднреА рд▓рдВрдмреЗ рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреЗ рд░рдирдЯрд╛рдЗрдо рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧрдард┐рдд рдХрд░рддрд╛ рд╣реИред

рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рддрдВрддреНрд░ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдирд╡рд░реНрдЬрди рд╕рд┐рджреНрдзрд╛рдВрдд (SOLID) рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИред

public class Extender implements SynchronousBundleListener { private BundleContext bundleContext; private Executor executor; private BlockingQueue<ExtendedBundle> bundles = new LinkedBlockingQueue<ExtendedBundle>(); private BundleConsumer bundleConsumer; private ExtendedBundleFactory extendedBundleFactory; // getter's  setter's @Override public void bundleChanged(BundleEvent event) { Actions action = null; switch (event.getType()) { case BundleEvent.STARTED: action = Actions.ADDING; break; case BundleEvent.STOPPING: action = Actions.REMOVING; break; }; if (action == null) return; ExtendedBundle extendedBundle = extendedBundleFactory.newExtendedFactory( event.getBundle(), action ); try { bundles.put(extendedBundle); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } public void initialize() { getBundleConsumer().initialize(getBundles()); getExecutor().execute(bundleConsumer); getBundleContext().addBundleListener(this); for (Bundle bundle: getBundleContext().getBundles()) { if (Bundle.ACTIVE != bundle.getState()) continue; ExtendedBundle extendedBundle = extendedBundleFactory.newExtendedFactory( bundle, Actions.ADDING ); try { bundles.put(extendedBundle); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } } } } 


рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рдмрдВрдбрд▓ рдХреЙрдВрдЯреЗрдХреНрд╕ рдЬрд┐рд╕рдореЗрдВ рдПрдХреНрд╕реНрдЯреЗрдВрдбрд░ рдЦреБрдж рдХреЛ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реНрд░реЛрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИ; рдирд┐рд╖реНрдкрд╛рджрдирдХрд░реНрддрд╛ java.util.concurrent рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрдХ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрднреЛрдХреНрддрд╛ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ; рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХреНрдпреВ рдХреА рдЕрд╡рд░реЛрдзрди рдХрддрд╛рд░ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рддрд╛-рдЙрдкрднреЛрдХреНрддрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдереНрд░реЗрдб рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд╣реЛрддреЗ рд╣реИрдВ; рдмрдВрдбрд▓ рдореЙрдбреНрдпреВрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрднреЛрдХреНрддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди; ExtendedBundleFactory рдХрд╛рд░рдЦрд╛рдирд╛ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд" рдореЙрдбреНрдпреВрд▓ред

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╢реВрдиреНрдп рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ () рд╡рд┐рдзрд┐ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдХреЛ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрдкрднреЛрдХреНрддрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА OSGi рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╣реИрдВ, рдпрджрд┐ рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рдж рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

BundleConsumer



рдмрдВрдбрд▓рдХреЙрдиреНрд╕рдорд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рдПрдХреНрд╕реНрдЯреЗрдВрдбрд░ рджреНрд╡рд╛рд░рд╛ рдХрддрд╛рд░рдмрджреНрдз рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

 public interface BundleConsumer extends Runnable { void run(); void initialize( BlockingQueue<ExtendedBundle> newBundles ); } 


рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл Runnable рд╣реИред рд╢реВрдиреНрдп рд░рди () рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рдм рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЗрдП рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ-рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

 public class SessionFactoryCreator implements BundleConsumer { private volatile Extendable extendable; private volatile ExtenderClassLoader extenderClassLoader; private volatile BlockingQueue<ExtendedBundle> newBundles; // getter's, setter's    @Override public void run() { ExtendedBundle bundle = null; while (!Thread.currentThread().isInterrupted()) { try { bundle = newBundles.take(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } if (!bundle.isValidForExtending()) continue; if (Actions.ADDING.equals(bundle.getAction())) { addBundle(bundle); } else if (Actions.REMOVING.equals(bundle.getAction())) { removeBundle(bundle); } } } private void addBundle(ExtendedBundle bundle) { bundle.extend(); extenderClassLoader.addBundle(bundle); extendable.addBundle(bundle); bundle.markAsCompleted(); } private void removeBundle(ExtendedBundle bundle) { bundle.extend(); extendable.removeBundle(bundle); extenderClassLoader.removeBundle(bundle); bundle.markAsCompleted(); } } 


рд╢реВрдиреНрдп рд░рди () рд╡рд┐рдзрд┐ рдореЗрдВ рдореБрдЦреНрдп рд▓реВрдк newBundles рдХрддрд╛рд░ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рдпрджрд┐ рдХрддрд╛рд░ рдореЗрдВ рдХреЛрдИ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдХреЙрд▓ рдореЗрдВ newBundles.take () рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп рдореЙрдбреНрдпреВрд▓ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдкрд░, isValidForExtending () рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛрдиреЗ рдкрд░ рд╕рд╣реА рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдИ / рдУ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛) рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╕рдордп рдпрд╣ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рдХрд╛рдлреА рд╕рдордп рд▓реЗ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдпрд╣рд╛рдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдореЗрдВ рдирд╣реАрдВред рдпрджрд┐ рдореЙрдбреНрдпреВрд▓ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рддреЛ рдореЗрдЯрд╛-рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЙрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЙрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: Actions.ADDING рдпрд╛ рдХреНрд░рд┐рдпрд╛рдПрдБ редEMOVINGред рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рдРрдб рдпрд╛ рд░рд┐рдореВрд╡ рдСрдкрд░реЗрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рдореБрдЦреНрдп рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдкрд░ рдкрд╛рдардХ рдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ! рдереНрд░реЗрдб.currentThread ()ред Istertereded (), рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдереНрд░реЗрдб рдлрд╝реНрд▓реИрдЧ рд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░ рдереНрд░реЗрдб рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПред рдПрдХ рдЕрдиреНрдп рд╕реНрдерд╛рди рдЬрд╣рд╛рдВ рдЗрд╕ рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд╡рд░реЛрдз рд╡рд┐рдзрд┐ newBundles.take () рдХреА рдШрдЯрдирд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдХреЛ рдореБрдЦреНрдп рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рд╕реЗрдЯ рдФрд░ рдмрд╛рд╣рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рджреГрд╢реНрдпрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЕрд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдПрдХ рдзрд╛рдЧреЗ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред BlockingQueue рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

HibernateSessionFactoryBean



рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдврд╛рдВрдЪреЗ рдЖрдХрд╕реНрдорд┐рдХ рдирд╣реАрдВ рд╣реИрдВред рддреГрддреАрдп-рдкрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛, рддреИрдпрд╛рд░-рд╕реЗ-рдЙрдкрдпреЛрдЧ рдХреЛрдб рд╡рд┐рдХрд╛рд╕ рдХреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдПрдХреАрдХрд░рдг рдХреЗ рдореБрдЦреНрдп рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ LocalSessionFactoryBeanред рдпрд╣ рдПрдХ рд╕рддреНрд░ рдХрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рддрдм рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рд╕реЗрд╢рдирдлреИрдХреНрдЯрд░реАрдмреАрди рдХрд╛ рд╡рдВрд╢рдЬ рд╣реИ, рдЬреЛ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╕реЗ, рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджреЗрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдХреЛрдб рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 public class HibernateSessionFactoryBean extends AnnotationSessionFactoryBean { private SessionFactory sessionFactoryProxy; private Lock sessionFactoryAccessLock = new ReentrantLock(true); private ClassLoader classLoader; private Set<Class<?>> annotatedClasses = new CopyOnWriteArraySet<Class<?>>(); /** *   ClassLoader * @param classLoader */ public void setClassLoader(ClassLoader classLoader) { super.setBeanClassLoader(classLoader); this.classLoader = classLoader; } /** *   ClassLoader    BeanClassLoaderAware * @param beanClassLoader */ @Override public void setBeanClassLoader(ClassLoader beanClassLoader) { } @Override public void afterPropertiesSet() throws Exception { //  ClassLoader ProxyFactory.classLoaderProvider = new ClassLoaderProvider() { public ClassLoader get(ProxyFactory pf) { return HibernateSessionFactoryBean.this.classLoader; } }; super.afterPropertiesSet(); sessionFactoryProxy = createSessionFactoryProxy(); } @Override public SessionFactory getObject() { return sessionFactoryProxy; } /** *    Hibernate */ protected void recreateSessionFactory() throws Exception { sessionFactoryAccessLock .tryLock(3000, TimeUnit.MILLISECONDS); try { //  runtime-   Hibernate super.destroy(); //  runtime-   Hibernate super.afterPropertiesSet(); } finally { sessionFactoryAccessLock.unlock(); } } protected SessionFactory createSessionFactoryProxy() throws InstantiationException, IllegalAccessException, InterruptedException { //     //   SessionFactory  Extendable ProxyFactory sessionFactoryProxyFactory = new ProxyFactory(); sessionFactoryProxyFactory.setInterfaces( new Class[] {SessionFactory.class, Extendable.class} ); //    finalize sessionFactoryProxyFactory.setFilter(new MethodFilter() { public boolean isHandled(Method m) { return !m.getName().equals("finalize"); } }); Class<?> sessionFactoryProxyClass = sessionFactoryProxyFactory.createClass(); MethodHandler mi = new MethodHandler() { public Object invoke( Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable { Object result = null; // TCCL ClassLoader defaultClassLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(classLoader); try { if (thisMethod.getName().contains("addBundle")) { addBundle((HibernateBundle) args[0]); } else if (thisMethod.getName().contains("removeBundle")) { removeBundle((HibernateBundle) args[0]); } else { sessionFactoryAccessLock .tryLock(3000, TimeUnit.MILLISECONDS); try { //   SessionFactory result = thisMethod .invoke(getSessionFactory(), args); } finally { sessionFactoryAccessLock.unlock(); } } } finally { // TCCL    Thread.currentThread() .setContextClassLoader(defaultClassLoader); } return result; } }; SessionFactory sessionFactory = (SessionFactory)sessionFactoryProxyClass.newInstance(); ((ProxyObject)sessionFactory).setHandler(mi); return sessionFactory; } private void addBundle(HibernateBundle bundle) throws Exception { for (String entityClassName: bundle.getEntityClassNames()) { annotatedClasses.add(classLoader.loadClass(entityClassName)); } setAnnotatedClasses( annotatedClasses.toArray( new Class[annotatedClasses.size()])); recreateSessionFactory(); } private void removeBundle(HibernateBundle bundle) throws Exception { for (Class<?> annotatedClass: annotatedClasses) { if (bundle.getEntityClassNames().contains( annotatedClass.getCanonicalName())) { annotatedClasses.remove(annotatedClass); } } setAnnotatedClasses( annotatedClasses.toArray( new Class[annotatedClasses.size()])); recreateSessionFactory(); } } 


рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдореБрдЦреНрдп рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред AbstractSessionFactoryBean FactoryBean рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╡рд░реНрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВред рдпрд╣ рдХреЗрд╡рд▓ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╕рддреНрд░рдлреИрдХреНрдЯрд░реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИ, рди рдХрд┐ рдЗрд╕рдХрд╛ рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред LocalSessionFactoryBean рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╕рддреНрд░рдлреИрдХреНрдЯрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрдЬрд╛рдп, рдХреЛрдб рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рд╡реИрд╢реНрд╡рд┐рдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдХреЙрд▓ рдХреА рд░рдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рджреЗрд╢реА SessionFactory рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╕рднреА рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ (рдЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп SessionFactory рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред )ред рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕реЗрдЯ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде, рд╕реЗрд╢рдирдлреИрдХреНрдЯрд░реА рд╡рд╕реНрддреБ рдХреЛ рдлрд┐рд░ рд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдХреНрд╕реА рдореЗрдердб рдХреЙрд▓ рд╣реИрдВрдбрд▓рд░ рдереНрд░реЗрдб рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ (TCCL) рдУрд╡рд░рд░рд╛рдЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред TCCL рдХреЗ рд░реВрдк рдореЗрдВ, рдЬрд┐рд╕ рд╕рдордп рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдЙрд╕ рд╡рд┐рд╖рдп рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

OSGi рдФрд░ ClassLoader



рдПрдХ рд╕рд╛рдорд╛рдиреНрдп jvm- рдЖрдзрд╛рд░рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдХреЛ рдкрджрд╛рдиреБрдХреНрд░рдо рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ) рдФрд░ рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рджреНрд╡рд╛рд░рд╛ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЕрд╕рдлрд▓ рд╣реЛ, рддреЛ рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ред OSGi рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдЗрд╕реА рддрд░рд╣, рдпрд╣ рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдУрдПрд╕рдЬреАрдЖрдИ рдХрдВрдЯреЗрдирд░ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕рдХреА (рдореЙрдбреНрдпреВрд▓) рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд▓реЛрдбрд░ рдореЗрдВ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреНрд▓рд╛рд╕ рдХреЗ рд▓реЛрдбрд░ рдХрд╛ рд▓рд┐рдВрдХ рд╣реЛрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓реЛрдбрд░реЛрдВ рд╕реЗ рднреА, рдЬрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдбреЗрд▓рд┐рдЧреЗрд╢рди рдиреЗрдЯрд╡рд░реНрдХ OSGi рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

OSGi


рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЙрдбреНрдпреВрд▓ рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ MANIFEST.MF рдореЗрдВ рдЖрдпрд╛рддрд┐рдд рдЗрдХрд╛рдИ рд╡рд░реНрдЧреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдордп рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рдЕрдЬреНрдЮрд╛рдд рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдмреВрдЯрд▓реЛрдбрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдХреЛрдб рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 public class ExtenderClassLoader extends ClassLoader { private volatile ClassLoader defaultClassLoader = null; private Set<ExtendedBundle> bundles = new CopyOnWriteArraySet<ExtendedBundle>(); public ClassLoader getDefaultClassLoader() { return defaultClassLoader; } public void setDefaultClassLoader( ClassLoader defaultClassLoader) { this.defaultClassLoader = defaultClassLoader; } public void addBundle( ExtendedBundle bundle) { bundles.add(bundle); } public void removeBundle(ExtendedBundle bundle) { bundles.remove(bundle); } @Override public Class<?> loadClass( String name) throws ClassNotFoundException { Class<?> c = null; for (ExtendedBundle bundle: bundles) { try { c = bundle.loadClass(name); break; } catch (ClassNotFoundException e) {} } if (c == null && getDefaultClassLoader() != null) { try { c = getDefaultClassLoader().loadClass(name); } catch (ClassNotFoundException e) {} } if (c == null) throw new ClassNotFoundException(name); return c; } //   } 


рдЖрдЗрдП рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдЙрдирдХреЗ рдХрд╛рдо рдХрд╛ рдореБрдЦреНрдп рддрд░реНрдХ рд▓реЛрдбрдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реИред рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рдЦрдВрдб рдореЗрдВ рдЫреЛрдбрд╝реЗ рдЧрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЗред ExtenderClassLoader рдореЗрдВ рдЗрдХрд╛рдИ рд╡рд░реНрдЧреЛрдВ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдпрд╛рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред ExtenderClassLoader рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХ рд╡рд░реНрдЧреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмреВрдЯрд▓реЛрдбрд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХреА рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдХрдИ CopyOnWriteArraySet рдФрд░ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдХреЗ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛



рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдкрд╛рдардХ рдХреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ-рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдХреЗ рдореВрд▓ рддрддреНрд╡ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рдЖрдкрдХреЛ рд╕рднреА рднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдУрдПрд╕рдПрдордЖрдИ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреАрдПрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд░реНрдЧ рдЖрд░реЗрдЦ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

UML-


рд╕реНрдерд╛рдкрд┐рдд рдХреИрдирди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреАрдПрдо рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрдо рд╕реЗ рдХрдо рджреЛ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИред рдкрд╣рд▓рд╛ рд╡рд╕рдВрдд рдХрдВрдЯреЗрдирд░ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИред рджреВрд╕рд░рд╛ OSGi рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ reference.xml рдФрд░ osgi-reference.xml рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВред

рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреАрдПрдо рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрдмрд░рдиреЗрдЯ-рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд░реНрдЧ рдЖрд░реЗрдЦ рдХреЗ рд╕рдорд╛рди рд╣реИред рд╕рдВрджрд░реНрдн.xml рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╣реИ рдЬрд┐рд╕рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рд╕рднреА рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рдж рд▓реЗрди-рджреЗрди рдкреНрд░рдмрдВрдзрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЖрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд▓реЗрдирджреЗрди рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╕реЗрд╢рдирдлреИрдХреНрдЯрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рд╛рдЗрдмрд░рдиреЗрдЯреЗрд╢рдирдлреИрдХреНрдЯрд░реА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдХрд┐ SFFactory рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╕реЗрд╢рдирдлреИрдХреНрдЯрд░реА рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрдХ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЕрдЧрд▓реА рдСрдмреНрдЬреЗрдХреНрдЯ extenderClassLoader рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЬрдм defaultClassLoader рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рд▓реЛрдбрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддрд╛ рд╣реИред SessionFactoryCreator рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдкреБрди: рд╕рдВрдпреЛрдЬрди рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХреЗрдВрджреНрд░реАрдп рдЙрджреНрджреЗрд╢реНрдп рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рд╣реИ, рдЬреЛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ: рдмрдВрдбрд▓рд▓реЗрдирдЯреЗрдХреНрд╕реНрдЯ, рдиреНрдпреВ рдирдорд▓реЗрд╕ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрд╕рд░, рдиреНрдпреВ рдиреЗрдорд▓реЗрд╕ рдПрдХреНрд╕рдЯреЗрдВрдбреЗрдбрдмрдВрдбрд▓реЗрдлрд╝реИрдХреНрдЯреНрд░реА рдФрд░ рд╕реЗрд╢рдирдлреИрдХреНрдЯрд░реАрдХреНрд░реАрдЯред рджреВрд╕рд░реА рдУрд╕реНрдЧреА-рд╕рдВрджрд░реНрдн.рдПрдХреНрд╕рдПрдордПрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдУрдПрд╕рдЬреАрдЖрдИ рд╕реЗрд╡рд╛рдПрдВ рдШреЛрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ: рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд, рд▓реЗрди-рджреЗрди рдкреНрд░рдмрдВрдзрдХ, рд╕реЗрд╢рдирдлреИрдХреНрдЯрд░реАред

context.xml
 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:osgi="http://www.springframework.org/schema/osgi" xmlns:osgi-compendium="http://www.springframework.org/schema/osgi-compendium" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" scope="singleton"> <property name="driverClass" value="org.hsqldb.jdbc.JDBCDriver" /> <property name="jdbcUrl" value="jdbc:hsqldb:hsql://localhost/test" /> <property name="user" value="SA" /> <property name="password" value="" /> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" scope="singleton"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="sessionFactory" class="iconcerto.hibernate.HibernateSessionFactoryBean" scope="singleton"> <property name="dataSource" ref="dataSource" /> <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> <property name="classLoader" ref="extenderClassLoader" /> </bean> <bean id="extenderClassLoader" class="iconcerto.extender.ExtenderClassLoader" scope="singleton"> <property name="defaultClassLoader"> <bean class="org.springframework.util.ClassUtils" factory-method="getDefaultClassLoader"/> </property> </bean> <bean id="sessionFactoryCreator" class="iconcerto.hibernate.extender.SessionFactoryCreator" scope="singleton"> <property name="extenderClassLoader" ref="extenderClassLoader" /> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="extender" class="iconcerto.extender.Extender" scope="singleton" init-method="initialize"> <property name="bundleContext" ref="bundleContext" /> <property name="executor"> <bean class="java.util.concurrent.Executors" factory-method="newSingleThreadExecutor" /> </property> <property name="extendedBundleFactory"> <bean class="iconcerto.hibernate.extender.HibernateBundleFactory"/> </property> <property name="bundleConsumer" ref="sessionFactoryCreator" /> </bean> </beans> 


OSGi-context.xml

 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi" xmlns:osgi-compendium="http://www.springframework.org/schema/osgi-compendium" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd http://www.springframework.org/schema/osgi-compendium http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium-1.2.xsd"> <osgi:service ref="dataSource" interface="javax.sql.DataSource" /> <osgi:service ref="transactionManager"> <osgi:interfaces> <value> org.springframework.transaction.support.ResourceTransactionManager </value> </osgi:interfaces> </osgi:service> <osgi:service ref="sessionFactory" interface="org.hibernate.SessionFactory" /> </beans> 


рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рдХрдорд┐рдпрд╛рдБ



рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рддрд░рд╣, рд╣рд╛рдЗрдмрд░рдиреЗрдЯ-рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдореЗрдВ рдХрдИ рдЦрд╛рдорд┐рдпрд╛рдВ рд╣реИрдВред рдПрдХ рдУрд░, рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдЕрдЧрд░ рдЗрд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдорд╛рдзреНрдпрдорд┐рдХ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛рдПред рджреВрд╕рд░реА рдУрд░, рдХреЛрдИ рднреА рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдЦрд╛рдорд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВред

рд╡рд╕рдВрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ, рдЖрдкрдХреА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓реА рдкрд╣рд▓реА рдЪреАрдЬ рд╕реАрдзреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реИред xx рдлрд╝рд╛рдЗрд▓ рд╣реАред рдХрд┐рд╕реА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЗрд╕рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдкрддреНрддрд┐-рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рдмрд╛рд╣рд░реА рд╕рдордп рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд╣рд░реА рдЧреБрдг рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ред

рдЙрдкрд░реЛрдХреНрдд рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ, рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдб рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд▓рдЧрднрдЧ рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧ рдЕрдХрд▓реНрдкрдиреАрдп рд╣реИред

рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧрдВрднреАрд░ рдЦрд╛рдореА рд╣реИред рдпрджрд┐ рдХреЛрдИ рдореЙрдбреНрдпреВрд▓ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдореЙрдбреНрдпреВрд▓, рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓реЗрдирджреЗрди рдХреЗ рдЕрдВрджрд░ рд╣реЛрддрд╛ рд╣реИ? рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдСрдкрд░реЗрд╢рди, рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рддрд╣рдд, рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдмрд░реНрдмрд╛рдж рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрджрд┐ рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХрдорд╛рддреНрд░ рдЕрд╕реБрд╡рд┐рдзрд╛ рдЕрдм рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдЪрд╛рд▓рд╛рди рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рд╣реЛрдЧреАред

рдФрд░ рдЖрдЦрд┐рд░реА рдЦрд╛рдореА рдЬреЛ рдореИрдВ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдореБрджреНрджрд╛ рд╣реИ рдЬреЛ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдкреБрди: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рд╣реЛрддрд╛ рд╣реИред

рдерд░реНрдб-рдкрд╛рд░реНрдЯреА OSGi рдлрд┐рдХреНрд╢рди



рдХрдИ рдЬрд╛рд╡рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдУрдПрд╕рдЬреАрдЖрдИ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╕рднреА рдирд╣реАрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ, рдпрд╛ рддреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рджреНрд╡рд╛рд░рд╛ рддреИрдпрд╛рд░ рдУрдПрд╕рдЬреАрдЖрдИ-рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд░рд┐рдВрдЧрд╕реЛрд░реНрд╕ рд╕реЛрд░реНрд╕ рдмрдВрдбрд▓ рдмрдВрдбрд▓ [http://ebr.springsource.com/repository/app/]), рдпрд╛ рд╕реНрд╡рдпрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдРрд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рддреИрдпрд╛рд░ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреА рддреИрдпрд╛рд░реА рдХреА рдЬрд╛рддреА рд╣реИ (рд╕рдмрдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓рд┐рдм)ред рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдЬрдЯрд┐рд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдИ рдорд╛рдореВрд▓реА рдХрд╛рдо рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рддреГрддреАрдп-рдкрдХреНрд╖ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬ рдХреЗ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛ред рдЖрдВрддрд░рд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рддрдВрддреНрд░ рдХреЗ рдХрд╛рд░рдг рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ OSGi рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЦрд░рд╛рдм рд╕рдВрдЧрдд рдпрд╛ рдЕрд╕рдВрдЧрдд рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдПрдХ рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХрд╛рд░реНрдп рд╣реИред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рддрдХрдиреАрдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ (bnd, рдорд╛рд╡реЗрди, рдЯреНрд░рд┐рдХреНрд╕ рдЖрджрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдпрд╛рдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖



рдпрд╣ OSGi рдореЗрдВ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдмрдЪреА рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред META-INF / MANIFEST.MF рдореЗрдВ рдПрдВрдЯрд┐рдЯреА-рдХреНрд▓рд╛рд╕ рд╣реЗрдбрд░ рдореЗрдВ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкреВрд░реНрдг рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдЗрдХрд╛рдИ рд╡рд░реНрдЧ рдирд╛рдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдбрд╛рд▓рдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЬрдм рдЖрдк рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рд╣рдорд╛рд░реЗ ClassLoader рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛ рдФрд░ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧрдард┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдПрдкреАрдЖрдИ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ OSGi рд╕реЗрд╡рд╛ SessionFactory рдФрд░ ResourceTransactionManager рдХреЛ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрд╕рдХреЗ рдмрд╛рдж, рдореЙрдбреНрдпреВрд▓ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ (рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧрд╛рдЗрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░) рд╡рд╕рдВрдд рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдпреВрдирд┐рдЯ рдФрд░ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдЯреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдПрдХреНрд╕рдЯреЗрдВрдбрд░ рдХреЛрдб googlecode рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬреЛ рд▓рд┐рдВрдХ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдпрд╣ рдХреЛрдб рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдХреЛрдб рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдореБрдЭрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЦреИрд░, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рд╡рд╛рд▓ рд╣реИ, рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд░реЛрдд



code.google.com/p/iconcerto/source/browse
www.aqute.biz/Bnd/Bnd
www.aqute.biz/Snippets/Extender
static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html
docs.jboss.org/hibernate/core/3.6/reference/en-US/html
static.springsource.org/osgi/docs/1.2.1/reference/html

Source: https://habr.com/ru/post/In135651/


All Articles