
SpringBoot与Shiro整合时MyRealm中@Autowired注入Service失败的问题
5星
- 浏览量: 0
- 大小:None
- 文件类型:PDF
简介:
本文介绍了在使用Spring Boot和Shiro框架进行项目开发过程中遇到的一个常见问题,即自定义的MyRealm类中通过@Autowired注解注入业务层Service对象时常出现失败的情况。文中详细分析了这一问题的原因,并提供了有效的解决方案,帮助开发者解决相关困扰。
在Spring Boot应用中集成Apache Shiro进行权限管理时,可能会遇到在自定义的`MyRealm`类中使用`@Autowired`注解无法成功注入Service的问题。这个问题通常涉及到Spring的依赖注入机制以及Shiro的初始化顺序。
当我们在`MyRealm`类中声明一个字段并使用`@Autowired`注解时,Spring会尝试查找类型匹配的Bean并将其注入。然而,在某些情况下,由于Spring的加载顺序问题,`MyRealm`可能在Service被实例化之前就已经被创建,导致无法通过`@Autowired`正常工作。
通常,Shiro的初始化过程是在Spring容器启动后进行的。但是如果我们直接使用`new`关键字创建`MyRealm`实例,则这个实例就会独立于Spring容器之外运行,自然也就不能利用依赖注入机制来获取Service了。为了解决这个问题,我们需要确保让Spring管理`MyRealm`作为Bean,并且在服务初始化之后再创建它。
正确的做法是在配置类中使用`@Bean`注解声明`MyRealm`实例:
```java
@Configuration
public class ShiroConfiguration {
@Autowired
private MyService myService;
@Bean(name = myRealm)
public MyRealm myAuthRealm() {
MyRealm myRealm = new MyRealm();
myRealm.setMyService(myService);
return myRealm;
}
@Bean(name = securityManager)
public SecurityManager securityManager(@Qualifier(myRealm) MyRealm myRealm) {
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(myRealm);
return manager;
}
}
```
在这个例子中,`ShiroConfiguration`配置类通过使用`@Bean`注解来声明和管理`MyAuthRealm`实例。这确保了在服务初始化之后再创建并注入相应的依赖。
此外,在编写自定义的realm时,请务必为所有需要注入的服务提供setter方法以便Spring容器能够正确地设置这些属性值。
总结来说,当使用Spring Boot集成Shiro,并且遇到无法通过`@Autowired`注解成功注入Service的问题时,检查是否将Realm类声明为了一个由Spring管理的Bean是关键。此外,请确保所有的依赖项也都是被Spring管理的Bean,这样才能保证正确地利用依赖注入机制解决问题并提高代码的质量和灵活性。
全部评论 (0)


