Spring 之IOC 详解

本文深入探讨Spring框架的核心概念——IOC容器,从控制反转的基本原理出发,详细讲解了bean的装配、依赖注入的各种方式,包括属性注入、构造方法注入、工厂方法注入等,以及参数注入的多种类型。

前言:

原本想弄一个相关代码的copy的,就是把自己的代码都复制粘贴上来,但是实在太多了。

我的截图里面确确实实的已经包含了我的所有代码和过程和相应的注解,按照道理应该都能够看懂了,运行环境配对了的话,都能运行出来的,所以我以后将不会在博客里面贴上自己的代码。

代码太长影响我自己复习和阅读体验。

然后我还发现其实csdn上传图片是有一定的bug的,虽然是极为个例。然后,如果图片对不上,可以评论回复我。我做笔记- -做得真长啊。啊!!!

加油呀!

目录

第一节:spring ioc 简介

第二节:spring ioc 实例讲解第三节:装配一个 bean

第四节:依赖注入

第五节:注入参数

第六节:Spring 自动装配

 

开始学习:

(1)IOC(控制反转)出现的原因(举例子进行说明)       

(2)实现简便版本的IOC(控制反转)思想:多态,接口,继承

(3)使用Spring管理IOC容器。

Spring IOC相关原理:

 

(1)装配一个bean

(2)依赖注入  

【1】属性注入

【2】构造方法注入

[1]通过类型

[2]通过索引

[3]联合使用   (索引/类型)

【3】工厂方法注入(非静态工厂/静态工厂)

[1]非静态工厂

[2]静态工厂

【4】泛型依赖注入

【5】注入参数

[1]基本类型值:

[2]注入Bean(嵌套)

[3]内部bean

[4]null值  必须要有一个null标签

[5]级联属性

[6]集合类型属性

               {1}List

               {2}set   其值无重复

               {3}map   键值对

               {4}Properties


第一节:spring ioc 简介

 

IOC(控制反转:Inverse of Control ),又称作 依赖注入,是一种重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的 Spring 框架的核心。

第二节:spring ioc 实例讲解第三节:装配一个 bean

第四节:依赖注入

1,属性注入;

2,构造函数注入;(通过类型;通过索引;联合使用)

3,工厂方法注入;(非静态工厂,静态工厂)

4,泛型依赖注入;(Spring4 整合 Hibernate4 的时候顺带讲)

 

第五节:注入参数

1,基本类型值; 2,注入 bean; 3,内部 bean; 4,null 值;

5,级联属性;

6,集合类型属性;

第六节:Spring 自动装配

通过配置 default-autowire 属性,Spring IOC 容器可以自动为程序注入 bean;默认是 no,不启用自动装配; default-autowire 的类型有 byName,byType,constructor;

byName:通过名称进行自动匹配; byType:根据类型进行自动匹配;

constructor:和 byType 类似,只不过它是根据构造方法注入而言的,根据类型,自动注入; 建议:自动装配机制慎用,它屏蔽了装配细节,容易产生潜在的错误;

开始学习:

(1)IOC(控制反转)出现的原因(举例子进行说明)       

代码copy请看我【举例子版源代码】

新建JavaWork,obZhangSan,Test  .java三个文件。

内部内容:

然后执行Test.java

重点!!!

分析上面的程序(javawork,zhangsan   .java)

我们会发现,测试这个工作,完全和那个人耦合在了一起。

假如,测试员换人了,换成了李四,我们发现,代码统统都要换!!!

这就导致了,文件变化太大,破坏了完整性。

这个时候就有了IOC的设计思路。

控制反转——把这个控制权转交出来,某个人执行的测试工作转交给主管。

 

(2)实现简便版本的IOC(控制反转)思想:多态,接口,继承

代码copy请看我【简便版本IOC 源代码实现】

首先你得通过一个接口(Interface)!!!

 

1.先定义一个接口方法,然后让测试人员继承它

2.新增了一个李四测试人员:

3.更改张三代码,使其继承测试接口

4.定义set方法(使之定义使用哪一个测试员),然后那个被定义好的测试员再在主管那里去被调用,再去调用自身的test方法,其test的方法是我们从接口继承而来,又重新实现的。

5.主管。

 

(3)使用Spring管理IOC容器。

copy代码请看【Spring版本源代码】

进入Spring的beans.xml配置文件

还需要在这里面定义一个name,其必须要和这个东西统一,不然会报错。

须得与javawork.java这个里面的tester一致。

下面那句话的意思是:它会自动调用JavaWork里面的setTester方法,把zhangsan的这个实例对象给设置进去 ,这样的话,JavaWork里teaster就有具体的值了。∵底层Spring会对其进行处理的。

执行Test2.java:

如果我们需要用lisi,那么直接把配置文件改一下就行了,而不需要动任何代码。

继续去跑test2.java

Spring IOC相关原理:

这就是因为将主管那边设置具体属性的事情,交给了Spring进行管理的原因。  

