项目中我遇到同样的问题 特记载一下

有两种方式

一、

该类使用@Component注解

添加一个本类类型的静态字段

创建一个初始化方法,贴上@PostConstruct 标签,用于注入bean

创建方法调用mapper或service接口

最后直接在普通类中调用即可

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。

个人理解就是mapper 装载失败 重点init()方法中转了一次

  1. @Component
  2. public class TestUtil {
  3.  
  4. @Autowired
  5. private DoctorInformationMapper doctorInformationMapper;
  6.  
  7. public static TestUtil testUtil;
  8.  
  9. @PostConstruct
  10. public void init() {
  11. testUtil = this;
  12. testUtil.doctorInformationMapper = this.doctorInformationMapper;
  13. }
  14.  
  15. //调用
  16. public static int getOpenId() {
  17. int count = testUtil.doctorInformationMapper.count("12313");
  18. return count;
  19. }
  20.  
  21. }

二。通过spring 容器去拿

2.1首先打印出Spring容器所有的Bean名称

  1. @Component
  2. public class ApplicationContextBean implements ApplicationContextAware, InitializingBean {
  3.  
  4. public static ApplicationContext applicationContext;
  5.  
  6. /**
  7. * 获取 ApplicationContext
  8. *
  9. * @param applicationContext
  10. * @throws BeansException
  11. */
  12. @Override
  13. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  14. ApplicationContextBean.applicationContext = applicationContext;
  15. }
  16.  
  17. /**
  18. * 打印IOC容器中所有的Bean名称
  19. *
  20. * @throws Exception
  21. */
  22. @Override
  23. public void afterPropertiesSet() throws Exception {
  24. String[] names = applicationContext.getBeanDefinitionNames();
  25. for (String name : names) {
  26. System.out.println(">>>>>>" + name);
  27. }
  28. System.out.println("------\nBean 总计:" + applicationContext.getBeanDefinitionCount());
  29. }
  30.  
  31. }

不用调用测试,项目启动就会在后台打印出来

2.2开始写获取bean工具类

  1. @Component
  2. public class SpringUtil implements ApplicationContextAware {
  3. private static ApplicationContext applicationContext = null;
  4.  
  5. public SpringUtil() {
  6. }
  7.  
  8. public void setApplicationContext(ApplicationContext arg0) throws BeansException {
  9. if (applicationContext == null) {
  10. applicationContext = arg0;
  11. }
  12.  
  13. }
  14.  
  15. public static ApplicationContext getApplicationContext() {
  16. return applicationContext;
  17. }
  18.  
  19. public static void setAppCtx(ApplicationContext webAppCtx) {
  20. if (webAppCtx != null) {
  21. applicationContext = webAppCtx;
  22. }
  23. }
  24.  
  25. /**
  26. * 拿到ApplicationContext对象实例后就可以手动获取Bean的注入实例对象
  27. */
  28. public static <T> T getBean(Class<T> clazz) {
  29. return getApplicationContext().getBean(clazz);
  30. }
  31.  
  32. public static <T> T getBean(String name, Class<T> clazz) throws ClassNotFoundException {
  33. return getApplicationContext().getBean(name, clazz);
  34. }
  35.  
  36. public static final Object getBean(String beanName) {
  37. return getApplicationContext().getBean(beanName);
  38. }
  39.  
  40. public static final Object getBean(String beanName, String className) throws ClassNotFoundException {
  41. Class clz = Class.forName(className);
  42. return getApplicationContext().getBean(beanName, clz.getClass());
  43. }
  44.  
  45. public static boolean containsBean(String name) {
  46. return getApplicationContext().containsBean(name);
  47. }
  48.  
  49. public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
  50. return getApplicationContext().isSingleton(name);
  51. }
  52.  
  53. public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
  54. return getApplicationContext().getType(name);
  55. }
  56.  
  57. public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
  58. return getApplicationContext().getAliases(name);
  59. }
  60.   //测试
  61. public static String getCharId(String chatId) {
  62. ChatListAssociationMapper associationMapper = (ChatListAssociationMapper) SpringUtil.getBean("chatListAssociationMapper");//这个参数是spring容器里存在的,名字最好复制,大小写要一致,不然会失败
  63. return associationMapper.chatId(chatId);
  64. }
  65. }

注意以上的两种方法都不能在main方法调用,会报空指针异常

