您的位置:首页 > 编程语言 > Java开发

使用Spring和SpringMVC管理bean时要注意的一个小细节

2015-06-09 23:29 197 查看
  最近一直在做毕业设计...用到了Shiro和SpringMVC..用过shiro的朋友都知道shiro需要自己去写Realm,然后把Realm注入到SecurityManager中.而SecurityManager是shiro自带的类..我不可能去修改源码,增加注解,所以配置这个Realm bean的时候使用的是XML的配置方式..而又因为整个项目使用到了SpringMVC,我自己写的类基本都是用注解去配置的..然后就有了这么一个问题...我的问题与配置和http://www.oschina.net/question/238156_142131这篇文章基本一样.

  简单来说就是我在shiro.xml里配置了一个Realm bean,然后要在Realm类里注入注解配置的XXXDao..

  shiro.xml通过Spring的ContextLoaderListener来加载.

  我一开始在shiro.xml里的写法是

<bean id="mySQLRealm" class="jiang.app.realm.MySQLRealm"/>

  然后再这个Realm里

public class MySQLRealm extends AuthorizingRealm {
private static Logger logger = Logger.getLogger(AuthorizingRealm.class);

@Resource
RoleDao roleDao;
@Resource
UserDao userDao;

.........
}

  结果是我得到的Realm里面注入的XXXDao都是null...

  然后我网上搜索了下...但是感觉都不太靠谱...然后去CSDN上请教了下大神们

  http://bbs.csdn.net/topics/391014289

  得到2L的启示以后又去网上搜索了下资料...发现确实是这样..

  资料在这里:

http://www.dewen.io/q/16682/spring%20mvc%E7%9A%84%E7%88%B6%E5%AD%90%E4%B8%8A%E4%B8%8B%E6%96%87(WebApplicationContext)%E7%9A%84%E4%BD%9C%E7%94%A8%E8%8C%83%E5%9B%B4%EF%BC%8C%E5%8C%BA%E5%88%AB%E3%80%81%E5%BD%B1%E5%93%8D%E9%9D%A2%E6%8F%90%E7%8E%B0%E5%9C%A8%E5%93%AA%E9%87%8C%EF%BC%9F

  我的XXXDao配置在了SpringMVC的配置里(mvc-dispatcher-servlet.xml)..而SpringMVC是子上下文环境(通过servlet来配置,指定配置文件位置)..shiro是在父上下文环境里配置的(通过ContextLoaderListener来加载)..所以读取不到SpringMVC里配置的bean....

  知道问题以后解决方案就明晰了..将XXXDao配置到父环境里就OK了..

  比如:

web.xml里

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring.xml
classpath:spring-hibernate.xml,
classpath:shiro.xml
</param-value>
</context-param>

shiro.xml里就原样配置..

spring.xml里配置

<context:component-scan base-package="jiang" />

这样注解读取的bean也就在父环境里了(我原来component-scan是配置在mvc-dispatcher-servlet.xml子环境里的)...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: