使用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子环境里的)...





posted @ 2015-06-09 23:29  abcwt112  阅读(3119)  评论(0编辑  收藏  举报