然后Spring的配置文件中的 ref 的作用就是依赖注入,因为本来JavaWork里面的Test teaster没有值,ref就对其注入了值。

通过Spring配置的那些东西,怎么去找到那些东西,还运用了JAVA的反射机制。

我copy的百度的链接:java的反射机制。

https://baike.baidu.com/item/JAVA%E5%8F%8D%E5%B0%84%E6%9C%BA%E5%88%B6/6015990?fr=aladdin

之后我会对其做相关的笔记,然后一同贴上自己的简便版笔记链接的。

 

(1)装配一个bean

 

复制粘贴之前的项目,命名新的项目为Spring402

然后再把之前401给close project掉

 

装配一个bean

先写一个实体类entity

再People.java

 

有了这些之后,就可以写一个bean

 

如上图就装配好了。

那个id就是那个bean的唯一标识,我们通过id去取出实例。

 

去把刚才复制粘贴的那个项目的残留物给删掉。

大概文件目录成了这样。

Test2.java 里编写代码:

 

执行Test2.java

然后会发现它报出这样的一行:

属性的什么的啥都没有,仅仅是定义了一个最普通的bean,而且调用的是默认的构造方法。

 

如何显式的查看默认构造方法:

【ctrl】+【shift】+【s】

【Generate Constructors from Superclass】

(2)依赖注入  

注入方式有:

1.属性注入

2.构造方法注入;(通过类型;通过索引;联合使用)

3.工厂方法注入;(非静态工厂,静态工程)

4.泛型依赖注入;(Spring4整合Hibernate4的时候顺带的。)

 

【1】属性注入

再写一个对象叫people2

然后对其进行属性注入

 

为了方便观察,重写输出方法println,自动输出的是类的toString方法。

重写它。

然后再来写一个测试。

 

 

【2】构造方法注入

[1]通过类型

光有默认的构造方法还不够,还需要有一个属性的构造方法

 

 

 

进行测试:

运行之后:

 

构造方法注入

[2]通过索引

然后再进行测试:

 

[3]联合使用   (索引/类型)

 

对其进行测试:

 

输出语句为:

 

【3】工厂方法注入(非静态工厂/静态工厂)

工厂是专门用来造东西的。

 

[1]非静态工厂

新建:

通过这个它也就可以产生实例啦!!!

 

然后跑去 配置一下工厂。

 

 

然后写测试语句:

结果:

 

[2]静态工厂

因为是静态的,所以只需要类名.方法 就可以直接调用了,不需要bean

新建

 

注意在方法前进行了static修饰:

进行测试:

结果:

【4】泛型依赖注入

使J2EE架构有了更高层次的提高。等待Spring4整合Hibernate时候再提。

 

【5】注入参数

1.基本类型值

2.注入bean

3.内部bean

4.null值

5.级联属性

6.集合类型属性

 

[1]基本类型值:

复制402粘贴成403

close project 402

新增一个junit包

然后把jar包粘贴进去,并对其build path

文件目录清理成这样:

运行这个Test.java

[2]注入Bean(嵌套)

新增:

 

 

再重写了toString

如果想测试成功第一个junit的例子,就需要把toString改回去。

 

进行测试:

运行此程序:

 

[3]内部bean

什么叫做内部Bean:  私有的。

刚才那条狗,能够被people1\people2都引用。

那假如有一条叫tom的狗,只能供一个人拥有呢。

这个时候就要用到内部Bean,相当于是私有的。

 

测试结果:

 

[4]null值  必须要有一个null标签

当这个人没有狗的时候,为空。

运行测试:

会有报错信息,这是因为:

dog.getName();的空指针异常,所以把这个.getName去掉就行了。

就像这样:

结果运行:

但是测试完这个null值之后,记得一定要把.getname加上去= =,因为后面的代码还要用。

 

[5]级联属性

级联属性直接用会报错。

用自动级联时,需要先对对象new一个,这样才行

注意那个dog那里是new了一个dog的,不然使用级联是会被报错的。

然后这个级联属性这里弄完了,还是需要把dog的代码进行还原的,之后还要用。

 

测试代码:

 

[6]集合类型属性

注意这里的。。。测试请一定要一个一个的进行测试。不然配置就会有问题的!详细原因在代码里面就可以看的出来的。

一定要一个一个的run as进行junit测试哦!

 

{1}List

记住别忘了快捷生成get/set方法

 

list

然后因为多了一个hobbies属性嘛,所以说,重写一下toString()

然后开始运行测试

 

 

{2}set   其值无重复

新增Set,命名loves,并且对其进行get/set方法

 

 

因为多了一个loves属性所以需要重写String

 

然后运行测试:

 

{3}map   键值对

 

别忘记生成get/set方法

toString方法又要重写:

 

运行测试代码:

 

 

{4}Properties

记住get/set方法

toString()方法有要重写哦!!!

开始测试:

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值