使用main方法启动spring程序

使用main方法启动spring程序


在 spring 框架中,由于对象都交给了 IoC 容器进行管理,那么直接在 main 方法中创建 service 层对象,就会出现空指针异常(NPE)
正确的方式是从 IoC 的容器中取出对象,再使用对象中的方法或者属性就可以了

核心代码

public static void main(String[] args) {// applicationContext.xml 为 spring 配置文件名ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// userService 为 IOC 容器中的对象名UserService userService = (UserService) context.getBean("userServiceImpl");// 使用 userService 对象调用方法userService.save(new User(1,"小明"));
}

====================================================

原因分析:

如果使用普通方式创建对象,代码及运行结果如下:
在这里插入图片描述
通过控制台打印结果可以看出问题代码出现在 UserServiceImpl.save() 方法在 UserServiceImpl 类的第 22 行,进入 UserServiceImpl 类,代码如下:
在这里插入图片描述
通过 Debug 追踪,可以看出 userDao 对象为空。因为 UserDao 是通过 spring 的 IoC 进行对象管理,并且在测试类创建 service 对象时,并未加载 spring 相关配置,所以 userService 对象中的 userDao 属性并未被注入值,故而在调用 userDao 的 save 方法时出现空指针异常

====================================================

正确示例

稍微细心一点就能发现这是自己想法的逻辑错误,既然用了 spring 的自动注入(前提是有多层依赖),那么就不应该再去手动创建对象。选择手动创建对象就不应该使用 spring 的依赖注入。

public static void main(String[] args) {// applicationContext.xml 为 spring 配置文件名ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// userService 为 IOC 容器中的对象名UserService userService = (UserService) context.getBean("userServiceImpl");// 使用 userService 对象调用方法userService.save(new User(1,"小明"));
}

通过追踪源码发现 context.getBean() 方法最终来源于 BeanFactory 接口,并且 getBean() 方法有多种重载形式,如下:
在这里插入图片描述
那么获取 IOC 容器中对象的方式就有多种,如下:

1.对象名获取,返回的是 Object 类型,需要强转

  • UserService userService = (UserService) context.getBean(“userServiceImpl”);

2.class获取,返回class对应的对象,不需要强转

  • UserService userService = context.getBean(UserServiceImpl.class);

3.对象名和class获取指定对象不需要强转

  • UserService userService = context.getBean(“userServiceImpl”,UserServiceImpl.class);

4.其它略,可根据需要使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/256682.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解Java的main方法

一、简单介绍 在我们的Java程序中都会出现一个名称为main的方法,我们发现没有这个方法我们的程序就无法运行。 其实任何一个Java程序的运行入口都是这个main方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法&#…

SpringBoot项目main方法详解

前言 SpringBoot项目启动时通过执行main方法启动,main方法主要做了两方面工作: 初始化Spring容器启动tomcat运行项目 下面我们通过源码来看如何进行的上面两个操作。 源码分析 我们以debug的方式进行源码的分析。main方法中,我们调用了SpringApplic…

main方法和单元测试方法

1、编写代码可使用快捷键 输入main然后点击回车;输入sout然后点击回车。 输入想要输出的内容然后运行代码即可 2、java严格区分大小写 main方法也叫主函数,在一个类中只有一个main方法。 java中每一条语句都是以分号为结束标志。 3、单元测试方法 …

Java中的main方法

一、概念 main方法是java程序的入口,每个java应用程序都必须有且仅有一个main方法。 二、深入理解 public static void main(String[] args) {} main方法是被java虚拟机调用的。java虚拟机不在该类中,也不在该类的包中,也不是该类的子类。…

java中main方法的作用是什么_java中main方法是什么

Java中的main方法,是一个java应用程序的入口,无论一个java的应用多么复杂庞大,或是多么的小,只要他是一个可以运行的java程序那么必然就要有一个main方法。 main方法的定义格式通常固定如下: (推荐学习:java课程)public class Demo {public static void main(String[] ar…

Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法

public static void main(String[] args) {}或者 public static void main(String args[]) {}main方法是我们学习Java语言学习的第一个方法,也是每个java使用者最熟悉的方法,每个Java应用程序都必须有且仅有一个main方法。在eclipse里可以使用输入main,…

“大厂的人一毕业,讲师就多了起来”——但培训行业,早就卷起来了

“大厂的人一毕业,讲师就多了起来”,很多中年产品经理都把去做培训当成一个后备选项,也许,作为十几年前就淌过路的人,可以给你一些信息。 总体来说,今年有个特别的体感,就是产品经理/产品思维/产…

main方法

阅读数:3530 [java] view plain copy public static void main(String[] args) {} 或者 [java] view plain copy public static void main(String args[]) {} main方法是我们学习Java语言学习的第一个方法,也是每个java使用者最熟悉的方法,每个Jav…

详解Java中的main方法

main方法格式定义 public: main方法启动时由JVM进行加载,public的可访问权限是最高的,所有需要声明为public;static: 方法的调用要么是通过对象,要么是通过类,而main方法的话,因为是由虚拟机调用的,所以无…

java中类的main方法总结

一、java中每个类都需要有main方法吗? 每个类可以有也可以没有main方法, 甚至所有类里可以都没有main方法。如果你想从某个类做为入口开始运行整个程序。那么就把他设成 public ,之后再里面写个main方法作为入口。 每个项目都要有一个主类…

深入理解 main 方法

目录 深入理解 main 方法 public static void main(String[] args) { }注意事项 深入理解 main 方法 public static void main(String[] args) { } 在Java 中,main() 方法是 Java 应用程序的入口方法,程序在运行的时候,第一个执行的方法就是…

Java main方法

public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Java语言学习的第一个方法,也是每个java使用者最熟悉的方法,每个Java应用程序都必须有且仅有一个main方法。在eclipse里可以使用输入main&#xff…

【爬虫第四章】 爬虫工具介绍

预计更新一、 爬虫技术概述 1.1 什么是爬虫技术 1.2 爬虫技术的应用领域 1.3 爬虫技术的工作原理 二、 网络协议和HTTP协议 2.1 网络协议概述 2.2 HTTP协议介绍 2.3 HTTP请求和响应 三、 Python基础 3.1 Python语言概述 3.2 Python的基本数据类型 3.3 Python的流程控制语句 3…

使命召唤8联机找不到服务器,使命召唤8怎么联机 使命召唤8联机方法简介

首先,要安装“使命召唤8最新联机补丁最新升级补丁整合包修复版”,将里面所有文件都放到游戏目录,有重 名的就替换掉,然后打开游戏目录的TeknoMW3.exe,IP Address and port(MP only 这行字后面有两个格,第一…

《使命召唤》是今年最好的手游了吧:高画质、无敌手感还不吃配置

《使命召唤》系统作为海外最火的游戏之一,近期也是上线了台服、韩服、跟国际服的手机版,相信不少玩家已经开始玩了。个人觉得《使命召唤手游》在质量上是不输《和平精英》的,无论是枪械、地图、还是操作手感,完成度都非常高。 甚至…

使命召唤 计算机配置,使命召唤16配置要求 电脑配置推荐

使命召唤这款游戏从推出到现在,一直深受玩家喜爱。不仅是从游戏的剧情,还是画面的做工,基本上都让玩家无可挑剔。近日使命召唤16强势上线,并且官方公布了PC具体配置要求,感兴趣的玩家就一起来看看使命召唤16详细配置吧…

使命召唤5该服务器没有响应,使命召唤5玩不了怎么办 使命召唤5打不开解决办法...

使命召唤5:世界战争可以说是使命召唤系列中非常经典的一代作品了,不过许多玩家在下载游戏后会遇到使命召唤5玩不了、使命召唤5打不开、使命召唤5无法启动等等问题,下面小编就来为大家详细的介绍下如何去解决这些问题。 常见问题一、文件夹命名…

ov5640帧率配置_《使命召唤 黑色行动 冷战》详细PC配置需求公布

发行商动视和开发者 Treyarch 和 Raven Software 发布了《使命召唤:黑色行动冷战》的官方 PC 预告片,并详细介绍了本作 PC 版的各个配置需求。 本作将于 11 月 13 日登陆 PS5、Xbox Series X|S、PS4、Xbox One 以及 PC(战网)平台。 配置详情 最低配置 操…

火爆海外的使命召唤要出手游啦:使命召唤最全适配机型一览

使命召唤适配哪些手机机型?使命召唤师一款FPS射击游戏,其PC系列版在海外就非常火爆,如今动视和腾讯联合推出,即将上线使命召唤多人在线第一人称射击类手游(有消息称估计会和去年刺激战场一样在年前突然公测上线&#x…

使命召唤9用计算机,应该怎么设?使命召唤9 分辨率那些破事

UPDATE:增加《使命召唤9》三篇被拉伸情况截图 【PConline 游戏硬件游戏应用】在《使命召唤9:黑色行动2》的评测中,我们发现游戏中出现一个很特别的情况,就是全屏模式下,非最佳分辨率时候会出现拉伸情况,这种…