记录一次@Autowire和@Resource遇到的坑

        今天在用shiro做缓存清除的时候,碰到个问题是:使用@Autowired注解注入的SessionDao类 初始化是正常的,但是在使用的时候,类里面的AuthorizingRealm 一直为空。 让我自己郁闷了好半天。 按照道理,类初始化时候 交给了spring容器来处理,默认spring使用单例模式,后面是不可能为空的,为什么自己加了断点在初始化时候是好的,但是在使用时候 里面的对象属性就是空的呢?

  时候时候断点属性为空截图:

   记录一次@Autowire和@Resource遇到的坑

 

 

 

,然后同事说 要不在使用RedisSessionDao的注入属性时候使用@Resource(name="初始化的名称")试试  然后这样试了下,竟然是可以的

  记录一次@Autowire和@Resource遇到的坑

 

 记录一次@Autowire和@Resource遇到的坑

 

 

然后赶紧搜了下@Resource和@Autowired 的区别:

  按照自己的理解是这样的:如果只有一个bean,使用@Autowired 时候,bean的名称是 首字母小写后的类名,比如我这个RedisSessionDAO ,如果我在初始化时候的@Bean 名称是 redisSessionDAO ,那么直接使用 @Autowired 是可以生效的;

如果不想这样,@Bean 里面有其他的名称,可以使用下面两种方法:

1.使用@Resource(name="sessionDAO") name里面的名称是@bean后面的名称

2.使用@Autowired 后面使用 @Qualifier("sessionDAO)方式。这样也是可以的

 

然后在自己项目里面验证了下,这几种方式都是可以的

记录一次@Autowire和@Resource遇到的坑

 

上一篇:java – 想法检查batis mapper bean错误


下一篇:java-未封闭的PreparedStatements / ResultSets / Connections的IntelliJ检查