problema
Quando shiro de cache integrado, encontramos a camada de serviço marcados com método de cache anotada não chama o método de cache
Mas todos os métodos de chamada diretamente entidade, resultando em falha da função de cache
razão
público classe UserRealm estende AuthorizingRealm { @Autowired privada UserService UserService;
primavera, quando registrar feijão, vai primeiro encontrar outro feijão e feijão invocado registro
Assim, no caso acima, o UserRealm registro também a camada de classe de implementação UserService serviço também registrado
Mas este não é o ponto crucial do problema
A chave é perceber de cache anotações @Cacheable sobre o método
Cache componente verifica a este comentário, criar um objeto proxy através dos mecanismos relevantes, AOP pode naturalmente executar operações de cache
O problema é que shiro na criação recipiente fase rigisterBeanPostprocessors processo registrar os componentes relacionados
O UserRealm acima é registrado nos rigisterBeanPostprocessors, tornando classe de implementação UserService é criado automaticamente injetada com antecedência
O cache é apenas componentes relevantes para ser registrado após método finisBeanfactoryInitialization em
Então cache de @Cacheable e outras anotações criado antes da classe de implementação de serviço é menos do que a digitalização
soluções
Derivada da análise acima, Serviço precisa ser criado depois de um registro de componente de cache
Portanto, dar a propriedade de serviço, mais um comentário @Lazy
Use carregamento lento, e Realm ao mesmo tempo para evitar o registro, recadastramento, quando utilizado
Em seguida, armazenar em cache componentes naturais que foram criados, como cache pode identificar corretamente comentário @Cacheable