spring框架学习之路(一)-入门基础(1)-IOC(控制反转)&DI(依赖注入)
来源:互联网 发布:围棋 形势判断算法实现 编辑:程序博客网 时间:2024/04/29 05:19
前言:
我就是一小白程序猴,不懂什么高新技术,只是在学习过程中把自己遇到问题或者学到的新知识记录下来,第一给自己复习用,第二小白更懂小白的苦,自己是新手所以应该更了解在刚开始学习时哪些学起来有困难,也就避开了所谓的专家盲点,给后面入坑的人一点点启示也是有用的吧.......应该...如果有同样正在学spring的同学,可以一起交流一哈(想写就写一点,边学一边更)
如果这些文字有幸被某位大牛看到,欢迎指正不足,真的欢迎!!!
spring的工作环境搭建,,,网上都是教程,自己找吧!
开始spring,必须了解以下三个概念,我尽量写的白话点儿,哈哈。
IOC:控制反转
DI:依赖注入
AOP:面向方面编程
今儿就先写一写我对IOC和DI 的理解吧:
IOC(控制反转):不是什么技术,而是一种设计思想。他是spring的内核和基础,要理解这个东西,你得知道啥叫“工厂设计模式”和“反射”,不了解的话先自学吧,,(坑以后填T_T)。
所谓“控制反转”,将控制权从程序自身转移到第三方(在spring中就是指applicationContext.xml文档)。
通俗讲,就是程序知道自己要创建一个属于某种类型的类(即实现了某个接口),但不了解要创建的这个类是该接口的哪一个具体实现类。在程序具体执行时,才向第三方请示要创建的是哪一个实体类(具体表现就是程序解析applicationContext.xml文件)。至于程序具体是怎么创建的实体类,其实就是用了java中反射(这个坑之后有时间填.....)。
这样用户不需要修改程序内容,只需要配置xml文件,就可以实现对程序的控制。
具体可以看下面的例子:
//接口 代表一个墨盒public interface Ink {void outInk();//喷墨}//实现类1,黑白墨盒public class BlackInk implements Ink{@Overridepublic void outInk() {System.out.println("黑白墨盒!");}}//实现类1,彩色墨盒public class ColorInk implements Ink {@Overridepublic void outInk() {System.out.println("彩色墨盒!");}}
首先配置xml文件内容:
<bean id="ink" class="code.bean.BlackInk"></bean>
然后就可以在main方法中调用了:
public static void main(String[] args) {ClassPathResource resource=new ClassPathResource("applicationContext.xml");XmlBeanFactory factory=new XmlBeanFactory(resource);Ink ink=factory.getBean("ink",Ink.class);ink.outInk();}
输出结果:
黑白墨盒!
然后,在我们不修改任何java代码的情况,只修改xml文件
<bean id="ink" class="code.bean.ColorInk"></bean>
再次运行main方法,结果为:
彩色墨盒!
这就是 IOC(Inversion of Control):控制反转 的设计思想。
---------------------------------------我是分割线ε≡٩(๑>₃<)۶ 一心向学------------------------------------
然后,接着上面的内容介绍DI。
DI(Dependency Injection):依赖注入,其实是IOC的另一种解释。事实上,是发现IOC这个概念不能对我们所提到spring的设计思想进行准确的描述,所以提出了DI的概念。
也有人认为IOC是个更宽泛的概念,DI是更具体的。
在我们之前传统的程序设计中,我们是通过类与类之间的调用来实现某项功能。但是用DI的设计思想,就是我们可以先创建被调用类的对象,然后把它注入到需要它的类中。
这样的设计可以让我们方便的把不同的被调用类注入同一个调用类,而不用更改代码。
说白话一点,就是我们利用DI可以在上面IOC内容的基础上创建拥有字段(属性)的类,并且对这些属性进行初始化。
接着我们上面的代码继续举栗子昂~~
在我们有了Ink接口、BlackInk以及Corlor类之后,我们再建一个Printer类:
public class Printer {private Ink ink;public void out(){ink.outInk();}public Printer() {}public Printer(Ink ink) {this.ink = ink;}public void setInk(Ink ink) {this.ink = ink;}}
在以前,我们要调用Printer类的out方法,是这个样子的:
Printer print=new Printer(new BlackInk());print.out();
如果我们要更改墨盒,就要再次更改程序代码;
而利用DI设计思想,
我们在applicationContext.xml文件中配置:
<bean id="black" class="code.bean.ColorInk"></bean><bean id="color" class="code.bean.ColorInk"></bean><bean id="printer" class="code.bean.Printer"><property name="ink" ref="black"></property></bean>
main方法只需要这么写:
public static void main(String[] args) {ClassPathResource resource=new ClassPathResource("applicationContext.xml");XmlBeanFactory factory=new XmlBeanFactory(resource);Printer printer=factory.getBean("printer",Printer.class);printer.out();}
这样的执行结果就是:
彩色墨盒!
而如果我们需要更改墨盒时,只需要更改xml:
<property name="ink" ref="color"></property>
不需要再次更改java代码。
核心就是怎么注入这些依赖关系。可以分为两类(以Printer为栗):
A)利用set方法,就是我们上面的这种做法。
<property name="ink" ref="black"></property>
B)利用带参构造方法
<bean id="printer" class="code.bean.Printer"><constructor-arg><ref local="black"/></constructor-arg></bean>
另外还可以利用<bean>的autowire属性,autowire="byType",但是不建议使用,因为如果在上下文中如果有多个符合的bean时会报错。
另外还要特别注意的是 <bean>的scope属性,默认值是singleton,即单例模式,只会创建一个对象。
<-IOC/DI完结->
- spring框架学习之路(一)-入门基础(1)-IOC(控制反转)&DI(依赖注入)
- 大数据WEB阶段Spring框架(一)IOC控制反转、DI注入依赖
- Spring学习之——控制反转(IoC)与依赖注入(DI)
- Spring IOC(控制反转)和DI(依赖注入)
- Spring-IOC(控制反转)+DI(依赖注入)
- Spring 控制反转(IOC)与依赖注入(DI)
- Spring控制反转与依赖注入(IOC && DI)
- IOC(控制反转) DI(依赖注入)
- 什么是依赖注入(IoC)、控制反转(DI) (一)
- Spring学习—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)
- SpringMVC学习-->控制反转(IoC)与依赖注入(DI
- spring框架的控制反转(IoC)和注入依赖(DI)
- Spring入门--控制反转(IOC)与依赖注入(DI)
- Spring入门--控制反转(IOC)与依赖注入(DI)
- Spring(1)初识Spring+IOC(控制反转)+DI(依赖注入)(附:快速入门案例)
- Spring 控制反转IOC,依赖注入DI
- Spring 4 学习笔记2:控制反转(IoC)和依赖注入(DI)
- Spring学习(三)IOC控制反转与DI依赖注入
- 自学-数据结构:栈的理解
- Qt的隐式共享机制
- 前端 flex弹性布局之弹性布局中文换行
- MySQL中视图的使用
- 整装再出发! 网易云通信与视频2年接入40万开发者
- spring框架学习之路(一)-入门基础(1)-IOC(控制反转)&DI(依赖注入)
- 复制构造函数的理解
- javascript笔记
- 使用微软TTS语音引擎实现文本朗读
- Escape HDU
- QT自学笔记(—)
- GithubPages+Jekyll搭建个性化主题博客
- 等值线平滑算法的优化
- (递归)全排列