今天在用shiro做缓存清除的时候,碰到个问题是:使用@Autowired注解注入的SessionDao类 初始化是正常的,但是在使用的时候,类里面的AuthorizingRealm 一直为空。 让我自己郁闷了好半天。 按照道理,类初始化时候 交给了spring容器来处理,默认spring使用单例模式,后面是不可能为空的,为什么自己加了断点在初始化时候是好的,但是在使用时候 里面的对象属性就是空的呢?
时候时候断点属性为空截图:
,然后同事说 要不在使用RedisSessionDao的注入属性时候使用@Resource(name="初始化的名称")试试 然后这样试了下,竟然是可以的
然后赶紧搜了下@Resource和@Autowired 的区别:
按照自己的理解是这样的:如果只有一个bean,使用@Autowired 时候,bean的名称是 首字母小写后的类名,比如我这个RedisSessionDAO ,如果我在初始化时候的@Bean 名称是 redisSessionDAO ,那么直接使用 @Autowired 是可以生效的;
如果不想这样,@Bean 里面有其他的名称,可以使用下面两种方法:
1.使用@Resource(name="sessionDAO") name里面的名称是@bean后面的名称
2.使用@Autowired 后面使用 @Qualifier("sessionDAO)方式。这样也是可以的
然后在自己项目里面验证了下,这几种方式都是可以的