problema
Cuando se integra shiro caché, encontramos la capa de servicio marcada con el método anotado caché no llama al método de caché
Pero cada llamada a métodos directamente entidad, lo que resulta en un fracaso de la función de caché
razón
público de clase UserRealm extiende AuthorizingRealm { @Autowired privada UserService UserService;
primavera al registrarse frijol, en primer lugar se encuentran otras frijol y haba se basó en el registro
Así que en el caso anterior, el registro también UserRealm la capa de clase de implementación UserService servicio también registrado
Pero este no es el quid de la cuestión
La clave es darse cuenta de caché anotaciones @Cacheable en el método
Caché exploraciones componentes a este comentario, crear un objeto proxy a través de los mecanismos correspondientes, AOP puede realizar de forma natural las operaciones de almacenamiento en caché
El problema es que shiro en el proceso rigisterBeanPostprocessors etapa de creación de contenedores registra los componentes relacionados
El UserRealm anterior se ha registrado en los rigisterBeanPostprocessors, haciendo clase de implementación UserService se inyecta automáticamente creados de antemano
La memoria caché se únicos componentes relevantes para ser registrado después de método en finisBeanfactoryInitialization
Así caché @Cacheable y otras anotaciones creado antes de la clase de implementación de servicio es inferior a la exploración
soluciones
Derivado del análisis anterior, el servicio necesita ser creado después de un registro de componentes caché
Así que dar a la propiedad de servicio más un comentario @Lazy
Utilice la carga diferida, y reino al mismo tiempo para evitar la inscripción, reinscripción cuando se usa
A continuación, almacenar en caché los componentes naturales que se han creado, como el caché puede identificar correctamente comentario @Cacheable