在开发过程中发现并不是所有的bean注入是@Autowired和@Resource两个注解都可以的,笔者总结了下以下两种情况必须使用@Autowired
情况一:Servlet注入bean
public class MyServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException{
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext());
}
@Autowired
private QuUploadService quUploadService;
}
Servlet无法自动的装载bean,需要重写父类的init()方法,因在init()方法里使用了SpringBeanAutowiringSupport的类,而@Resource注解是jdk自带的无法完成这项任务
情况二:注入RedisTemplate类
@Autowired private RedisTemplateredisTemplate;
使用@Resource也是不可以的,必须使用@Autowired注解完成,否则系统日志会报这样的错误
javax.naming.NameNotFoundException: Name [com.xxx.bbh.filter.ConsoleLoginFilter/baseRedisService] is not bound in this Context. Unable to find [com.xxx.bbh.filter.ConsoleLoginFilter].
at org.apache.naming.NamingContext.lookup(NamingContext.java:816)
at org.apache.naming.NamingContext.lookup(NamingContext.java:173)
at org.apache.catalina.core.DefaultInstanceManager.lookupFieldResource(DefaultInstanceManager.java:588)
at org.apache.catalina.core.DefaultInstanceManager.processAnnotations(DefaultInstanceManager.java:486)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:174)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:166)
at org.apache.catalina.core.ApplicationFilterConfig.
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4538)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5181)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1412)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1402)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
因此说明@Resource注解并不能完成对Spring加载的类进行注入,@Resource默认是按着ByName去注入的,如果想用ByType方式可以换成下面的方式 @Resource(type = com.mytest.bbh.service.common.BaseRedisService.class) 但是上面两种情况使用了Resource的ByType方式注入依然不可以,因此更进一步的证明了Resource注解并不能完成对Spring加载的类注入。



