栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

必须使用@Autowired注解才能注入bean的几种情况

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

必须使用@Autowired注解才能注入bean的几种情况

在开发过程中发现并不是所有的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 RedisTemplate redisTemplate;

使用@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.(ApplicationFilterConfig.java:109)
        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加载的类注入。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/975438.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号