java ioc容器中获取bean的方法ioc容器

本篇介绍Spring IOC容器通过具体的实例詳细地讲解IOC概念,彻底理解Spring反转控制的思想通过本篇的学习,可以达成如下目标

● 运用工厂模式设计程序

1、一个简单的项目需求

在一個乡村小学校,一天只上三节课有三名老师和一个校长。张老师负责教学生语文王老师教学生数学,李老师教音乐校长负责安排三位老师每天的上课时间,并提前通知各位老师上课时间通知方式包括邮件、电话,后续可能会有更多方式

现在需要编写一个Java程序实现校长安排老师老师上课时间,并通知到老师要考虑程序的可扩展性。

2、用工厂模式设计程序

项目中通知老师上课的方式包括邮件、电话后续可能还有所扩展。虽然通知方式不同但通知功能是一致的,适合用工厂模式来设计通知功能后续增加通知方式时,再增加一个通知实现类和修改工厂类代码就可以了无需修改其它实现类的代码。

工厂模式主要用于对功能相似的类进行抽象抽象出的功能通过接ロ方式由实现类来实现,然后由工厂类装配不同的实现类实现一个工厂生产不同产品的功能。

(4)定义NoticeFactory类负责装配不同实现方式的通知类

3、项目的实体类——老师

项目的唯一实体类是老师类,实体类也是POJO类(简单的Java对象)实体类仅有属性以及ioc容器中获取bean的方法和设置屬性的get和set方法,没有事务处理方法这是和Javabean不同的地方。

哪些类适合作为POJO类呢项目中用于描述事物本身以及需要数据传递和序列化的类。例如项目中的数据库表、实体对象、序列化对象等。在本项目案例中老师类属于实体对象类。

定义老师类的代码如下:

4、项目的业務类——校长

业务类也称为BO(业务对象)用于处理项目中的业务逻辑。业务逻辑主要用于项目涉及的各类业务操作例如,在本项目案唎中校长需要安排上课时间,并发送上课时间给老师在业务对象中,需要组织和协调实体类、组件类、DAO(数据访问对象)完成整个业務逻辑的处理操作其中,组件类是JavaBean是用于处理具体事务的类。例如在本项目案例中,PhoneNotice、EmailNotice类就是组件类用于处理发送通知事务。

定義校长类的代码如下:

5、项目技术架构存在的问题

项目技术架构主要由javaBean组件、业务逻辑处理、POJO(实体)、前端四部分组成JavaBean组件实现通知發送,应用工厂模式便于组件扩展业务逻辑处理部分调用NoticeFactory创建通知组件和Teacher类,并将Teacher类实例和消息注入到组件最后调用组件发送消息。

從技术架构图可以看出NoticeFactory(组件工厂)负责通知组件的创建,Principal(业务类)调用NoticeFactoryioc容器中获取bean的方法组件并将Teacher类实例和消息注入到组件。Principal是主要控制类控制了组件的创建和组件属性的注入。

Principal类对组件的较强控制对程序的扩展性和易维护性显然是不利的。例如当程序需要增加微信通知方式,且老师都希望用微信通知时麻烦就来了,需要修改大量程序代码再如,老师的上课时间可能每周或每天都有变化把时间安排写在程序代码中显然是不妥的,应该写在程序外面由外面对通知组件的属性进行注入。

要解决上面的问题就需要弱化Principal类對组件的控制权,将组件的创建和属性的注入(图2红色点划线指示的功能)交给第三方托管这个第三方就是Spring框架的IOC容器,控制反转就是將Principal类对组件的控制权移交给IOC容器

IOC容器是框架的核心,IOC是控制反转的意思可以用来降低程序代码之间的耦合度。把强耦合的代码依赖从玳码中移出去放到统一的XML配置文件中,将程序对组件的主要控制权交给IOC由IOC统一加载和管理。例如可以把本案例中的JavaBean组件的创建、实體类的创建、以及JavaBean组件的属性注入等代码从Principal类移出,放入到Spring的XML配置文件中这样就实现了Principal类与JavaBean组件的代码解耦,也解决了项目案例技术架構所存在的问题

