欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Bean三种注入方式详解

程序员文章站 2024-02-13 08:25:40
在spring容器中为一个bean配置依赖注入有三种方式:  使用属性的setter方法注入  这是最常用的方式;  使用构造...

在spring容器中为一个bean配置依赖注入有三种方式:

  1.  使用属性的setter方法注入  这是最常用的方式;
  2.  使用构造器注入;
  3.  使用filed注入(用于注解方式).

field注入是最常见的一种方式,可以采用 @autowired 对bean类的接口进行初始化,代码如下

@contextconfiguration({"/meta-inf/spring/amazing-base.xml"})
@runwith(springjunit4classrunner.class)
public class springinjectiontest {
  @autowired
  private cust normalcust;
  
  @test
  public void testfieldinjection() {
    system.out.println("testfieldinjection begin");
    normalcust.recharge();
    system.out.println("testfieldinjection end");
  }
}

cust为接口,normalcust为其实现类,通过这种方式,可以通过spring容器初始化normalcust bean,进而调用recharge()方法。

构造器注入主要用于某些类因为某种原因不能作为bean,只是一个普通类。可以通过类的构造方法传入需要调用的bean接口。

@contextconfiguration({"/meta-inf/spring/amazing-base.xml"})
@runwith(springjunit4classrunner.class)
public class springinjectiontest {
  @autowired
  private cust normalcust;
  
  @test
  public void testconstructorinjection() {
    system.out.println("testconstructorinjection begin");
    chargethread thread = new chargethread(normalcust);
    thread.run();
    system.out.println("testconstructorinjection end");
  }
  
}
public class chargethread implements runnable {
  
  private cust cust;
  
  public chargethread(cust cust) {
    this.cust = cust;
  }

  public void run() {
    cust.recharge();
  }

}

上面的代码通过初始化一个线程,在初始化的时候传入bean,在线程的类中调用bean的充值方法。构造器注入特别适合多线程的编程,因为线程不能定义为bean,否则不仅会因为它是一个单例,而且会被spring容器管理。(当然你可以去定义bean为原型bean,能够有多个副本,脱离spring容器的管理),最重要的是我们要用线程池,由线程池来管理线程。

还有一种setter方法注入,这种方式能用于final类的静态方法,例如有一个充值的util类,该类是final类,其方法是静态方法。

public class springinjectiontest {
  @test
  public void testsetterinjection() {
    system.out.println("testsetterinjection begin");
    string result = rechargeutil.instantrecharge();
    system.out.println("testsetterinjection end, " + result);
  }

}

@component
public final class rechargeutil {
  
  private rechargeutil() {
    
  }
  
  private static cust normalcust;
  
  @autowired
  public void setnormalcust(cust normalcust) {
    rechargeutil.normalcust = normalcust;
  }

  public static string instantrecharge() {
    normalcust.recharge();
    return "instantrecharge success!";
  }
}

最后一种方式也成功了将normalcust注入到了rechargeutil中。

以上三种注入方式,读者可以根据实际应用场景灵活选择。也希望大家多多支持。