Spring依赖注入原理分析

下面谈谈Spring是如何实现反转模式IOC或依赖注入模式DI:

平时,我们需要生成一个对象,使用new语法,如一个类为A

public class A{
   public void myMethod(){
      System.out.println("hello");
   }
}

如果我们在 B中调用A,那么如下代码

public class B{
   public void invoke(){
      A a = new A();
      a.myMethod();
   }
}

每次执行invoke方法时,都要生成一个A对象,如果A对象代码较长,这是费时的事

情。于是有如下写法:

public class B{
   A a = new A();
   public void invoke(){
      a.myMethod();
   }
}

将A对象变成B的类属性。
如果我们不想在B中实现A的实例,也就是不想立即new A(),而是想通过外界传入,
注意,如果你想知道为什么,这里涉及到设计模式以及解耦等因素,进一步感兴趣者可学习
本站的GoF 23 种设计模式。

如果想让A的实例从外界传入,有两种写法:

public class B{
   A a;
   public void setA(A a){
      this.a = a;
   }
   public A getA(){
      return a;
   }
   public void invoke(){
      a.myMethod();
   }
}

这种写法,A并没有被实例化,需要通过外界调用setA方法,将A的对象实例赋入B中.
或者通过B的构造函数传入,如下:

public class B{
   A a;
   public B(A a){
      this.a = a;
   }
   public void invoke(){
      a.myMethod();
   }
}

上述两种写法在编程中是经常发生的,B作为调用者,A是被调用者,A的实例化不在
调用者B内部中完成,而是通过构造函数或setXXX方法赋值进来,这种方式我们称为依赖
性注射(IoC 模式),B 和A 的依赖联系是通过构造函数或setXXX 方法赋值进来,这样,
最大程度解耦了调用者B和被调用者A之间的耦合联系。

Spring如何实现依赖注射?

上文提到:A的实例化不在调用者B内部中完成,而是通过构造函数或setXXX 方法赋
值进来,Spring实际就是完成这个赋值的过程。
为了让Spring自动完成B代码中的A的实例化,需要通过配置文件告诉Spring有关A
的类的属性,这个配置是applicationContext.xml文件。
在 applicationContext.xml中,我们先定义JavaBeans为B的配置:

<beans>
  <bean id="b" class="springsimple.B"/>
</beans>

这是最常用的JavaBeans的定义,id相当于对象名,当前文件应该是唯一。后来Spring使用@Component替代。

再在applicationContext.xml定义A的配置如下:

<beans>
 <bean id="b" class="springsimple.B"/>
 <bean id="a" class="springsimple.A"/>
</beans>

这样我们告诉Spring我们有两个JavaBeans,现在解决关键问题,B代码中还调用了A,
那么如何让Spring将A的实例注射到B中?使用Spring配置的property语法。具体配置如
下:

<beans>
  <bean id="b" class="springsimple.B">
    <property name="a"><ref local="a" /></property> <!— 增加这一行-->
  </bean>
  <bean id="a" class="springsimple.A" />
</beans>

增加一行说明:B 的属性a 指向了a,这样,Spring 会知道B 中属性a 的实例就是
springsimple.A,在B实例化时将会将B中的a 实现实例化,这是通过setA方法注射进入。
注意,property name="a"中的a 是setA字符中去掉set 后的字符串,这个字符串第一个
必须是小写,例如,如果B中有setOneA方法,那么,配置文件应该是property name="oneA"。

Spring Boot以后版本已经可以使用@Autowire进行自动匹配,无需如此繁琐配置了。

依赖注入

Spring专题

原文 

https://www.jdon.com/dl/best/spring-ioc-di.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Spring依赖注入原理分析

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址