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完结->



阅读全文
2 0
原创粉丝点击