Spring01——SpringIoC容器
一、spring概述
spring出现于2004年,其最早是由澳大利亚的音乐专家所提倡的,主要是由于EJB时代,EJB2需要许多配置文件和配合很多抽象概念才能运用,而EJB3虽然克服了配置方面的冗余,但致命的是对EJB容器的过分依赖,也就是EJB只能运行在EJB容器中,EJB容器又显得笨重,EJB应用难以达到快速开发和测试的目的。而在spring中,一切Java类都是资源,资源也就是bean,容纳这些bean的是spring提供的IoC容器,spring就是一种基于bean的编程,主要是配置bean。spring技术不是为了取代所有技术,而是提供更好的整合模板使他们能够整合到spring技术上来。而spring框架也是无侵入性或者地侵入性的(即即使Java应用离开了spring依旧可以运用),拥有即拔即插的功能。
二、springIoC阐述
IoC(控制反转)是一个比较抽象的概念,我举个例子,比如你现在要吃蛋炒饭,你除了得准备蛋和饭等等还必须会自己炒,这就是你对需要的东西的主动创建,而控制反转则反过来了,它可以看成是被动创建的过程,比如同样你是要吃蛋炒饭,你可以直接打开美团外卖里的商家通过你的描述点餐,然后它送到你的地址给你,这样你无须知道怎么蛋炒饭怎么制作的,但你一样吃到了蛋炒饭,全程你也不需要知道蛋炒饭的制作流程。或者在团队中,你可能熟悉商品的交易流程,对财务你不怎么熟悉,而团队其他人熟悉,这么一来,可以由熟悉财务流程的成员开发对应的接口,接口逻辑尽量简单,内容多复杂你也不需要管,你只要通过简单地描述调用接口就能使用了。这里可做类比:蛋炒饭就相当于财务接口,而美团外卖里的商家就相当于熟悉财务流程的同事,你对蛋炒饭的描述和地址就等同于获取财务接口实例的描述。当我们对某一领域不精通,这个时候我们可以把创建对象的主动权转交给别人,这就是控制反转的概念。
控制反转是一种通过描述(在Java中可以是XML或者注解)并通过第三方去产生或获取特定对象的方式。比如上方我们只需要知道美团外卖可以点我想要的蛋炒饭,而不需要去理解怎么创建蛋炒饭的。它最大的好处在于降低了对象之间的耦合。主动创建模式下,责任归于开发者,被动创建模式下,责任归于springIoC容器。springIoC容器的主要2功能是:①容纳bean;②提供bean。
springIoC容器的设计是基于BeanFactory和ApplicationContext两个接口,其中BeanFactory是springIoC容器所定义的最底层接口。大多数场景下,都会使用ApplicationContext作为springIoC容器。
BeanFactory接口源码分析:
getBean()的多个方法用于获取配置给springIoC容器的Bean;
isSingleton()用于判断是否单例,若为true则该bean是容器的唯一单例;
isPrototype()则相反,即为false时,你从容器中获取bean,容器会为你生成一个新的实例;
用代码举个例子:
先创建一个实体POJO类
再创建一个果汁制作者类
创建spring-cfg配置文件管理bean
最后写个测试类调用
运行效果:
就这样,通过spring配置我们很灵活的就完成对象的创建使用而不是通过new对象的方式来实现,实现了解耦合的效果。
三、springIoC容器的初始化和依赖注入
注意,bean的定义和初始化在springIoC容器中是两大步骤,先定义,然后才初始化和依赖注入的。
bean定义分三步:
①Resource定位:在spring的开发中,通过XML或者注解都是常见的方式,定位的内容是由开发者所提供的。
②BeanDefinition的载入:这时候只是将Resource定位到的信息,保存到BeanDefinition中,并不会创建bean实例。
③BeanDefinition的注册:这个过程就是将BeanDefinition的信息发布到springIoC容器中,注意此时仍然没有对应的bean实例创建。
做完以上三步bean就在springIoC容器定义了,但没有被初始化,更没有依赖注入,也就没有诸如其配置的资源给bean,它还不能完全使用。当我们使用springIoC容器的getBean()方法获取它时,它才会进行bean的初始化,完成依赖注入。springIoC容器的本质目的就是为了管理bean。
了解bean的生命周期,以便我们可以在springIoC容器初始化和销毁bean时加入自己的自定义方法,以满足特定的需求。
注意:上述的bean大部分是针对单个bean而言,而BeanPostProcesser接口是针对所有bean而言的。
用代码举个测试说明(基于上面的juiceMaker代码基础添加代码):
根据程序打印日志结果出来看,我们可以对bean生命周期函数执行顺序排序
以上就是执行的顺序了。可以看到BeanPostProcessor针对全部bean

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JAVA程序员学到什么程序可以去找工作及面试呢?
一、简历 简历里面需要包含的内容应该是学历,自己的技术栈,然后自己做过的一些项目。简历不需要太长,两页纸即可。里面应该重点写你使用过的一些框架,自己做的一些项目,以及自己的收获,简练第一。一般面试官不会有很多的耐心,看你的项目详细描述,所以尽量简洁明了即可。 二、简历投递 投递的方式有几种吧,相信大家也都知道。一般在程序员的垂直招聘网站投递即可,比如脉脉、BOSS直聘、拉勾等等。智联招聘啥的,不太适合咱们程序员,你懂的。另外,由于自己不是大牛,所以如果有猎头勾搭的话,我尽量不会理会,因为有过血的教训。所以尽量还是自己投简历比较靠谱,或者是内推。 三、面试 一般来说,面试流程都差不太多。首先自我介绍,重点介绍一下自己的一些工作经历,以及自己主要负责的一些内容。这块可以提前准备一下,不过也不需要特地准备,别搞得像背书似的,反而觉得不真实。 3.1 技术面试 一般公司都会有两到三轮的技术面试,大厂的技术面试轮次还可能更多,但是每轮考察的内容又不是很一致,下面列举一些自己遇到的一些问题。 3.1.1 Java基础 此时一般会问到一些Java的基础知识,比如 l synchronized sta...
- 下一篇
会这133个Java面试题进阿里还是问题吗?(内含答案解析)
Java 面试随着时间的改变而改变。在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入。 在我初入职场的时候,类似于 Vector 与 Array 的区别、HashMap 与 Hashtable 的区别是最流行的问题,只需要记住它们,就能在面试中获得更好的机会,但这种情形已经不复存在。如今,你将会被问到许多 Java 程序员都没有看过的领域,如 NIO,设计模式,成熟的单元测试,或者那些很难掌握的知识,如并发、算法、数据结构及编码。 由于我喜欢研究面试题,因此我已经收集了许多的面试问题,包括许多许多不同的主题。我已经为这众多的问题准备一段时间了,现在我将它们分享给你们。这里面不但包含经典的面试问题,如线程、集合、equals 和 hashcode、socket,而且还包含了 NIO、数组、字符串、Java 8 等主题。 该列表包含了入门级 Java 程序员和多年经验的高级开发者的问题。无论你是 1、2、3、4、5、6、7、8、9 还是 10 年经验的开发者,你都能在其中找到一些有趣...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS关闭SELinux安全模块
- Linux系统CentOS6、CentOS7手动修改IP地址
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果