рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХреЛрдб рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдПрдВрдЯреАрдкрд░реНрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЙрди рд╕рднреА рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рд▓рд╛рдЗрд╡ рдХреЛрдб рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдпрд╛: рдпрд╛ рддреЛ рдореИрдВ рдореМрдЬреВрджрд╛ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЙрдирдХреЗ рдкрд╛рд╕ рдЖрдпрд╛, рдпрд╛ рдореИрдВрдиреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЗ рдХрд╛рдо рдХреЛ рдкрдврд╝рддреЗ рд╣реБрдП рдкрдХрдбрд╝рд╛ред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдкрдиреЗ "рдкрд╛рдкреЛрдВ" рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдзрд╛рд░ рдХреЗ рдорд╛рд░реНрдЧ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рджреЛрдЧреБрдирд╛ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛрдЧреАред рдореИрдВ рдЖрдкрд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рднреА рдЖрдЧреНрд░рд╣ рдХрд░рддрд╛ рд╣реВрдВ, рд╣рдо рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕рдмрд╕реЗ рдЙрддреНрд╕реБрдХ рдФрд░ рдЕрд╕рд╛рдорд╛рдиреНрдп рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред
Autowired
рдорд╣рд╛рди рдФрд░ рднрдпрд╛рдирдХ @Autowired
рд╡рд╕рдВрдд рдореЗрдВ рдПрдХ рдкреВрд░реЗ рдпреБрдЧ рд╣реИред рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рднреА рдЖрдк рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдХреЛрдб рдореЗрдВ рдпрд╣ (PMSM) рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢рд╛рдирджрд╛рд░ рд╣реИред рдореЗрд░реА рд╣рд╛рд▓ рдХреА рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рд╡рд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдерд╛ред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╣рдордиреЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛:
@Component public class MyService { @Autowired private ServiceDependency; @Autowired private AnotherServiceDependency;
рдЦреЗрддреЛрдВ рдФрд░ рдмрд╕реНрддрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХрд╛ рдкрд╣рд▓реЗ рд╣реА рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рд▓рд┐рдВрдХ рдХреЗ рдмрд╛рдж, рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд░реНрдгрд┐рдд рд╣реИ:
private DependencyA dependencyA; private DependencyB dependencyB; private DependencyC dependencyC; @Autowired public DI(DependencyA dependencyA, DependencyB dependencyB, DependencyC dependencyC) { this.dependencyA = dependencyA; this.dependencyB = dependencyB; this.dependencyC = dependencyC; }
рдпрд╣ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕рднреНрдп рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 10 рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВ (рд╣рд╛рдВ, рд╣рд╛рдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдЙрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ)ред рдЪрд┐рддреНрд░ рдЕрдм рдЗрддрдирд╛ рдЖрдХрд░реНрд╖рдХ рдирд╣реАрдВ рд╣реИ:
private DependencyA dependencyA; private DependencyB dependencyB; private DependencyC dependencyC; private DependencyD dependencyD; private DependencyE dependencyE; private DependencyF dependencyF; private DependencyG dependencyG; private DependencyH dependencyH; private DependencyI dependencyI; private DependencyJ dependencyJ; @Autowired public DI() { this.dependencyA = dependencyA; this.dependencyB = dependencyB; this.dependencyC = dependencyC; this.dependencyD = dependencyD; this.dependencyE = dependencyE; this.dependencyF = dependencyF; this.dependencyG = dependencyG; this.dependencyH = dependencyH; this.dependencyI = dependencyI; this.dependencyJ = dependencyJ; }
рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рд░рд╛рдХреНрд╖рд╕реА рджрд┐рдЦрддрд╛ рд╣реИред
рдФрд░ рдпрд╣рд╛рдБ, рдХрдИ рд▓реЛрдЧ рдпрд╣рд╛рдБ рднреА рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рд╡рд╛рдпреЛрд▓рд┐рди рдмрд╛рдЬрдиреЗрд╡рд╛рд▓рд╛ @Autowired
рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ! рдпрджрд┐ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ, рддреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ (> = 4) рд╕рдордЭреЗрдЧрд╛ рдХрд┐ рдЗрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ @AllArgsContructor
рдмрджрд▓рдХрд░ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░ - @RequiredArgsContructor
рдкрд░, рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХреЛ final
рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд░рдВрднреАрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрд▓ рдХреЗ рдмрд┐рдирд╛ (рдмрд╢рд░реНрддреЗ рдХрд┐ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛ рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЖрд░рдВрднреАрдХреГрдд рд╣реЛ):
@RequiredArgsConstructor public class DI { private final DependencyA dependencyA; private final DependencyB dependencyB; private final DependencyC dependencyC; private final DependencyD dependencyD; private final DependencyE dependencyE; private final DependencyF dependencyF; private final DependencyG dependencyG; private final DependencyH dependencyH; private final DependencyI dependencyI; private final DependencyJ dependencyJ; }
рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╡рд░реНрдЧреЛрдВ рдФрд░ Enum рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реНрдЯреЗрдЯрд┐рдХ рддрд░реАрдХреЗ
рдЦреВрдиреА рдИ рдореЗрдВ рдЕрдХреНрд╕рд░ рдбреЗрдЯрд╛ рд╡рд╛рд╣рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░рдд рд╕реЗ рджреВрд╕рд░реА рдкрд░рдд рдХреА рд╕рдорд╛рди рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрдХреНрд╖рд╛рдПрдВ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ (рдпрд╛рдж рд░рдЦреЗрдВ, рд╡рд░реНрд╖ 2019 рдореЗрдВ):
@UtilityClass public class Utils { public static UserDto entityToDto(UserEntity user) {
рд╕реНрдорд╛рд░реНрдЯ рдХрд┐рддрд╛рдмреЗрдВ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧрдгрдирд╛ рдХреЗ рдЬрд╛рджреБрдИ рдЧреБрдгреЛрдВ рд╕реЗ рдЕрд╡рдЧрдд рд╣реИрдВ:
enum Function implements Function<UserEntity, UserDto> { INST; @Override public UserDto apply(UserEntity user) {
рд╕рдЪ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЙрд▓ рдЕрднреА рднреА рдПрдХрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред
рдФрд░ рднреА рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд▓рдбрд╝рдХреЗ (рдФрд░ рд▓рдбрд╝рдХрд┐рдпрд╛рдВ) MapStruct рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕рдм рдХреБрдЫ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.ERROR) public interface CriminalRecommendationMapper { UserDto map(UserEntity user); }
рдЕрдм рд╣рдо рд╡рд╕рдВрдд рдШрдЯрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдЬреАрдд рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╢реИрддрд╛рди рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬреАрдд рднрд╛рд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдо рд╕рдорд╛рди рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП (рдЕрдиреНрдпрдерд╛ рдмрд╡рд╛рд╕реАрд░ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ), рдЬреЛ рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрджрд┐ рд╕рдВрд╕рд╛рдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХрд┐рд╕реА рднреА рдЬрдЯрд┐рд▓ рдХреНрд╖реЗрддреНрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред рдЦреИрд░, рдореИрдкрд╕реНрдЯреНрд░реИрдХ рдХреЛ рдХреЗрд╡рд▓ рдирд┐рд░реНрднрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдФрд░ рдХреБрдЫ рд▓реЛрдЧ рдкреБрд░рд╛рдиреЗ рдЬрдорд╛рдиреЗ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдмрд╕рдВрдд-рдЪрд╛рд▓рд┐рдд рдХрдирд╡рд░реНрдЯрд░ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛:
import org.springframework.core.convert.converter.Converter; @Component public class UserEntityToDto implements Converter<UserEntity, UserDto> { @Override public UserDto convert(UserEntity user) {
рдпрд╣рд╛рдБ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЕрдиреНрдп рд╡рд░реНрдЧ рдореЗрдВ, рдореБрдЭреЗ рдХреЗрд╡рд▓ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
@Component @RequiredArgsConstructor public class DI { private final Converter<UserEntity, UserDto> userEnityToDto; }
рдФрд░ рд╡рд╕рдВрдд рдЕрдкрдиреЗ рдЖрдк рд╣реА рд╕рдм рдХреБрдЫ рд╣рд▓ рдХрд░ рджреЗрдЧрд╛!
рд╡реНрдпрд░реНрде рдХрд╛ рдкрд╛рддреНрд░
рдЬреАрд╡рди рдХрд╛ рдорд╛рдорд▓рд╛: рдЖрд╡реЗрджрди рджреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рджреЛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд ( java.sql.DataSource
), рджреЛ рд▓реЗрди-рджреЗрди рдкреНрд░рдмрдВрдзрдХ, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рджреЛ рд╕рдореВрд╣ рдЖрджрд┐ рд╣реИрдВред рдпрд╣ рд╕рдм рдЖрд╕рд╛рдиреА рд╕реЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рдпрд╣ рдкреЛрд╕реНрдЯрдЧреНрд░реЗ рдХреЗ рд▓рд┐рдП рд╣реИ:
@Configuration public class PsqlDatasourceConfig { @Bean @Primary @ConfigurationProperties(prefix = "spring.datasource.psql") public DataSource psqlDataSource() { return DataSourceBuilder.create().build(); } @Bean public SpringLiquibase primaryLiquibase( ProfileChecker checker, @Qualifier("psqlDataSource") DataSource dataSource ) { boolean isTest = checker.isTest(); SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setDataSource(dataSource); liquibase.setChangeLog("classpath:liquibase/schema-postgre.xml"); liquibase.setShouldRun(isTest); return liquibase; } }
рдФрд░ рдпрд╣ DB2 рдХреЗ рд▓рд┐рдП рд╣реИ:
@Configuration public class Db2DatasourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.db2") public DataSource db2DataSource() { return DataSourceBuilder.create().build(); } @Bean public SpringLiquibase liquibase( ProfileChecker checker, @Qualifier("db2DataSource") DataSource dataSource ) { boolean isTest = checker.isTest(); SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setDataSource(dataSource); liquibase.setChangeLog("classpath:liquibase/schema-db2.xml"); liquibase.setShouldRun(isTest); return liquibase; } }
рдЪреВрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИрдВ, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЙрди рдкрд░ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреАрдбреАрдПрд▓ / рдбреАрдПрдордПрд▓ рд░реЛрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЪреВрдБрдХрд┐ рджреЛрдиреЛрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд▓реЛрдб рд╣реЛрддреЗ рд╣реИрдВ, рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдКрдкрд░ рд╣реЛрддрд╛ рд╣реИ, рдЕрдЧрд░ рдореИрдВ @Qualifier
, рддреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдЕрдкрдирд╛ рд▓рдХреНрд╖реНрдп рдкрджрдирд╛рдо рдЦреЛ рджреЗрдЧрд╛ рдФрд░, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛, рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ @Qualifier
рдмреЛрдЭрд┐рд▓ рд╣реИрдВ рдФрд░ рдЦрд░реЛрдВрдЪ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЧрддрд┐рд░реЛрдз рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛ рди рдХреЗрд╡рд▓ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ:
@Configuration public class PsqlDatasourceConfig { @Bean @Primary @ConfigurationProperties(prefix = "spring.datasource.psql") public DataSource psqlDataSource() { return DataSourceBuilder.create().build(); } @Bean public SpringLiquibase primaryLiquibase(ProfileChecker checker) { boolean isTest = checker.isTest(); SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setDataSource(psqlDataSource());
javax.inject.Provider
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рджрд╛рдпрд░реЗ рдХреЗ рд╕рд╛рде рд╕реЗрдо рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ? рдореИрдВ рдЕрдХреНрд╕рд░ рдЗрд╕ рдкрд░ рдЖрддрд╛ рдерд╛
@Component @Scope(SCOPE_PROTOTYPE) @RequiredArgsConstructor public class ProjectBuilder { private final ProjectFileConverter converter; private final ProjectRepository projectRepository;
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╢рд╣рдж рдХреЗ рдЗрд╕ рдмреИрд░рд▓ рдореЗрдВ рдорд░рд╣рдо рдореЗрдВ рдПрдХ рдордХреНрдЦреА рд╣реИред рд╣рдореЗрдВ рдПрдХ рдФрд░ javax.inject:javax.inject:1
рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдареАрдХ 10 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдорд╛рд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рддрдм рд╕реЗ рдХрднреА рднреА рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рд▓реЗрдХрд┐рди рд╡рд╕рдВрдд рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╡реНрдпрд╕рдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рднреА рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ! рдмрд╕ javax.inject.Provider::get
рдмрджрд▓реЗрдВ org.springframework.beans.factory.ObjectFactory::getObject
рд╕рд╛рде javax.inject.Provider::get
org.springframework.beans.factory.ObjectFactory::getObject
рдФрд░ рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
@Component @RequiredArgsConstructor public class PrototypeUtilizer { private final ObjectFactory<ProjectBuilder> projectBuilderFactory; void method() { ProjectBuilder freshBuilder = projectBuilderFactory.getObject(); } }
рдЕрдм рд╣рдо рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡реЗрдХ рдХреЗ рд╕рд╛рде, рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╕реВрдЪреА рд╕реЗ javax.inject
рдХреЛ рдХрд╛рдЯ javax.inject
ред
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдХреЛ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдЖрдо рдЙрджрд╛рд╣рд░рдг:
@Configuration @EnableJpaRepositories("com.smth.repository") public class JpaConfig {
рдпрд╣рд╛рдВ рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ рдкреИрдХреЗрдЬ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рд╣рдо рдереЛрдбрд╝рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд╛рдордХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рд╢реБрд░реБрдЖрддреА рдЪрд░рдгреЛрдВ рдореЗрдВ, рдХреЛрдб рдХреЗ рд╕рдВрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди - рдЗрд╕ рддрд░рд╣ рдХреА рдмреЗрд╡рдХреВрдлрд╛рдирд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдврд╛рдВрдЪрд╛ рд╣рдорд╛рд░реА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
@Configuration @EnableJpaRepositories(basePackageClasses = AuditRepository.class) public class JpaConfig {
рдпрд╣рд╛рдБ AuditRepository
рдкреИрдХреЗрдЬ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рджреЗрдЦ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдХрдХреНрд╖рд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд╣рдорд╛рд░реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдЕрдм рдЯрд╛рдЗрдкреЛрд╕ рдХреЛ рд╕реАрдзреЗ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдпрд╛ рд╕рдмрд╕реЗ рдХрдо, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдХрдИ рд╕рдорд╛рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
@ComponentScan(basePackages = "com.smth")
рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ
import com.smth.Smth; @ComponentScan(basePackageClasses = Smth.class)
рдЕрдЧрд░ рд╣рдореЗрдВ рдХреБрдЫ рдХреНрд▓рд╛рд╕ рдХреЛ рдлреЙрд░реНрдо рдХреЗ Map<String, Object>
рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
void config(LocalContainerEntityManagerFactoryBean bean) { String property = "hibernate.session_factory.session_scoped_interceptor"; bean.getJpaPropertyMap().put(property, "com.smth.interceptor.AuditInterceptor"); }
рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:
import com.smth.interceptor.AuditInterceptor; void config(LocalContainerEntityManagerFactoryBean bean) { String property = "hibernate.session_factory.session_scoped_interceptor"; bean.getJpaPropertyMap().put(property, AuditInterceptor.class); }
рдФрд░ рдЬрдм рдРрд╕рд╛ рдХреБрдЫ рд╣реИ
LocalContainerEntityManagerFactoryBean bean = builder .dataSource(dataSource) .packages(
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ packages()
рдкрджреНрдзрддрд┐ рдЕрддрд┐рднрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ:

рд╕рднреА рдмреАрдиреНрд╕ рдХреЛ рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рди рд░рдЦреЗрдВ
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ / рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрде рдкрд░ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЖрдкрдиреЗ рдПрдХ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рджреЗрдЦреА рд╣реИ:
root-package | \ repository/ entity/ service/ Application.java
рдпрд╣рд╛рдБ Application.java
рдХреА рдЬрдбрд╝ рд╡рд░реНрдЧ рд╣реИ:
@SpringBootApplication @EnableJpaRepositories(basePackageClasses = SomeRepository.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
рдпрд╣ рдХреНрд▓рд╛рд╕рд┐рдХ microservice рдХреЛрдб рд╣реИ: рдШрдЯрдХреЛрдВ рдХреЛ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ рд░реВрдЯ рдкрд░ рд╣реИред рдЬрдмрдХрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЫреЛрдЯрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдврд╝рддреА рд╣реИ, рд╡рд╕рд╛ рдкреИрдХреЗрдЬ рджрд░реНрдЬрдиреЛрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА / рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рдЕрдЦрдВрдб рдмрдиреА рд╣реБрдИ рд╣реИ, рддреЛ рдЙрдирдХреЗ рд╕рд╛рде рдЬреА.рдбреА. рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрд╛рд░реНрдп рд░реИрдЧреНрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдарддрд╛ рд╣реИ, рддреЛ рдкреНрд░рд╢реНрди рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдЗрд╕ рджрд░реНрдж рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЕрд░реНрдерд╛рддреН рдЙрдирдХреЗ рдбреЛрдореЗрди рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдПред рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ
root-package/ | \ user/ | \ repository/ domain/ service/ controller/ UserConfig.java billing/ | \ repository/ domain/ service/ BillingConfig.java //... Application.java
рдпрд╣рд╛рдВ, user
рдкреИрдХреЗрдЬ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдк-рдкреИрдХреЗрдЬ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
user/ | \ repository/ UserRepository.java domain/ UserEntity.java service/ UserService.java controller/ UserController.java UserConfig.java
рдЕрдм UserConfig
рдЖрдк рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рдЬреБрдбрд╝реА рд╕рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
@Configuration @ComponentScan(basePackageClasses = UserServiceImpl.class) @EnableJpaRepositories(basePackageClasses = UserRepository.class) class UserConfig { }
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрд▓рдЧ рд╕реЗрд╡рд╛рдУрдВ / рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ module-info.java
рдЬреЛрдбрд╝рдХрд░, рдмрд╛рд╣рд░ рдХреА рджреБрдирд┐рдпрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЫрд┐рдкрд╛рддреЗ рд╣реБрдП module-info.java
рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдХрд╛рдо рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд░рд╣рд╛ рд╣реИред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдПрдВрдЯреАрдкрд░реНрдЯреНрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ, рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕рд╛рде рд╣рд▓ рдХрд░реЗрдВрдЧреЗ :)