El mecanismo de almacenamiento en caché de Spring es muy flexible y puede almacenar en caché cualquier método de frijoles o frijoles en el contenedor. Por lo tanto, este mecanismo de almacenamiento en caché se puede almacenar en caché en cualquier nivel de aplicación Javaee.
La capa subyacente de caché de primavera también debe implementarse con la ayuda de otras herramientas de caché, como Ehcache (herramienta de caché Hibernate), y la capa superior utiliza una programación API unificada.
Para usar la memoria caché de primavera, se requieren los siguientes tres pasos
Por ejemplo
<? xml versión = "1.0" encoding = "utf-8"?> <ehcache> <diskstore path = "java.io.tmpdir" /> <!-Configure el caché predeterminado-> <Defaultcache maxelementsInMemory = "10000" eternal = "falso" Timetoidleseconds = "120" TimetoleConds maxelementSondisk = "10000000" DiskExpiryThreadIntervalSeconds = "120" MemoryStoreEvictionPolicy = "Lru"/> <!-Configure el caché llamado usuarios-> <cache name = "usuarios" maxelementsInmemory = "10000" eternal = "false" overflowTodisk = "verdadero" TIMETOIDLESECONDS = "300" 300 "300" 300 "300" TIMETOLIVECONDS = "600" /> < /ehcache>
El anterior ehcache.xml configura dos áreas de caché. Los frijoles en primavera se almacenarán en caché en estas áreas de caché. En general, cuántos frijoles hay en el contenedor de primavera se definirán en Ehcache.
Luego, configure el Administrador de caché en el archivo de configuración de Spring de la siguiente manera, donde el primer bean es una frijol de fábrica utilizada para configurar el Cachemanager de Ehcache, y el segundo bean es el Administrador de caché configurado para el caché de Spring, por lo que el primer bean se inyecta en el segundo frijol.
<cache: annotation-dirigir cache-ganager = "Cachemanager" /> <!-Configurar ehcache cachemanager para especificar la ubicación del archivo ehcache.xml a través de configlocation-> <bean id = "ehcachemanager" Ehcache Cachemanager en el Bean de Administrador de caché-> <bean id = "Cachemanager" P: Cachemanager-REF = "Ehcachemanager"> </bean>
Aquí hay una configuración de resorte completa.
<? xml versión = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" "" "" xmlns: p = "http://www.springframework.org/schema/p" xmlns: cache = "http://www.springframework.org/schema/cache" xmlns: context = "http://www.springframework.org/schem xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schem http://www.springframework.org/schema/cache/spring-cache-4.0.xsd http://www.springframework.org/schema/context http://www.springingwork.org/schema/context/spring-context-4.0.xsd " <context: component-scan base-package = "com.service" /> <cache: annotation-driven cache-ganager = "cachemanager" /> <!-configure ehcache cachemanager especifica la ubicación del archivo ehcache.xml a través de configlocation-> <bean id = "ehcachemanager" P: configLation = "classpath: ehcache.xmll" p: compartido = "falso"/> <!-Configure el administrador de caché basado en Ehcache e inyecte el Cachemanager de Ehcache en el bean de cache manager-> <bean id = "cachemanager" P: Cachemanager-ref = "ehcachemanager"> </beans>
Lo siguiente usará @Cacheable como ejemplo para demostrar el uso de Spring en función de Ehcache Cache. Cacheable se usa para modificar clases o métodos. Si la clase se modifica, todos los métodos de la clase se almacenarán en caché.
Caché a nivel de clase
Por ejemplo, están las siguientes clases de frijoles,
@Service ("UserService") @Cacheable (value = "Usuarios") Public Class UserServiceImpl implementa UserService {@Override Public User GetUsersByNneanDage (String Name, Int Age) {System.Println ("Ejecutando getUsersByNameAnDage () .."); devolver nuevo usuario (nombre, edad); } @Override Public User getAnotherUser (name de cadena, int age) {system.out.println ("ejecutando getAnotherUser () .."); devolver nuevo usuario (nombre, edad); }}El caché basado en la clase almacenará en caché todos los métodos de la clase. Después del caché, el programa llama a cualquier método de la instancia de esta clase. Siempre que los parámetros pasados sean los mismos, Spring no ejecutará el método, ¡pero buscará directamente los datos en caché en función de los parámetros aprobados!
Por ejemplo, use datos en caché como a continuación.
public static void test2 () {ApplicationContext ctx = new ClassPathXMLApPlicationContext ("Beanss.xml"); UserService US = CTX.GetBean ("UserService", UserService.class); Usuario U1 = US.GetusersByNneanDage ("Zhang San", 50); // Debido a que el mismo parámetro se usa cuando el método UserService se llama por segunda vez, el método real no se ejecutará, // Spring buscará directamente los datos por parámetros del usuario de caché U2 = US.GetAnotherUser ("Zhang San", 50); System.out.println (u1 == u2); }Resultado de salida,
GetUsersByNneanDage () está siendo ejecutado.
verdadero
Como puede ver, el GetAnotherUser () anterior () no se ejecuta realmente porque los parámetros pasados son los mismos que los parámetros pasados por el método anterior, por lo que Spring proviene directamente de los datos del área de caché.
Además del valor de atributo requerido, la anotación @Cacheable en la clase de frijoles anterior también tiene clave, condición y a menos que los atributos. Los últimos tres se utilizan para establecer políticas de almacenamiento de primavera. Para los cachés basados en clase, Spring usa los parámetros pasados en el método como clave para buscar resultados en el caché de forma predeterminada.
Por supuesto, también podemos modificar la estrategia de la clave y dejar que Spring siga otros estándares, como si el primer parámetro es el mismo que la clave, y buscar los resultados en el caché.
Modifique la clase de frijol anterior de la siguiente manera,
@Service ("UserService") @Cacheable (valor = "usuarios", key = "#name") Public Class UserServiceImpl implementa UserService {@Override Public User GetUsersByNneanDage (String Name, Int Age) {Lo que significa que pasamos con el mismo nombre, Spring realmente no ejecutará el método. Solo cuando el nombre sea diferente se ejecutará el método, por ejemplo,
public static void test2 () {ApplicationContext ctx = new ClassPathXMLApPlicationContext ("Beanss.xml"); UserService US = CTX.GetBean ("UserService", UserService.class); Usuario U1 = US.GetusersByNneanDage ("Zhang San", 50); // Después de cambiar el parámetro clave de @Cachable a Key = "#Nombre", el siguiente método podrá ejecutarse. Usuario u2 = us.getAnotheruser ("li si", 50); System.out.println (u1 == u2); } Puede ver que esta vez se ha ejecutado getAnotherUser() .
1 GetUsersByNneanDage () está siendo ejecutado.
2 GetAnotherUser () se está ejecutando.
3 falsos
También podemos establecer la propiedad de condición, por ejemplo,
@Service ("UserService") @Cacheable (valor = "usuarios", condición = "#edad <100") Public Class UserServiceImpl implementa UserService {@Override Public User GetUsersByNameAnDage (String Name, Int Age) {Entonces, para el siguiente código, ninguno de los métodos se almacenará en caché. Spring ejecuta el método real para obtener el resultado cada vez.
public static void test2 () {ApplicationContext ctx = new ClassPathXMLApPlicationContext ("Beanss.xml"); UserService US = CTX.GetBean ("UserService", UserService.class); Usuario U1 = US.GetusersByNneanDage ("Zhang San", 500); Usuario u2 = us.getAnotheruser ("li si", 500); System.out.println (u1 == u2); }Resultados de ejecución,
GetUsersByNneanDage () está siendo ejecutado.
GetAnotherUser () está siendo ejecutado.
FALSO
El caché de nivel de método solo funcionará para el método. Los diferentes métodos pueden establecer áreas de caché innecesarias, como las siguientes,
@Service ("UserService") Public Class UserServiceImpl implementa UserService {@Cachable ("Users1") @Override Public User GetUsersByNneanDage (Nombre de cadena, int Age) {System.out.Println ("Ejecution GetUsersByNneanDage ()); devolver nuevo usuario (nombre, edad); } @Cachable ("Users2") @Override Public User getAnotherUser (name de cadena, int a age) {system.out.println ("getAnotherUser () .."); devolver nuevo usuario (nombre, edad); }}Use el siguiente código de prueba,
public static void test2 () {ApplicationContext ctx = new ClassPathXMLApPlicationContext ("Beanss.xml"); UserService US = CTX.GetBean ("UserService", UserService.class); // La primera vez que se ejecuta el método, el método se ejecutará y almacenará en caché el usuario u1 = us.getusersbyNneanDage ("Zhang San", 500); // Aunque el siguiente método pasa los mismos parámetros, debido a que estos dos métodos se encuentran en diferentes áreas de caché, los datos de caché no se pueden usar. Usuario u2 = us.getAnotheruser ("Zhang San", 500); System.out.println (u1 == u2); // Lo anterior ha sido almacenado en caché, y no se ejecutará aquí. Use caché directamente. Usuario u3 = us.getAnotheruser ("Zhang San", 500); System.out.println (u3 == u2); }Resultados de ejecución,
GetUsersByNneanDage () está siendo ejecutado.
GetAnotherUser () está siendo ejecutado.
FALSO
verdadero
El método modificado por @CacheEvict se puede usar para borrar el caché, y las siguientes propiedades se pueden especificar usando @CacheEvict .
Allentries, ya sea para borrar todo el área de caché
antes de la invocación: si se debe borrar el caché antes de ejecutar el método. El valor predeterminado es borrarlo solo después de que el método se ejecute correctamente.
condición y clave, el mismo significado que en @Cacheable .
La siguiente demostración es simple.
@Service ("UserService")@Cacheable ("Usuarios") Public Class UserServiceImpl implementa UserService {@Override Public User GetUsersByNneanDage (String Name, Int Age) {System.out.println ("Ejecución de getUsersByNameanDage () .."); return New User (Name, Age);}@Overide User User (String Name, INTA) {System.out.println ("ejecutar getAnotherUser () .."); return New User (Name, Age);} // Especifique Clare Cache según el nombre y los parámetros de edad @CacheEvict (valor = "Usuarios") public void Evictuser (String Name, int Age) {System.out.println ("-Limpiar el Cache Cache de"+Nombre+","+");"); " Boreo todos los datos en caché en el área de caché de usuario @CacheEvict (value = "usuarios", AllEnentries = true) public void Evictall () {System.out.println ("-Borrar todo el caché--");}}A continuación se muestra la clase de prueba,
public static void test2 () {ApplicationContext ctx = new ClassPathXMLApPlicationContext ("Beanss.xml"); UserService US = CTX.GetBean ("UserService", UserService.class); // El sistema almacenará en caché dos métodos usuarios U1 = us.getusersbyNneanDage ("Zhang San", 500); Usuario u2 = us.getAnotheruser ("li si", 400); // Llame al método SALVICTUSER () para borrar los datos especificados en el búfer US.Evictuser ("Li Si", 400); // Clear Li Si, 400 antes de que los datos devueltos por el siguiente método se almacenen en caché nuevamente el usuario u3 = us.getAnotherUser ("li si", 400); System.out.println (US == U3); // falsos // Los datos de Zhang SAN y 500 se han almacenado en caché antes, y el siguiente método no se volverá a examinar, y los datos en el caché se recuperarán directamente U4 = us.getAnotheruser ("Zhang San", 500); System.out.println (u1 == u4); // Salida True // Borrar todo el caché us.evictall (); // Debido a que todo el caché se ha bordeado, el siguiente código volverá a ejecutar el usuario u5 = us.getAnotheruser ("Zhang San", 500); Usuario u6 = us.getAnotheruser ("li si", 400); System.out.println (u1 == u5); // emitir falso sistema.out.println (u3 == u6); // Salida Falso}Resultados de ejecución,
GetUsersByNneanDage () está siendo ejecutado.
GetAnotherUser () está siendo ejecutado.
-aclarando el caché correspondiente a li si, 400-
GetAnotherUser () está siendo ejecutado.
FALSO
verdadero
-aclarando todo el caché-
GetAnotherUser () está siendo ejecutado.
GetAnotherUser () está siendo ejecutado.
FALSO
FALSO
Lo anterior se trata del código de ejemplo del mecanismo de almacenamiento en caché de primavera en este artículo, espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!