1.问题描述

我们平时使用@Autowired注入对象时,一般被注入的类都带有@Coponent、@Controller、@Service 、@repository等注解才可以。注入类和被注入类都被spring所管理,可以完成调用。但是当非容器类(没加以上注解时)使用@Autowired调用容器中的类时,注入对象为空,报空指针异常
HelloService为加入容器中的类

BeanUtil为未加入容器的类,调用HelloService会报空指针异常

2.问题解决

创建工具类BeanUtils,在这个工具类中的getBean可以得到容器中的类,在非容器类中使用

@Component
public class BeanUtils implements ApplicationContextAware {/*** 以静态变量保存ApplicationContext,可在任意代码中取出ApplicaitonContext.*/private static ApplicationContext context;/*** 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量.*/@Overridepublic void setApplicationContext(ApplicationContext context) {BeanUtils.context = context;}public static ApplicationContext getApplicationContext() {return context;}/*** 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.  方法返回值的类型由调用者决定*/public static <T> T getBean(String name) {return (T) context.getBean(name);}/// 获取当前环境public String getActiveProfile() {return context.getEnvironment().getActiveProfiles()[0];}
}

非容器类中使用容器中的类

public class StationFactory {Map<String, StationOperation> map = new HashMap<>();{map.put("定损中心主管指标表",  BeanUtils.getBean("leadDSZXOperation"));map.put("定损中心员工指标表",  BeanUtils.getBean("empDSZXOperation"));map.put("视频查勘中心主管指标表",BeanUtils.getBean("leadVideoSurveyCenterOperation"));map.put("视频查勘中心员工指标表",BeanUtils.getBean("empVideoSurveyCenterOperation"));map.put("视频定损中心主管指标表",BeanUtils.getBean("leadVideoDSCenterOperation"));}
}

3.@Autowired注意事项

1、使用@Autowired的当前类也必须由spring容器托管(打@Coponent、@Controller、@Service 、@repository)

2、不管是public 和 private 修饰的字段都可以自动注入

3、默认情况下,使用@Autowired注解的属性一定要被装配,如果在容器中找不到该类型的bean注入,就会报错。如果允许不被装配就可以将@Autowired的required属性为false

4、@Autowired 是基于类型的注入,如果当前类型属性在容器中只有一个Bean, 那么属性名不限制,但一般建议遵循类名首字母小写的规则‘

5、如果当前属性类型在容器中有个多个Bean,那么必须要通过属性名 或者 @Qualifier 指定Bean name

spring@Autowired的对象为null,非容器中的类如何调用容器中的类相关推荐

  1. php 容器对象,Laravel 6.2 中添加了可调用容器对象的方法

    Laravel小组上周发布了v6.2.0 ,其中包含 针对已登录用户的新的密码确认流程以及可调用的容器对象.现在,让我们去了解一些尚未发布的一些其他新功能,在发行说明中表示已经可以使用: 首先,Con ...

  2. Spring Autowired 注入失败总是Null

    报错:NullPointerException 分析:错误原因是注入失败? <context:annotation-config/> <context:component-scan ...

  3. 手写简易版Spring框架(七):定义标记类型接口Aware,实现感知容器相关的信息

    文末有惊喜 目标 目前已实现的 Spring 框架,在 Bean 操作上能提供出的能力,包括:Bean 对象的定义和注册,以及在操作 Bean 对象过程中执行的,BeanFactoryPostProc ...

  4. Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法

    Spring 事务机制回顾 Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务.  结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷.    ...

  5. Spring @Autowired 注入为 null

    原因 配置缺失,比如为开启注解扫描驱动.注入组件为注册: 使用 new 关键字创建的对象不受spring容器管理,无法注入: 注入静态变量, 静态变量/类变量不是对象的属性,而是一个类的属性,spri ...

  6. Spring @Autowired NPE:Why @Autowired Bean is null? private 修饰符!

    问题描述:Controller方法误写成了private而导致500错误的问题. 找原因,找了大半天, 也翻了Spring MVC的源码...终于,灵机一动,看到了 private : 原因分析 当某 ...

  7. spring autowired idea都匹配上了_你清楚这几个Spring常用注解吗?

    作者:平凡希http://cnblogs.com/xiaoxi/p/5935009.html 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 如 ...

  8. Spring学习总结(28)——Spring获取request对象的几种方法及线程安全性总结

    分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程 前言 在使用Spring MVC开发Web系统时,经常需要在处理请求时使用reque ...

  9. 一次SpringBoot AutoWired 注入服务为null的事件

    问题表述: java.lang.NullPointerExceptionat com.ynd.back.socket.WebSocket.onMessage(WebSocket.java:113)at ...

最新文章

  1. Linux系统文本命令快速登录与退出
  2. python pandas dataframe 列 转换为离散值
  3. CSS3之伪元素选择器和伪类选择器
  4. AngularJS——第3章 指令
  5. Deep Learning(深度学习)学习笔记整理系列之(六)
  6. 解引用NULL为什么会导致程序挂死?
  7. nginx的目录结构和配置文件
  8. Linux下的iscsi(设备的共享服务)
  9. 怎么才能取消和实现XP/windows 7自动登陆
  10. mysql查询一张表中一共有多少条数据
  11. python模拟抛硬币_认识概率,用python模拟掷硬币
  12. UMail轻松搭建linux邮件服务器(一体盘安装)
  13. 用JavaScript实现元素自动旋转功能
  14. 真的不明白,怎么会这样!
  15. Canopen协议 (1):网络状态管理(NMT)
  16. 【STM32 .Net MF开发板学习-02】GPIO测试
  17. 看网页视频如何自定义倍速(b站举例)
  18. 一次光纤线路故障导致的光纤猫信号灯异常用户无法上网的故障解决过程
  19. 计算机主机箱内的主要硬件有,电脑的基本硬件包括哪些
  20. I.MX RT1176笔记(6)-- M4核调试参数异常问题

热门文章

  1. python父亲节礼物_父亲节程序员硬核示爱:你能看懂几条
  2. 谷歌浏览器安卓版_谷歌Chrome Canary 82安卓版现可复制图片到剪贴板
  3. C# 获取枚举的DescriptionAttribute内的字符串
  4. 十分钟轻松搞懂CSS的五大定位方式!(建议收藏)
  5. plsql存储过程修改后怎么保存_分布式基础-存储引擎
  6. 好玩Python--分析你的微信好友签名
  7. 项目中记录影响性能的缓慢数据库查询
  8. Android--JNI编程详解
  9. php中curl的详细解说 【转载】
  10. RestTemplate.getForObject返回List的时候处理方式