豆アノテーション(注釈)の構成(3) - コンフィギュレーション依存性注入


チュートリアルの春シリーズ


注釈を通じて、道ビーン間のコンフィギュレーションの依存ノート:@Autowired

春が持つすべてのスキャン@Componentクラスのノートを、そして豆として登録し、その後で春を見つける@Autowired変数コメント、豆注入を頼るように。

使用@Autowired注釈依存性の注入は、次の3つの方法を:

  • コンストラクタ・インジェクション
  • セッター・インジェクション
  • フィールド注入

依存クラスはすでにそれ以外の場合は、注入することができない、ビーンが設定されていることを確認します。

私たちは、次のカテゴリのとおりです。

Database.java


package com.qikegu.demo;

import org.springframework.stereotype.Component;

@Component
public class Database implements Service {
  
  @Override
  public String name() {
    return "数据库名称:MySQL";
  }
  
  @Override
  public void run() {
    System.out.println("数据库正在运行");
  }
  
  @Override
  public void stop() {
    System.out.println("数据库已经停止");
  }
}

Logger.java

package com.qikegu.demo;

import org.springframework.stereotype.Component;

@Component
public class Logger implements Service {
  @Override
  public String name() {
    return "Logger X";
  }
  
  @Override
  public void run() {
    System.out.println("Loggery已经准备好");
  }
  
  @Override
  public void stop() {
    System.out.println("Logger已经停止");
  }
}

Mail.java

package com.qikegu.demo;

import org.springframework.stereotype.Component;

@Component
public class Mail implements Service {
  @Override
  public String name() {
    return "邮件收发";
  }
  
  @Override
  public void run() {
    System.out.println("邮件收发正在运行");
  }
  
  @Override
  public void stop() {
    System.out.println("邮件收发已经停止");
  }
}

1.コンストラクタ・インジェクション

使用する@Autowired注釈項目コンストラクタ依存性注入クラスを。

App.java

package com.qikegu.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class App {
  
  private Service mainService;
  private Service[] services;
      
  public App(){
  }
 
  /* 
  // 构造方法注入
  @Autowired
  public App(@Qualifier("logger") Service main){
    this.setMainService(main);
  } 
  */
  
  // 构造方法注入
  @Autowired
  public App(Service[] services){
    this.setServices(services);
  }
  
  public Service getMainService() {
    return mainService;
  }
  
  public void setMainService(Service mainService) {
    this.mainService = mainService;
  }
  
  public Service[] getServices() {
    return services;
  }
  
  public void setServices(Service[] services) {
    this.services = services;
  }
}

注:自動組立のための唯一のコンストラクタ。

  • 質問1:あなたは、パラメータの型コンストラクタが見ることができるServiceインターフェイスである、それはそれを注入するクラスを実現します。このインスタンスそのうちいくつかの実装クラスを、持っていますか?

唯一の実装クラス場合は、デフォルトでは、このクラスを注入します。

実装複数のクラスがある場合は、使用必要が@Qualifier("bean_id")明示的に指定された注釈を。指定しない場合、Springコンテナは一致が見つからない場合は、例外がスローされ、実装クラスに応じて変数名と一致します。

以下のためにpublic App(Service[] services)サービスの配列:春は、クラス注射のすべてのインスタンスを実現します。

  • 質問2:どのような方法でSpringコンテナは、Beanの一致しますか?

デフォルトでは、使用するデータの種類(byType)、ある@Qualifier名前(BYNAME)によって、注釈の間。

2.セッターメソッド・インジェクション

コール@Autowired注入の依存関係を注釈付きのセッターメソッド。

App.java

package com.qikegu.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class App {
 
  private Service mainService;
  private Service[] services;
 
  public App(){
  }
 
  public Service getMainService() {
    return mainService;
  }
  
  // Setter方法注入
  @Autowired
  @Qualifier("logger")
  public void setMainService(Service mainService) {
    this.mainService = mainService;
  }

  public Service[] getServices() {
    return services;
  }
 
  @Autowired 
  public void setServices(Service[] services) {
    this.services = services;
  }
}

実際には、いずれかと@Autowired注釈を付け方法、あなたは依存関係だけではなく、セッターメソッドを注入することができます。

// Setter方法注入
@Autowired
@Qualifier("logger")
public void anyMethod(Service mainService) {
  this.mainService = mainService;
}

3.フィールドインジェクション

使用して、オブジェクトのフィールド@Autowiredの注入依存アノテーションを。

App.java

package com.qikegu.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class App {

  // 字段注入 
  @Autowired
  @Qualifier("logger") 
  private Service mainService;
  
  // 字段注入 
  @Autowired
  private Service[] services;
 
  public App(){
  }
 
  public Service getMainService() {
    return mainService;
  }

  public Service[] getServices() {
    return services;
  }
}
  • 質問:これは良いです依存性注入、のいくつかのタイプを述べていますか?

それは、自分の好みを見て、独自の利点があり、プロジェクト全体の一貫性を選択してください

注釈値を注入することにより、

セッター依存性注入に加えて、コンストラクタ、メソッド、およびフィールドを使用する方法は、注射はまた、値であってもよいです。

App.java

package com.qikegu.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class App {
 
  // 使用@Value注解注入值
  @Value("1024")
  private int id;
  
  public App(){
  }
  
  // 使用@Value注解注入值
  public App(@Value("1024") int id){
    this.id = id;
  }
  
  public int getId() {
    return id;
  }
  
  // 使用@Value注解注入值
  @Value("1024")
  public void setId(int id) {
    this.id = id;
  }
}

おすすめ

転載: www.cnblogs.com/jinbuqi/p/10983456.html