使用Spring和SpringMVC管理bean時要注意的一個小細節


  最近一直在做畢業設計...用到了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子環境里的)...






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM