使用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.其它略,可根据需要使用

使用main方法启动spring程序相关推荐

  1. main spring启动_SpringBoot学习(一):为什么main方法启动类需要放在项目根目录...

    一.概述 使用SpringBoot的应用是需要将应用代码编译打包成jar包,然后基于main方法的方式来独立启动这个应用,使得该应用作为一个独立进程运行.这是跟传统的将项目打包成war包,然后部署到t ...

  2. idea下,Jetty采用main方法启动web项目

    为什么80%的码农都做不了架构师?>>>    对于maven多模块的spring web项目,本地开发时,启动的方式一般有如下几种: 使用容器(tomcat/jetty/resin ...

  3. dubbo框架中Main方法运行spring容器

    一:运行spring容器的方式有三种 1:使用tomcat.jetty等servlet容器运行 2:自己写一个Main方法运行 3:使用dubbo框架提供的Main方法运行 前面两种有一定的局限性,很 ...

  4. MacOS-MacAPP使用Main.storyboard启动视图程序踩坑

    由于主做移动端APP的iOS开发,对于Mac端的APP开发较少,我也本以为,简单的以为会和iOS差不多 雄赳赳,气昂昂 没想到啊,真是没想到啊,帅不过3秒!!!尴尬!!! 在程序视图启动入口处就挂了, ...

  5. Shell-通过shell启动Java类中的main方法 + 通过Shell启动jar包

    文章目录 概述 shell启动Java类中的main方法 启动脚本分析 启动脚本 shell启动jar包 概述 Java程序 运行在linux主机上, 通过shell脚本启动为进程. Java程序中 ...

  6. 从浏览器启动客户端程序的方法

    从浏览器页面上,启动用户本地的客户端程序的方法,常见的有两种. 一.Asynchronous Pluggable Protocols协议方式 MSDN或网络上搜索,即可找到相应的方法. 从浏览器启动客 ...

  7. Java不用main方法运行_如何在不定义main方法的情况下运行Java程序?

    我正在查看一些Java源代码,并注意到main方法没有定义. Java如何编译源代码而不知道从哪里开始? main方法仅在Java虚拟机执行代码时使用.没有main方法就无法执行代码,但仍然可以编译代 ...

  8. 阿里二面:main 方法可以继承吗

    前沿技术早知道,弯道超车有希望 积累超车资本,从关注DD开始 昨天,微信群里一位网友,在群里发了自己面试阿里的过程.其中一个面试,他在群里 PUA 其他网友.这道面试题就是:Java 中的 main ...

  9. java main方法背后的故事?(转)

    jvm java 看似一种语言,实则一个巨大的体系的王国,开发这么多年了,还是没有搞懂,我以为我懂了,可是过了一段时间又忘了,所以说还是没懂 1.main方法说起 编译完我们的java文件后,需要有个 ...

最新文章

  1. Android系统Surface机制的SurfaceFlinger服务的线程模型分析
  2. 2.11 向量化-深度学习-Stanford吴恩达教授
  3. OSError: Could not find kaggle.json
  4. 商城左侧菜单栏网页模板
  5. MySQL的使用笔记
  6. mysql limit分页知乎_头发一天天的掉,你知道MySQL的Limit有性能问题吗?
  7. 美团优选、多多买菜等五家社区团购被罚650万元;打车手机越贵,接单车型越贵;微软推出低代码语言 Power Fx | 极客头条...
  8. QT开发pjsip的VOIP,A8平台运行
  9. (4) numpy.isnan() 用法
  10. 如何做一枚优秀的全栈工程师
  11. PySpark: DataProcessing(csv file)
  12. Redis入门到精通(2021版本)视频教程
  13. 组网[ZeroTier]+自建Moon服务
  14. 《区块链底层设计Java实战》之第一章区块链简介
  15. python爬取双色球2003-2022年所有数据
  16. python自然语言_Python自然语言处理 - 随笔分类 - 牛皮糖NewPtone - 博客园
  17. smartbi v7 Linux,Smartbi版本更新
  18. 全球首位AI评委亮相“83行代码挑战赛”,评分“快准狠”
  19. Python利用马青公式计算圆周率Π并写入文件
  20. Vue 汉字转大写首字母(非汉字直接输出)

热门文章

  1. 计算机网络第六章 链路层和局域网
  2. 以Listener和Talker为例ROS1和ROS2代码对比
  3. 程序员干到30岁,真的只能转行了么?
  4. 基于JavaWeb平台的常用物联网硬件接口对接代码总结文档_田超凡
  5. Test,Evaluate_gpu 修改,自动跑完你要的epoch
  6. uni-app 微信小程序接入高德SDK
  7. 免费在线!!!多PDF合成一个PDF
  8. excel实现自动排序
  9. MyCat2分库分表的基本操作
  10. IDEA服务器端JQuery框架加载失败--已解决