springboot 项目中在普通类中调用dao层的mapper 出现空指针异常的更多相关文章

  1. SpringBoot 项目在静态工具类中注入 RedisTemplate

    静态属性不能直接注入,可以通过其set方法进行注入.(注意生成的set方法需要去掉static). 在工具类里直接注入RedisTemplate,两种方法: (1)使用@Autowired priva ...

  2. 尚硅谷面试第一季-11MyBatis中当实体类中的属性名和表中的字段名不一样怎么办

    问题: MyBatis中当实体类中的属性名和表中的字段名不一样 ,怎么办 ? 解决方案: 1.写sql语句时起别名 <!-- id属性:必须是接口中方法的方法名 resultType属性:必须是 ...

  3. 实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法

    实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法 #import <Found ...

  4. 转载:C++中两个类中互相包含对方对象的指针问题

    原文链接:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html 前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某 ...

  5. 【记录】mybatis中获取常量类中数据

    部分转载,已注明来源: 1.mybatis中获取常量类中数据 <update id="refuseDebt"> UPDATE dt_debt a SET         ...

  6. cc31a_demo--CppPrimer_静态成员与继承-在派生类中访问基类中的static成员的方法

    //*基类中的static成员,在整个继承层次中只有一个实例 //*在派生类中访问基类中的static成员的方法 //1.基类名::成员名 //2.子类名::成员名 //3.对象.成员名 //4.指针 ...

  7. controller层负责创建类传递类给service;service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性;dao层负责数据的持久化

    controller层负责创建类传递类给service:service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性:dao层负责数据的持久化

  8. Java中的一个类怎么调用另一个类中的方法

    如果另一个类中的那个方法是私有的话,就不能直接调用到,如果是其他类型的话看情况,如果是静态的(static)话,直接用类名可以调用到,如果是非静态的,就需要利用另一个类的实例(也就是用那个类生成的对象 ...

  9. Python中从B类中调用A类的方法。

    好久没上了,Python还在学--最近进度有点慢... 下面代码记录了一个不太好理解的点,自己写了个小例子,总算是理顺了. B类想要调用A类,自己在网上看了一下其他人的回复:创建A类的实例,直接调用这 ...

随机推荐

  1. Java Web开发技术教程入门-Model1和Model2

    今天我们聊聊JSP开发中的Model1和Model2. Model1采用了JSP+JavaBean技术开发Web应用.其中,JSP实现页面显示,业务逻辑和流程控制,数据处理由JavaBean完成.在J ...

  2. windows系统下nginx+tomcat+redis做负载均衡和session粘滞附整套解决方案

    Nginx: 在nginx-1.8.0\conf目录下找到nginx.conf文件,打开文件修改文件中http{}中的内容,在http{}中加入 upstream localhost  { serve ...

  3. sql server update语句

    update语句 --Update 语句用于修改表中的数据 语法:update 表名称 set 列名称 = 新值 where 列名称 = 某值 --更新某一行的若干列,set字句中用','隔开

  4. Date对象中的方法

    特殊说明:设置时间的方法,虽然W3C说明传参的范围,在开发过程中,传入的参数不在该范围也是可以的.例如: var t = new Date(), d = t.getDate(); //当天时间往前推2 ...

  5. Django框架——基础之视图系统(View.py)

    Django框架之View.py(视图文件) 1. 视图简介 视图层是Django处理请求的核心代码层,我们大多数Python代码都集中在这一层面. 它对外接收用户请求,对内调度模型层和模版层,统合数 ...

  6. Clang编译选项和Pass构建

    编译选项相关: 想要添加的选项,以我添加的-fdpu为例子 能通过clang --help得到的选项,整体需要一个解析文件(好像在LLVM项目中都是通过后缀名为xxx.td和xxx.def的文件来进行 ...

  7. echarts图表自适应盒子的大小(盒子的大小是动态改变的),大到需要全屏展示

    项目中用到了echarts,并且页面是自适应的,且页面中有一个[放大.缩小]功能,因此图表还需要根据盒子的大小来变化. 即:两个需求,如下: ① 图表根据窗口的大小自适应 ② 图表根据所在盒子的大小自 ...

  8. 从FBV到CBV四(访问频率限制)

    比如我们有一个用户大转盘抽奖的功能,需要规定用户在一个小时内只能抽奖3次,那此时对接口的访问频率限制就显得尤为重要 其实在restframework中已经为我们提供了频率限制的组件 先捋一下请求到AP ...

  9. poj3522 苗条树(极差最小生成树)

    给你N个点和M条边 要求你求出一个生成树使得这个生成树里边权极差最小 做法① n*m做法 当最小的边已知的时候这个生成树就确定 所以最大的边也确定了 于是我们每次枚举最小的边 然后用kruskal做一 ...

  10. pmf文件

    1.首先是视频软件,其次还是DISKGENI(磁盘分区软件),当作镜像文件恢复文件到磁盘(类似ISO).2.PMF文件为主要与primarily Pegasus Mail Message Attach ...