JSR-299 рдХреЗ рднреАрддрд░ "рдЬрд╛рд╡рд╛ рдИрдИ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдЯреЗрдХреНрдЯреНрд╕ рдПрдВрдб рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди" (рдкреВрд░реНрд╡ рдореЗрдВ рд╡реЗрдмрдмреАрди), рдПрдХ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдЬрд╛рд╡рд╛ рдИрдИ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдкреИрдЯрд░реНрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡реЗрд▓реНрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА ред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдкрд╛рд╕ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд░реВрд╕реА-рднрд╛рд╖рд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдЖрдИрдУрд╕реА рдЬрд╛рд╡рд╛ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдкрд░реНрдпрд╛рдп рд╣реИред рдмреЗрд╢рдХ рдЧреВрдЧрд▓ рдЧреБрдПрд╕ рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдЗрддрдирд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИред
рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╡реЗрд▓реНрдб рдХреЗ рдореБрдЦреНрдп рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ
рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдпрд╣ JSR-330 "рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди" рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧрд╕реЛрд░реНрд╕ рдФрд░ Google рдХреЗ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ DI рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рддрдВрддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕реНрдкреНрд░рд┐рдВрдЧ рдФрд░ рдЧрд╛рдЗрд╕ рдХреА рддрд░рд╣, рд╡реЗрд▓реНрдб рдЗрд╕ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд╡реЗрд▓реНрдб рди рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛ рдИрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде, рдмрд▓реНрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рд╡рд╛ рдПрд╕рдИ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЯреЙрдордХреИрдЯ, рдЬреЗрдЯреНрдЯреА рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ; рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╡рд┐рд╕реНрддреГрдд рд╕реЗрдЯрдЕрдк рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдХреЙрдиреНрдЯреЗрдХреНрдЯреНрд╕ рдПрдВрдб рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди (рд╕реАрдбреАрдЖрдИ) рдореЗрдВ, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рдирд╛рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреАрди рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐
рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╕рдВрдд рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рдПрдиреЛрдЯреЗрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ (рдЬреЛ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реАрдбреАрдЖрдИ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдбреАрдЖрдИ рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
CDI рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдпрд╛ рдЬрд╛рд╡рд╛ SE рдХреЗ рд▓рд┐рдП META-INF) рдХреЗ рд▓рд┐рдП WEB-INF рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдмреАрдиреНрд╕.xml рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
<рдмреАрдиреНрд╕ xmlns = "
java.sun.com/xml/ns/javaee "
xmlns: xsi = "
www.w3.org/2001/XMLSchema-instance "
xsi: schemaLocation = "
java.sun.com/xml/ns/javaee java.sun.com/xml/ns/javaee/beans_1_0.xsd ">
</ рдмреАрдиреНрд╕>
рд╡рд╕рдВрдд рдХреА рддрд░рд╣, рд╕реАрдбреАрдЖрдИ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реЗрдо рдХреА рдЕрдкрдиреА рд╕реНрдХреЛрдк рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВред рдЧреБрдВрдЬрд╛рдЗрд╢ javax.enterprise.context рдкреИрдХреЗрдЬ рд╕реЗ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реИ:
рдкрд╣рд▓реЗ рддреАрди рд╕реНрдХреЛрдк рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред CDI рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,
рдбрд┐рдкреЗрдВрдбреЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдмреАрди рд╕реЗ рд╕реАрдзреЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╣рд░ рд╕рдордп рдореМрдЬреВрдж рд░рд╣рддрд╛ рд╣реИ рдЬрдмрдХрд┐ "рдкреИрд░реЗрдВрдЯ" рд░рд╣рддрд╛ рд╣реИред
@ConversationScoped рдХрд┐рд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреИрдм рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдирд┐рд╢реНрдЪрд┐рдд рдЕрд╡рдзрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рдПрдХ рд╕рддреНрд░ рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ "рд╕рддреНрд░" рдХреА рд╢реБрд░реБрдЖрдд рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, javax.enterprise.context.Conversation рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рдордп рдмреАрддрдиреЗ рдХреЗ рдмрд╛рдж рд╕рддреНрд░ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯрд╛рд░реНрдЯ (), рдПрдВрдб () рд╡рд┐рдзрд┐рдпреЛрдВ, рд╕рд╛рде рд╣реА рд╕реЗрдЯрдЯрд╛рдЗрдо (рд▓рдВрдмреА) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдмреЗрд╢рдХ, рд╡рд╣рд╛рдБ
рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИ , рдЬреЛ javax.inject рдкреИрдХреЗрдЬ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ JSR-330 рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЗрд╕ рджрд╛рдпрд░реЗ рдХреЗ рд╕реАрдбреАрдЖрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ: рдЗрдВрдЬреЗрдХреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдХрдВрдЯреЗрдирд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╕реНрддреБ рдХрд╛ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рди рдХрд┐ рдкреНрд░реЙрдХреНрд╕реА рдХреЛред рдирддреАрдЬрддрди, рдЕрдЧрд░ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реЗрдо, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рддреЛ рдбреЗрдЯрд╛ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЕрдкрдирд╛ рджрд╛рдпрд░рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ @ScopeType рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╕рд╛рде рд╣реА javax.enterprise.context.spi.Context рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рднреНрд░рдо рдкреИрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ javax.faces.bean рдкреИрдХреЗрдЬ рдореЗрдВ рд╕реНрдХреИрди рдХрд┐рдП рдЧрдП JSF рд╕реЗрдо рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЬреЗрдПрд╕рдПрдл рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реАрдбреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк @EJB, @PersistenceContext, рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдирдХ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдо DI рд╕реЗ рдЙрдиреНрдирдд рдЯреБрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ JSR-299 рдФрд░ 330 рд╕реЗ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
primerchik
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреА рд╣реИред
public interface ILoginService extends Serializable { boolean login(String name, String password); }
рдЖрдЗрдП рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦреЗрдВ:
public class LoginService implements ILoginService { @Override public boolean login(String name, String password) { return "bugs".equalsIgnoreCase(name) && "bunny".equalsIgnoreCase(password); } }
рдЕрдм рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рд▓реЙрдЧрд┐рди рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛:
@Named @RequestScoped public class LoginController { @Inject private ILoginService loginService; private String login; private String password; public String doLogin() { return loginService.login(login, password) ? "main.xhtml" : "failed.xhtml"; }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реЗрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдореЗрдВ
рдЗрдВрдЬреЗрдХреНрдЯ рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛: рдХрдВрдЯреЗрдирд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЛ рдвреВрдВрдвреЗрдЧрд╛, рдЙрдкрдпреБрдХреНрдд рдПрдХ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдЬреБрдбрд╝реА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдПрдЧрд╛ред рд╡рд┐рдзрд┐ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЗрдВрдЬреЗрдХреНрд╢рди рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рднреА
рдирд╛рдорд╛рдВрдХрд┐рдд рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдмреАрди рдХреЛ рдирд╛рдо рд╕реЗ рдИрдПрд▓ рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдо рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕реЗрд╡рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ:
public class StubLoginService implements ILoginService { @Override public boolean login(String name, String password) { return true; } }
рдЕрдм, рдЖрд╡реЗрджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
WELD-001409 Ambiguous dependencies for type [ILoginService] with qualifiers [@Default] at injection point [[field] @Inject private com.sample.controller.LoginController.loginService].
рдпрджрд┐ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рддреЛ рд╡реЗрд▓реНрдб рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИред рд╕реАрдбреАрдЖрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, StubLoginService рдХреЛ
рд╡реИрдХрд▓реНрдкрд┐рдХ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ:
@Alternative public class StubLoginService implements ILoginService { тАж }
рдЕрдм рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рддреИрдирд╛рддреА рдХреЗ рдмрд╛рдж рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЕрдм рд╡реЗрд▓реНрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реЗрдо рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред xml:
<рд╡реИрдХрд▓реНрдкрд┐рдХ>
<class> com.sample.service.StubLoginService </ class>
</ рд╡реИрдХрд▓реНрдкрд┐рдХ>
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд┐рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд╛рдЗрди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЕрдм рд╕реЗрд╡рд╛ рдХреЛ рдПрдордбреА 5 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реИрд╢ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝реЗрдВ:
public class Md5LoginService implements ILoginService { @Override public boolean login(String name, String password) {
рдЕрдм рд╣рдореЗрдВ рд╡реЗрд▓реНрдб рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ Md5LoginService рд╣реИ рдЬрд┐рд╕реЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдмрд┐рдВрджреБ рдкрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдЬрдм рдХрдВрдЯреЗрдирд░ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрдВрдЬреЗрдХреНрд╢рди рдмрд┐рдВрджреБ рдкрд░ рдПрдиреЛрдЯреЗрд╢рди рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ рдПрдХ рдирд┐рдпрдорд┐рдд рдЬрд╛рд╡рд╛ рдПрдиреЛрдЯреЗрд╢рди рд╣реИ, рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ
javax .inject.Qualifier рджреНрд╡рд╛рд░рд╛ рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
@Retention(RetentionPolicy.RUNTIME) @Target({FIELD, PARAMETER, TYPE, METHOD}) @Qualifier public @interface Hash { }
рдЕрдм, рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ, рдЖрдЗрдП рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд░рджреНрдж рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╕рд╛рде рд╣реА Md5LoginService рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
@Hash public class Md5LoginService implements ILoginService { } @Named @RequestScoped public class LoginController { @Inject @Hash private ILoginService loginService; }
рдЕрдм рд╡реЗрд▓реНрдб рд╡рд╛рдВрдЫрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕реНрдерд╛рди рд▓реЗрдЧрд╛ред рдмреЗрд╢рдХ, рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдпрд╛ рдПрдиреЛрдЯреЗрд╢рди рд▓рд┐рдЦреЗрдВ?! рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╢реБрд▓реНрдХ рдЯрд╛рдЗрдкрд╕рдлреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
@Hash @Fast public class Md5LoginService implements ILoginService { } @Named @RequestScoped public class LoginController { @Inject @Hash @Fast private ILoginService loginService; }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрд░рдордмрджреНрдз рдПрдиреЛрдЯреЗрд╢рди рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдЖрдк рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗрд▓реНрдб рдХреЛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
@Retention(RetentionPolicy.RUNTIME) @Target({FIELD, PARAMETER, TYPE, METHOD}) @Qualifier public @interface Hash { HashType value() default HashType.SHA;
рдпрд╛рдиреА рдкреНрд░рд╢реНрди рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╣реИред рдпрджреНрдпрдкрд┐ рдПрдХ рдирдпрд╛ рдПрдиреЛрдЯреЗрд╢рди рдФрд░ рдПрдиреНрдпреВрдорд░реЗрд╢рди рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рд╡рд╛рдВрдЫрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЧрд▓рддреА рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рднреА рдмрдврд╝ рдЧрдИ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдпрд╣ рд╣рдореЗрд╢рд╛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдпреЛрдЧреНрдпрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ
javax .enterprise.inject.Default рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдЪ рд╣реИ, рдХрд┐рдП рдЧрдП рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдмрд╛рдж, рд╕реНрдЯреБрдмреНрд▓реЙрдЧрд┐рди рд╕рд░реНрд╡рд┐рд╕ рдиреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ
рд╣реИрд╢ рд╕реНрдкреЗрд╕рд┐рдпрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗрд▓реНрдб рдЗрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдирд╣реАрдВ рдорд╛рдирддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд╛рд▓ рд╣реИ: @Specializes рдПрдиреЛрдЯреЗрд╢рди, рдЬреЛ рджреВрд╕рд░реЗ рд╕реЗрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИред рд╡реЗрд▓реНрдб рдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
@Alternative @Specializes public class StubLoginService extends Md5LoginService { @Override public boolean login(String name, String password) { return true; } }
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирдИ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд▓рд╛рдЧреВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рд╛рде рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╛рдиреА рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд╕рдВрдд рдореЗрдВ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗрд▓реНрдб рдореЗрдВ, рдЖрдк javax.enterprise.inject.Instance <?> рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП
рдХреЛрдИ рднреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдХреНрд╖рдо рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
@Named @RequestScoped public class LoginController { @Inject @Any private Instance<ILoginService> loginService; private String login; private String password; public String doLogin() { for (ILoginService service : loginService) { if (service.login(login, password)) return "main.xhtml"; } return "failed.xhtml"; } }
рдХрд┐рд╕реА рднреА рдПрдиреЛрдЯреЗрд╢рди рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ Iterable рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реБрдВрджрд░ рдХрд╛рдо рдлреЛрд░рдЪреЗрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рди рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рдЕрддрд┐рднрд╛рд░рд┐рдд рдЪрдпрди () рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рд░рдирдЯрд╛рдЗрдо рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдЕрдм рдХреБрдЫ рд╣рдж рддрдХ "рдЕрд╕рд╛рдорд╛рдиреНрдп" рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЕрдирд╛рдо рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╛ рдЕрд▓рдЧ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдмрд╕ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред рдпрд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╛рд░ рд╡рд░реНрдЧ AnnotationLiteral <?> рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдк рд╡рд╛рдВрдЫрд┐рдд рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдкрд╛рд╕ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдЕрд╕рдВрддреБрд╖реНрдЯ рдФрд░ isAigiguous рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдЙрдкрдпреБрдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЧреЗрдЯ () рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
@Inject @Any Instance<ILoginService> loginServiceInstance; public String doLogin() { Instance<ILoginService> tempInstance = isUltimateVersion ? loginServiceInstance.select(new AnnotationLiteral<Hash>(){}) : loginServiceInstance.select(new AnnotationLiteral<Default>(){}); if (tempInstance.isAmbiguous() || tempInstance.isUnsatisfied()) { throw new IllegalStateException(" "); } return tempInstance.get().login(login, password) ? "main.xhtml" : "failed.xhtml"; }
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ loginServiceInstance рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд▓реВрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рд╕рдВрднрд╡ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ getClass рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдвреВрдВрдвреЗрдВ ()ред рдмрд░рд╛рдмрд░ (), рд▓реЗрдХрд┐рди рдлрд┐рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрджрд▓рддреЗ рд╕рдордп, рдореБрдЭреЗ рдЗрд╕ рд╕реНрдерд╛рди рдореЗрдВ рдХреЛрдб рдХреЛ рднреА рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдерд╛ред рд╡реЗрд▓реНрдб рдПрдХ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рдирдП рдЕрдореВрд░реНрдд рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реЗрд▓реНрдб рдХреЛ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд┐рд░рд╛рд╕рдд рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде, рд╣рдо @Typed рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рд╕рдм рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЬрдм рд╣рдореЗрдВ рдХрд┐рд╕реА рдореБрд╢реНрдХрд┐рд▓ рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рдХрдХреНрд╖рд╛ рдХреЛ рддрддреНрдХрд╛рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдлрд┐рд░ рд╕реЗ, xml рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ, рд╕реВрдЪреА рдмрдирд╛рдиреЗ, рдирдХреНрд╢реЗ, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЯреИрдЧ рдХрд╛ рдПрдХ рд╕рдореГрджреНрдз рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡реЗрд▓реНрдб рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди @Produces рд╣реИ, рдЬреЛ рдЙрди рддрд░реАрдХреЛрдВ рдФрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ (рд╕реНрдХреЗрд▓рд░ рдкреНрд░рдХрд╛рд░ рд╕рд╣рд┐рдд)ред рд╣рдо рдЕрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
@ApplicationScoped public class LoginServiceFactory implements Serializable {
рдЕрдм рд╣рдо рдЙрд╕ рд╡рд┐рд╢реЗрд╖рд╛рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
@Inject @Factory private ILoginService loginService;
рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдПрдХ рдирд┐рдпрдорд┐рдд рдХреНрд╖реЗрддреНрд░ рднреА рдПрдХ рд╕реНрд░реЛрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдирд┐рдпрдо рд╕рдорд╛рди рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдмрд┐рд▓реНрдб рдмрд┐рд▓реНрдб рдореЗрдВ рднреА рдЗрдВрдЬреЗрдХреНрд╢рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ
@Produces @Factory private ILoginService buildLoginService( @Hash(HashType.MD5) ILoginService md5LoginService, ILoginService defaultLoginService) { return isUltimateVersion ? md5LoginService : defaultLoginService; }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХреНрд╕реЗрд╕ рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИред рдмрд┐рд▓реНрдбрд▓реЙрдЧрд┐рди рд╕рд░реНрд╡рд┐рд╕ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рджрд╛рдпрд░рд╛ рдЙрд╕ рд╕реЗрдо рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрдВрдзрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣
рдирд┐рд░реНрднрд░ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣:
@Produces @Factory @SessionScoped private ILoginService buildLoginService( @Hash(HashType.MD5) ILoginService md5LoginService, ILoginService defaultLoginService) { return isUltimateVersion ? md5LoginService : defaultLoginService; }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ @Produces рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╕рдВрд╕рд╛рдзрди рдЬрд╛рд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдПрдХ рдФрд░ @ рдбрд╛рдпрд╕реНрдкреЛрдЬрд╝реНрдб рдПрдиреЛрдЯреЗрд╢рди рд╣реИ рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
private void dispose(@Disposes @Factory ILoginService service) { log.info("LoginService disposed"); }
рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЬреАрд╡рди рдЪрдХреНрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реЗрд▓реНрдб рдЙрди рддрд░реАрдХреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЬрдирд░реЗрдЯрд░ рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА @Disposed рдХреЛ рдЯреИрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рд╣рдордиреЗ JSR-299 рдХреЗ рд╕рднреА рдлреАрдЪрд░реНрд╕ рд╕реЗ рджреВрд░ рдорд╛рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрдЯреЗрдирд░ (рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░, рдбреЗрдХреЛрд░реЗрдЯрд░), рд╕реНрдЯреАрд░рд┐рдпреЛрдЯрд╛рдЗрдкреНрд╕, рдПрдХ рдЗрд╡реЗрдВрдЯ рдореЙрдбрд▓ рдХреЗ рдЕрдВрджрд░ рд╕реЗрдо рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ рд╣реИрдВ, рдЬрд┐рдирдХреА рдорджрдж рд╕реЗ рдЬрдЯрд┐рд▓ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдФрд░ рдХрдИ, рдХрдИ рдЕрдЪреНрдЫреА рдЫреЛрдЯреА рдЪреАрдЬреЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдЕрдиреНрдп рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рд╡реЗрд▓реНрдб рдХреЗ рд╡рд┐рдкрд░реАрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╡реЗрд▓реНрдб рд╕реНрд╡-рдирд┐рд╣рд┐рдд рд╣реИ рдФрд░ рдЬрд╛рд╡рд╛ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдзреНрдпрд╛рди рдХреЗ рдпреЛрдЧреНрдп рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ
JSR-299рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрд▓реНрдб рдкреНрд░рд▓реЗрдЦрдиOracle рдЗрдВрдЬреАрдирд┐рдпрд░ рджреНрд╡рд╛рд░рд╛ рдЧреНрд░реЗрдЯ JSR-299 рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд▓реЗрдЦрд╕реАрдбреАрдЖрдИ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдиреЗрдЯрдмреАрдиреНрд╕ рдореЗрдВ рд░реВрд╕реА (
1 ,
2 ,
3 ,
4 ) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