转载:https://blog.csdn.net/zengfanwei1990/article/details/79924483
前言
- 整合有缓存、事务的spring boot项目一切正常。
- 在该项目上整合shiro安全框架,发现部分类的缓存Cache不能正常使用。
- 然后发现该类的注解基本失效,包括事务Transaction注解。事务不能正常运行。
分析
- 注解失效的类,都是在shiro框架中(UserRealm)使用过@Autowire注入的类。
- 基本确定是shiro框架与spring框架的BeanFactory有所冲突,导致注入shiro框架的类不能被spring正确初始化。
参考
stackoverflow网站上的一些文章认为,Shiro框架初始化比Spring框架的某些部件早,导致使用@Autowire注入Shiro框架的某些类不能被Spring正确初始化。
解决方法
- 在Shiro框架中注入Bean时,不使用@Autowire,使用ApplicationContextRegister.getBean()方法,手动注入bean。保证该方法只有在程序完全启动运行时,才被注入。
- 使用@Autowire+@Lazy注解,设置注入到Shiro框架的Bean延时加载(即在第一次使用的时候加载)。
示例
1.Shiro中会出问题的代码
public class MyShiroRealm extends AuthorizingRealm { @Resource private UserInfoService userInfoService; }
2.手动注入bean
public class MyShiroRealm extends AuthorizingRealm { //该代码仅作手动注入bean的说明,前后略有省略代码 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { Long userId = ShiroUtils.getUserId(); //这里手动注入MenuService MenuService menuService = ApplicationContextRegister.getBean(MenuService.class); Set<String> perms = menuService.listPerms(userId); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.setStringPermissions(perms); return info; } } 1
3.延时加载(懒加载)(推荐)
public class MyShiroRealm extends AuthorizingRealm { @Resource @Lazy private UserInfoService userInfoService; }