最近一直在做畢業設計...用到了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的啟示以后又去網上搜索了下資料...發現確實是這樣..
資料在這里:
我的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子環境里的)...