需求是在使用SpringSecurity框架在进行用户认证时,需要实现Spring框架的接口UserDetailsService,在这里涉及两个问题
问题一:UserDetailsService的实现类如何实例化,是实例化到SpringMVC子容器中还是实例化到Spring父容器中
解决:这个接口的实现类最终要给SpringSecurity框架使用,SpringSecurity最终是要被实例化进Spring这个父容器中的,所以UserDetailService的实现类也必须要实例化进Spring父容器中,但是SpringMVC框架中的类都是由DisPatcherServlet前端控制器调用SpringMVC.xml扫描最终被实例化进SpringMVC这个Spring容器的自容器中,父容器是无法使用子容器中的类的,所以需要在SpringSecurity.xml中通过
问题二:UserDetailsService的实现类需要远程调用Service层的对象进行数据库查询
解决:UserDetailsService的实现类需要使用Service层的对象,同样的道理,这个对象再SpringMVC子容器中通过注解的方式远程调用可以使用,但是在父容器中不能使用子容器中的对象,所以还需要在springMVC.xml这个父容器中再去Dubbo中单独获取我想要Service层的某个实现类,获取到实现类之后,再在之前定义的
这样就出现了子容器在SpringMVC.xml中配置Dubbo向注册中心进行消费,父容器中的SpringSecurity.xml中也配置Dubbo向注册中心进行单独的消费,两个Dubbo配置之后在启动项目的时候就会出现如下问题:
java.lang.IllegalStateException: Duplicate application configs:
在经过漫长的比对和测试之后找到了问题的所在:两个Dubbo的
SpringSecurity.xml中引入的Dubbo配置:
SpringMVC.xml中引入的Dubbo配置:
总结:这两个配置文件的name属性必须一致