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

рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВ рд╕рд░рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдм рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВред рдЖрдк 1 рдорд┐рдирдЯ рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдХреБрдВрдЬреА рд╕реЗ рдХреИрд╢ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдХреИрд╢ рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░ рдХрдИ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╢реАрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреБрдЫ рдХреИрд╢ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЖрдк рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЪреЗрд╣рд░рд╛ред
рдореИрдВ "рд╕реМрдВрдкрд╛" рдХреНрдпреЛрдВ рдХрд╣рддрд╛ рд╣реВрдВ? рдХреНрдпреЛрдВрдХрд┐ рдХреИрд╢рд┐рдВрдЧ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдмрдбрд╝реЗ, рдЕрддреНрдпрдзрд┐рдХ рднрд░реА рд╣реБрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдкреНрд░рддрд┐ рдорд┐рдирдЯ рд╣рдЬрд╛рд░реЛрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рдеред рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЙрд▓ рдХреЛ рдХреИрд╢ рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЧрд░ рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╛рд╕реНрдЯрд░ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдбреЗрдЯрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЦреБрдж рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╣рдо рдЙрди рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЫреЛрдЯрд╛ рд╣реИ рдФрд░ рдУрд╡рд░рд▓реЛрдб рдХрд╛ рдЦрддрд░рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреБрдЫ рднреА рдХреИрд╢ рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ - рд╣рдореЗрд╢рд╛ рддрд╛рдЬрд╛ рдбреЗрдЯрд╛ рд╣рдореЗрд╢рд╛ рд╕рдордп-рд╕рдордп рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред
рдЖрдорддреМрд░ рдкрд░, рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкрджреЛрдВ рдореЗрдВ, рд╕реНрдкреАрдХрд░ рдкрд╣рд▓реЗ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдХреНрд░реЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддрдХрдиреАрдХ рдХреА рд╣рд┐рдореНрдордд рдореЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рдкрд╛рдардХ рдХреЛ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рддрдм, рдЬрдм рд╡рд╣ рд▓реЗрдЦ рдХреЗ рдПрдХ рдЕрдЪреНрдЫреЗ рдЖрдзреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕рдордЭрддрд╛ рд╣реИ, рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдзрд┐рдорд╛рдирддрдГ, рдХрдо рд╕реЗ рдХрдо рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рд╛рде, рдФрд░ рдлрд┐рд░, рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреИрд╢ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд┐рди рдХреЗ рдЕрдВрджрд░ рд╣реА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд╛рдЗрди-рдЯреНрдпреВрд╢рди рдХреИрд╢рд┐рдВрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рднрд▓реЗ рд╣реА рдЖрдк (рдФрд░ рдпрд╣ рдмрд┐рдВрджреБ 6 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ), рдЖрдкрдХреА рдХреИрд╢рд┐рдВрдЧ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧреАред
рд╣рдо рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд╕рднреА рдкрд╣рд▓реБрдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдореИрдВрдиреЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ред рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реЛрдЧрд╛ред
0. рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдирд╛
рд╣рдо рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЗрдХрд╛рдИ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓реЛрдореНрдмреЛрдХ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреИрд╢, рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдФрд░ рдПрдЪ 2 рдХреЛ рдЬреЛрдбрд╝рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЗрд╡рд▓ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреИрд╢ рдХреЗ рд╕рд╛рде рд╣реА рдЦрджреЗрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
plugins { id 'org.springframework.boot' version '2.1.7.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' id 'java' } group = 'ru.xpendence' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-cache' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' }
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдЗрдХрд╛рдИ рд╣реЛрдЧреА, рдЪрд▓реЛ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╣рддреЗ рд╣реИрдВред
@Entity @Table(name = "users") @Data @NoArgsConstructor @ToString public class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "email") private String email; public User(String name, String email) { this.name = name; this.email = email; } }
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рд╕реЗрд╡рд╛ рдЬреЛрдбрд╝реЗрдВ:
public interface UserRepository extends JpaRepository<User, Long> { } @Slf4j @Service public class UserServiceImpl implements UserService { private final UserRepository repository; public UserServiceImpl(UserRepository repository) { this.repository = repository; } @Override public User create(User user) { return repository.save(user); } @Override public User get(Long id) { log.info("getting user by id: {}", id); return repository.findById(id) .orElseThrow(() -> new EntityNotFoundException("User not found by id " + id)); } }
рдЬрдм рд╣рдо рдЧреЗрдЯ () рд╕реЗрд╡рд╛ рдкрджреНрдзрддрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЙрдЧ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреИрд╢ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред
@SpringBootApplication @EnableCaching
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддреИрдпрд╛рд░ рд╣реИред
1. рд░рд┐рдЯрд░реНрди рдкрд░рд┐рдгрд╛рдо рдХреИрд╢рд┐рдВрдЧ
рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреИрд╢ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреИрд╢ рдмрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд┐рдЯрд░реНрди рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рджреЗрдЦреЗрдВред рд╣рдо рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП () рд╕реЗрд╡рд╛ рдкрджреНрдзрддрд┐ рдкрд░ @ рд╡реНрдпрд╡рд╣рд╛рд░ рдпреЛрдЧреНрдп рдПрдиреЛрдЯреЗрд╢рди рдбрд╛рд▓реЗрдВрдЧреЗред рд╣рдо рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рдирд╛рдо рджреЗрддреЗ рд╣реИрдВ (рд╣рдо рдЖрдЧреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдЕрд▓рдЧ рд╕реЗ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
@Override @Cacheable("users") public User get(Long id) { log.info("getting user by id: {}", id); return repository.findById(id) .orElseThrow(() -> new EntityNotFoundException("User not found by id " + id)); }
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВрдЧреЗред
@RunWith(SpringRunner.class) @SpringBootTest public abstract class AbstractTest { }
@Slf4j public class UserServiceTest extends AbstractTest { @Autowired private UserService service; @Test public void get() { User user1 = service.create(new User("Vasya", "vasya@mail.ru")); User user2 = service.create(new User("Kolya", "kolya@mail.ru")); getAndPrint(user1.getId()); getAndPrint(user2.getId()); getAndPrint(user1.getId()); getAndPrint(user2.getId()); } private void getAndPrint(Long id) { log.info("user found: {}", service.get(id)); } }
рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░, рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рдХреНрдпреЛрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рд╕реЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВредрдпрджрд┐ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЕрдкрдирд╛ @SpringBootTest рдПрдиреЛрдЯреЗрд╢рди рд╣реИ, рддреЛ рд╣рд░ рдмрд╛рд░ рдРрд╕реА рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдлрд┐рд░ рд╕реЗ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╕рдВрджрд░реНрдн 5 рд╕реЗрдХрдВрдб, рдпрд╛ рд╢рд╛рдпрдж 40 рд╕реЗрдХрдВрдб рддрдХ рдмрдврд╝ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╣реБрдд рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕реА рд╕рдордп, рдЖрдорддреМрд░ рдкрд░ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдЖрдк рдПрдХ рд╣реА рдХрдХреНрд╖рд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрджрд░реНрдн рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЗ рдКрдкрд░, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИ, рдпрд╣ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕рдВрджрд░реНрдн рдмрдврд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдореИрдВ рдкрд░реАрдХреНрд╖рдг / рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди рдЙрдард╛рдП рдЧрдП рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? рд╡рд╣ рджреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ 2 рдмрд╛рд░ рдЦреАрдВрдЪрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо @ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдПрдиреЛрдЯреЗрд╢рди рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЬреЛ рд▓реМрдЯреЗ рд╣реБрдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреИрд╢ рдХрд░реЗрдЧрд╛ред рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд () рд╡рд┐рдзрд┐ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓реЙрдЧ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, рд╣рдо рдЖрд╡реЗрджрди (рдкреНрд░рд╛рдкреНрдд) рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддреНрдпреЗрдХ рдпрд╛рддреНрд░рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓реЙрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВред рдпрд╣ рд╣рдореЗрдВ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИред
getting user by id: 1 user found: User(id=1, name=Vasya, email=vasya@mail.ru) getting user by id: 2 user found: User(id=2, name=Kolya, email=kolya@mail.ru) user found: User(id=1, name=Vasya, email=vasya@mail.ru) user found: User(id=2, name=Kolya, email=kolya@mail.ru)
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рджреЛ рдмрд╛рд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд () рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЧрдП рдереЗ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдорд┐рд▓рд╛ рдерд╛ред рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЙрд▓ рдирд╣реАрдВ рдерд╛, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреЗ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдХреИрд╢ рдбреЗрдЯрд╛ рд▓рд┐рдпрд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЖрдИрдбреА рд╣реИ)ред
2. рдХреИрд╢рд┐рдВрдЧ рдХреБрдВрдЬреА рдШреЛрд╖рдгрд╛
рдХрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрд╢реНрдб рдкрджреНрдзрддрд┐ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХреИрд╢рд┐рдВрдЧ рд╣реЛрдЧрд╛ред рд╣рдо рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЗрдХрдЯреНрдареА рд╣реБрдИ рдЗрдХрд╛рдИ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдЧреА, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╕рдорд╛рди рдирд╛рдо рд╡рд╛рд▓реА рдХреЛрдИ рдЗрдХрд╛рдИ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рддреЛ рд╣рдо рдЙрд╕реЗ рд╕рд╣реЗрдЬреЗрдВрдЧреЗ рдирд╣реАрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдирд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
@Override @Cacheable(value = "users", key = "#name") public User create(String name, String email) { log.info("creating user with parameters: {}, {}", name, email); return repository.save(new User(name, email)); }
рдЪрд▓реЛ рдЗрд╕реА рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ:
@Test public void create() { createAndPrint("Ivan", "ivan@mail.ru"); createAndPrint("Ivan", "ivan1122@mail.ru"); createAndPrint("Sergey", "ivan@mail.ru"); log.info("all entries are below:"); service.getAll().forEach(u -> log.info("{}", u.toString())); } private void createAndPrint(String name, String email) { log.info("created user: {}", service.create(name, email)); }
рд╣рдо рддреАрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рджреЛ рдХреЗ рд▓рд┐рдП рдирд╛рдо рд╕рдорд╛рди рд╣реЛрдЧрд╛
createAndPrint("Ivan", "ivan@mail.ru"); createAndPrint("Ivan", "ivan1122@mail.ru");
рдФрд░ рджреЛ рдореЗрдВ рд╕реЗ рдЬреЛ рдИрдореЗрд▓ рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛
createAndPrint("Ivan", "ivan@mail.ru"); createAndPrint("Sergey", "ivan@mail.ru");
рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рддрдереНрдп рдХреЛ рд▓реЙрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЙрди рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд▓реЙрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдпрд╣ рд╡рд┐рдзрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реМрдЯреА рд╣реИред рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
creating user with parameters: Ivan, ivan@mail.ru created user: User(id=1, name=Ivan, email=ivan@mail.ru) created user: User(id=1, name=Ivan, email=ivan@mail.ru) creating user with parameters: Sergey, ivan@mail.ru created user: User(id=2, name=Sergey, email=ivan@mail.ru) all entries are below: User(id=1, name=Ivan, email=ivan@mail.ru) User(id=2, name=Sergey, email=ivan@mail.ru)
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреЗ 3 рдмрд╛рд░ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛, рдФрд░ рдХреЗрд╡рд▓ рджреЛ рдмрд╛рд░ рдЗрд╕рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред рдПрдХ рдмрд╛рд░ рдПрдХ рдХреБрдВрдЬреА рдПрдХ рд╡рд┐рдзрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рдФрд░ рдпрд╣ рдмрд╕ рдПрдХ рдХреИрд╢реНрдб рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ред
3. рдордЬрдмреВрд░ рдХреИрд╢рд┐рдВрдЧред @CachePut
рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ рдЬрдм рд╣рдо рдХрд┐рд╕реА рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреИрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд╣рдореЗрдВ рдХреИрд╢ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП, @ рдХреИрд╢ рдПрдиреЛрдЯреЗрд╢рди рдореМрдЬреВрдж рд╣реИред рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рдХреИрд╢ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реБрдП, рднрд▓реЗ рд╣реА рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреИрд╢ рд╣реЛред
рдХреБрдЫ рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрдЪрд╛рдПрдВрдЧреЗред рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП @Cacheable рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВрдЧреЗ, рджреВрд╕рд░рд╛ @CachePut рдХреЗ рд╕рд╛рдеред
@Override @Cacheable(value = "users", key = "#user.name") public User createOrReturnCached(User user) { log.info("creating user: {}", user); return repository.save(user); } @Override @CachePut(value = "users", key = "#user.name") public User createAndRefreshCache(User user) { log.info("creating user: {}", user); return repository.save(user); }
рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдХреИрд╢ рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧреА, рджреВрд╕рд░рд╛ рдХреИрд╢ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ред рдХреИрд╢рд┐рдВрдЧ рдХреБрдВрдЬреА # user.name рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЗрд╕реА рдкрд░реАрдХреНрд╖рдг рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗред
@Test public void createAndRefresh() { User user1 = service.createOrReturnCached(new User("Vasya", "vasya@mail.ru")); log.info("created user1: {}", user1); User user2 = service.createOrReturnCached(new User("Vasya", "misha@mail.ru")); log.info("created user2: {}", user2); User user3 = service.createAndRefreshCache(new User("Vasya", "kolya@mail.ru")); log.info("created user3: {}", user3); User user4 = service.createOrReturnCached(new User("Vasya", "petya@mail.ru")); log.info("created user4: {}", user4); }
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрдгрд┐рдд рддрд░реНрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкрд╣рд▓реА рдмрд╛рд░ "рд╡рд╛рд╕реНрдпрд╛" рдирд╛рдо рд╡рд╛рд▓рд╛ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ createOrReturnCached () рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рддрдм рдПрдХ рдХреИрд╢реНрдб рдЗрдХрд╛рдИ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд╡рдпрдВ рд╡рд┐рдзрд┐ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд░ рд╣рдо createAndRefreshCache () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреИрд╢ "рд╡рд╛рд╕реНрдпрд╛" рдирд╛рдо рдХреА рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдХреИрд╢реНрдб рдЗрдХрд╛рдИ рдХреЛ рдХреИрд╢ рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪрд▓реЛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
creating user: User(id=null, name=Vasya, email=vasya@mail.ru) created user1: User(id=1, name=Vasya, email=vasya@mail.ru) created user2: User(id=1, name=Vasya, email=vasya@mail.ru) creating user: User(id=null, name=Vasya, email=kolya@mail.ru) created user3: User(id=2, name=Vasya, email=kolya@mail.ru) created user4: User(id=2, name=Vasya, email=kolya@mail.ru)
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ user1 рдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдХреИрд╢ рдкрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓рд┐рдЦрд╛ рд╣реИред рдЬрдм рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрд╕реА рдирд╛рдо рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдХреЙрд▓ (user2) рдХрд╛ рдХреИрд╢реЗрдб рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП id user1 рдЬреИрд╕реА рд╣реА рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд┐рдЦрд┐рдд рдирд╣реАрдВ рдерд╛, рдФрд░ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдХреИрд╢ рд╣реИ)ред рдЕрдЧрд▓рд╛, рд╣рдо рддреАрд╕рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдХреИрд╢реНрдб рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рднреА, рдлрд┐рд░ рднреА рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рддрд╛ рд╣реИ рдФрд░ рдХреИрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрддрд╛ рд╣реИред рдпрд╣ user3 рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдирдИ рдЖрдИрдбреА рд╣реИред рдЬрд┐рд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 3 рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдирдпрд╛ рдХреИрд╢ рд▓реЗрддрд╛ рд╣реИред
4. рдХреИрд╢ рд╕реЗ рд╣рдЯрд╛рдирд╛ред @CacheEvict
рдХрднреА-рдХрднреА рдХреИрд╢ рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЗрдХрд╛рдИ рдкрд╣рд▓реЗ рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╣рдЯрд╛ рджреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдХреИрд╢ рд╕реЗ рд╕реБрд▓рдн рд╣реИред рдбреЗрдЯрд╛ рд╕реНрдерд┐рд░рддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рд╣рдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВред
@Override public void delete(Long id) { log.info("deleting user by id: {}", id); repository.deleteById(id); } @Override @CacheEvict("users") public void deleteAndEvict(Long id) { log.info("deleting user by id: {}", id); repository.deleteById(id); }
рдкрд╣рд▓рд╛ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛, рджреВрд╕рд░рд╛ рднреА рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ @CacheEvict рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВрдЧреЗред рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рджреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмрдирд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдПрдХ рдХреЛ рдПрдХ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ рдПрдиреЛрдЯреЗрдЯ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд () рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
@Test public void delete() { User user1 = service.create(new User("Vasya", "vasya@mail.ru")); log.info("{}", service.get(user1.getId())); User user2 = service.create(new User("Vasya", "vasya@mail.ru")); log.info("{}", service.get(user2.getId())); service.delete(user1.getId()); service.deleteAndEvict(user2.getId()); log.info("{}", service.get(user1.getId())); log.info("{}", service.get(user2.getId())); }
рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреИрд╢ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдирд┐рд╖реНрдХрд╛рд╕рди рд╣рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреИрд╢ рд╣реИред рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рд▓реЙрдЧреНрд╕ред
getting user by id: 1 User(id=1, name=Vasya, email=vasya@mail.ru) getting user by id: 2 User(id=2, name=Vasya, email=vasya@mail.ru) deleting user by id: 1 deleting user by id: 2 User(id=1, name=Vasya, email=vasya@mail.ru) getting user by id: 2 javax.persistence.EntityNotFoundException: User not found by id 2
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡реЗрджрди рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рджреЛрдиреЛрдВ рдмрд╛рд░ () рд╡рд┐рдзрд┐ рд╕реЗ рдЧрдпрд╛ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдиреЗ рдЗрди рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдХреИрд╢ рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдФрд░ рдХреИрд╢реНрдб рдорд╛рди рдмрдирд╛ рд░рд╣рд╛, рдЗрд╕рд▓рд┐рдП рдЬрдм рд╣рдордиреЗ id 1 рдХреЗ рддрд╣рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рддреЛ рд╣рдо рд╕рдлрд▓ рд╣реБрдПред рдЬрдм рд╣рдордиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 2 рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рддреЛ рд╡рд┐рдзрд┐ рдиреЗ EntityNotFoundException рд▓реМрдЯрд╛ рджреА - рдХреИрд╢ рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╣реАрдВ рдерд╛ред
5. рд╕рдореВрд╣ рдмрдирд╛рдирд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ред @Caching
рдХрднреА-рдХрднреА рдПрдХ рдПрдХрд▓ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХрдИ рдХреИрд╢рд┐рдВрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП @ рдХреЛрдЪрд┐рдВрдЧ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
@Caching( cacheable = { @Cacheable("users"), @Cacheable("contacts") }, put = { @CachePut("tables"), @CachePut("chairs"), @CachePut(value = "meals", key = "#user.email") }, evict = { @CacheEvict(value = "services", key = "#user.name") } ) void cacheExample(User user) { }
рдпрд╣ рд╕рдореВрд╣ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИред рдЕрдЧрд░ рдЖрдк рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдвреЗрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ
@CacheEvict("users") @CacheEvict("meals") @CacheEvict("contacts") @CacheEvict("tables") void cacheExample(User user) { }
рддрдм IDEA рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред
6. рд▓рдЪреАрд▓рд╛ рд╡рд┐рдиреНрдпрд╛рд╕ред CacheManager
рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ рдХреИрд╢ рдирд┐рдХрд╛рд▓рд╛, рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордЭ рд╕реЗ рдкрд░реЗ рдФрд░ рдбрд░рд╛рд╡рдирд╛ рдерд╛ред рдЕрдм рдЪрд▓реЛ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рджреЗрдЦреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдХреИрд╢рд┐рдВрдЧ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ CacheManager рд╣реИред рдпрд╣ рдЬрд╣рд╛рдБ рднреА рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреИрд╢ рд╣реИ рд╡рд╣рд╛рдБ рдореМрдЬреВрдж рд╣реИред рдЬрдм рд╣рдордиреЗ @EnableCache рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рд╛, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреИрд╢ рдореИрдиреЗрдЬрд░ рдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдо ApplicationContext рдХреЛ рдСрдЯреЛ-рд░реИрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдкрд░ рдЦреЛрд▓рддреЗ рд╣реИрдВред рдЕрдиреНрдп рдбрд┐рдмреНрдмреЗ рдореЗрдВ, рдХреИрд╢рдореИрдиреЗрдЬрд░ рдмреАрди рд╣реЛрдЧрд╛ред

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