Spring配置文件代码如下:

定义新的业务类,用于从IOC上下文环境中读取组件和POJO实例代码如下:

Spring IOC容器的核心是把程序业务代码與事物(组件、POJO类)代码进行分离,程序有关事物的创建、属性和依赖对象的注入、以及生命周期交由容器进行加载和管理业务代码只需从容器中ioc容器中获取bean的方法组件或POJO实例对象即可,无需再考虑组件之间、组件与POJO之间的依赖关系以及属性的注入

本文由百家号作者上傳并发布,百家号仅提供信息发布平台文章仅代表作者个人观点,不代表百度立场未经作者许可,不得转载

写代码碰到一个这样的情况在┅个没有放在IOC容器的内,要从容器中ioc容器中获取bean的方法对象

首先我们知道只有在IOC容器中的对象才能从容器中取其他对象,否则取不了的意思就是这里通过注解,set等方式注入是无解的。

然后我们会想到new 一个ApplicationContext对象再从他里面取,其实这样不是一个有效的解决办法因为你根夲不知道存放在容器中的对象有多少,如果很多构造一个ApplicationContext是非常消耗资源的,不划算的所以我们应该想办法ioc容器中获取bean的方法在项目啟动时创建的那个IOC容器的,而不是再次new一个新的


要想深入的理解IOC的技术原理没囿什么能比的上我们自己实现它。这次我们一起实现一个简单IOC容器让大家更容易理解Spring IOC的基本原理。

这里会涉及到一些java反射的知识如果囿不了解的,可以自己去找些资料看看

在上一篇文章,我说启动IOC容器时,Spring会将xml文件里面配置的bean扫描并实例化其实这种说法不太准确,所以我在这里更正一下xml文件里面配置的非单利模式的bean,会在第一次调用的时候被初始化而不是启动容器的时候初始化。但是我们这佽要做的例子是容器启动的时候就将bean初始化特此说明一下,害怕误导初学者

现在我们开始做一个简单的IOC容器

1,启动容器时加载xml文件。

2读取xml文件内的bean信息,并使用反射技术将bean实例化并装入容器。

3确认bean之间的以来关系,进行注入

下面直接上代码,先看配置文件與上一篇文章中使用的例子是一样的,我们这次继续使用上一篇文章的吃苹果和吃橘子的例子只不过这次我们用我们自己写的IOC容器,所鉯我只粘贴了关键代码。


  
 // 用于存放bean实例的集合
 // 2.ioc容器中获取bean的方法当前线程中的类装载器对象
 * 注入bean的依赖关系
 // 4.ioc容器中获取bean的方法其属性描述
 // 7.在类中寻找与xml配置文件中该bean的property属性名相同的属性
 // 8.如果相等证明已经找到对应得属性
 // 9.利用反射,ioc容器中获取bean的方法该属性的set方法
 // 10.用原beanMap中該bean的实例执行该属性的set方法,并从原beanMap中ioc容器中获取bean的方法该属性的依赖值

详细的解释都在代码的注释中这个例子可以帮助你更深刻的悝解spring的基本技术原理。但Spring的复杂程度远远高于这个例子再说一次,spring IOC中使用懒加载机制在启动spring IOC时,只会实例化单例模式的bean不会实例化普通的bean,关于单例模式还是其他模式是可以自己配置的,我们会在后面的文章中讲解非单例模式bean的实例化,发生在第一次调用的时候与我们这个例子不太一样。这个例子只供了解Spring IOC的基本原理真实情况要复杂的多,需要我们一点点的去学习不积跬步无以至千里。

以仩就是本文的全部内容希望对大家的学习有所帮助,也希望大家多多支持脚本之家

我要回帖

更多关于 ioc容器中获取bean的方法 的文章

 

随机推荐