Java程序员进阶——Spring依赖注入原理分析

Spring依赖注入原理分析

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

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

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对象代码较长,这是费时的事
情。因而有以下写法:
spring

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的构造函数传入,以下:
app

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之间的耦合联系。ide


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进行自动匹配,无需如此繁琐配置了。

若是你是Java程序员,对技术提高很感兴趣,欢迎1~5年的工程师能够加入个人Java进阶之路来交流学习:878249276。里面都是同行,有资源共享,还有大量面试题以及解析。欢迎一到五年的工程师加入,合理利用本身每一分每一秒的时间来学习提高本身,不要再用"没有时间“来掩饰本身思想上的懒惰!趁年轻,使劲拼,给将来的本身一个交代!

webp

webp

相关文章
相关标签/搜索