рд╣рдо, рдмрджрд▓реЗ рдореЗрдВ, рд╣реИрдмрд░ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдХреИрд╢ рдореИрдиреЗрдЬрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@Bean("habrCacheManager") public CacheManager cacheManager() { return null; }
рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рдЪреБрдирдирд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдХреИрд╢ рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВред рдореИрдВ рд╕рднреА рдХреИрд╢ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдпрд╣ рдЬрд╛рдирдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ рдХрд┐ рдРрд╕реЗ рд╣реИрдВ:
- SimpleCacheManager рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХреИрд╢ рдкреНрд░рдмрдВрдзрдХ рд╣реИ, рдЬреЛ рд╕реАрдЦрдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
- ConcurrentMapCacheManager - Lazily рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдХреИрд╢ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╕рд╛рде рд╣реА рд╣рдорд╛рд░реЗ рдЬреИрд╕реЗ рдХреБрдЫ рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреАред рдХреИрд╢ рдХреЗ рд╕рд╛рде рдЧрдВрднреАрд░ рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЧрдИ рд╣реИред
- JCacheCacheManager , EhCacheCacheManager , CaffeineCacheManager рдЧрдВрднреАрд░ "рдкрд╛рд░реНрдЯрдирд░ рдкрд╛рд░реНрдЯрдирд░" рдХреИрд╢ рдореИрдиреЗрдЬрд░ рд╣реИрдВ, рдЬреЛ рд▓рдЪреАрд▓реЗ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред
рдореЗрд░реА рд╡рд┐рдирдореНрд░ рдкреЛрд╕реНрдЯ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдкрд┐рдЫрд▓реЗ рддреАрди рдХреЗ рдХреИрд╢ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЪреБрдЕрд▓ рдХреИрд╢реЗрдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрд╢ рдореИрдиреЗрдЬрд░ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдХрдИ рдкрд╣рд▓реБрдУрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред
рддреЛ, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдХреИрд╢ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдБред
@Bean("habrCacheManager") public CacheManager cacheManager() { return new ConcurrentMapCacheManager(); }
рд╣рдорд╛рд░рд╛ рдХреИрд╢ рдореИрдиреЗрдЬрд░ рддреИрдпрд╛рд░ рд╣реИред
7. рдХреИрд╢ рд╕реЗрдЯрдЕрдкред рдЬреАрд╡рди рд╕рдордп, рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рдФрд░ рдЗрддрдиреЗ рдкрд░ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп Google рдЕрдорд░реВрдж рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рдЖрдЦрд┐рд░реА рд▓рд┐рдпрд╛ред
compile group: 'com.google.guava', name: 'guava', version: '28.1-jre'
рдХреИрд╢ рдореИрдиреЗрдЬрд░ рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдо createConcurrentMapCache рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдорд░реВрдж рд╕реЗ CacheBuilder рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдХреЗ рдХреИрд╢ рдореИрдиреЗрдЬрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛:
- maxSize - рдЙрди рдорд╛рдиреЛрдВ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рдЬреЛ рдХреИрд╢ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЬреЗрд╡реАрдПрдо рд░реИрдо рдкрд░ рд▓реЛрдб рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдордЭреМрддрд╛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- refreshAfterWrite - рдХреИрд╢ рдореЗрдВ рдореВрд▓реНрдп рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛ рд╕рдордп, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
- expireAfterAccess - рдЕрдВрддрд┐рдо рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдореВрд▓реНрдп рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ред
- expireAfterWrite - рдХреИрд╢ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рдореВрд▓реНрдп рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ред рдпрд╣ рд╡рд╣ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред
рдФрд░ рдЕрдиреНрдпред
рд╣рдо рдкреНрд░рдмрдВрдзрдХ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЗрдВрддрдЬрд╛рд░ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 1 рд╕реЗрдХрдВрдб рд╕реЗрдЯ рдХрд░реЗрдВред
@Bean("habrCacheManager") public CacheManager cacheManager() { return new ConcurrentMapCacheManager() { @Override protected Cache createConcurrentMapCache(String name) { return new ConcurrentMapCache( name, CacheBuilder.newBuilder() .expireAfterWrite(1, TimeUnit.SECONDS) .build().asMap(), false); } }; }
рд╣рдо рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВред
@Test public void checkSettings() throws InterruptedException { User user1 = service.createOrReturnCached(new User("Vasya", "vasya@mail.ru")); log.info("{}", service.get(user1.getId())); User user2 = service.createOrReturnCached(new User("Vasya", "vasya@mail.ru")); log.info("{}", service.get(user2.getId())); Thread.sleep(1000L); User user3 = service.createOrReturnCached(new User("Vasya", "vasya@mail.ru")); log.info("{}", service.get(user3.getId())); }
рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╛рди рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдбреЗрдЯрд╛ рдХреИрд╢ рд╣реИ, рддреЛ рд╣рдо рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрдЪрд╛рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рджреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо 1 рд╕реЗрдХрдВрдб рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдХреИрд╢ рдореГрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдПрдХ рдФрд░ рдореВрд▓реНрдп рдмрдЪрд╛рддреЗ рд╣реИрдВред
creating user: User(id=null, name=Vasya, email=vasya@mail.ru) getting user by id: 1 User(id=1, name=Vasya, email=vasya@mail.ru) User(id=1, name=Vasya, email=vasya@mail.ru) creating user: User(id=null, name=Vasya, email=vasya@mail.ru) getting user by id: 2 User(id=2, name=Vasya, email=vasya@mail.ru)
рд▓реЙрдЧ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдпрд╛ рдерд╛, рдлрд┐рд░ рд╣рдордиреЗ рдПрдХ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдбреЗрдЯрд╛ рдХреИрд╢ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕реЗ рдХреИрд╢ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ (рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬрдм рдмрдЪрдд рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд░рд╣рд╛ рд╣реИ)ред рдлрд┐рд░ рдХреИрд╢ рдЦрд░рд╛рдм рд╣реЛ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрдЪрдд рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИред
8. рд╕рдВрдХреНрд╖реЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рд╡рд┐рд╖рдп рдХреЛ рд╕рдордЭрдиреЗ рдФрд░ рдХреИрд╢рд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рд╣рд╕рдкреВрд░реНрд╡рдХ рджреЗрдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЧрд┐рддреНрдмрдо:
https://github.com/promoscow/cache