2016-11-27 7 views
3

@Autowiredでは自動検出ですか? @Qualifierが使用されているとき、それは名前によって統制された注射ですか?アノテーションを使用してセッターとコンストラクターの注入を行うにはどうすればいいですか?Spring @Autowiredと@Qualifier

+1

質問が広すぎます – developer

答えて

7

@Autowiredと共に@Qualifierを使用できます。 Infactは春には、ケースを以下にそれが必要であるあなたが例えば修飾子に

を提供する必要があり、その場合には、曖昧なBeanタイプが見つかった場合はBeanを選択し、明示的に要求されます@Qualifier注釈修飾子

@Component 
@Qualifier("staff") 
public Staff implements Person {} 

@Component 
@Qualifier("employee") 
public Manager implements Person {} 


@Component 
public Payroll { 

    private Person person; 

    @Autowired 
    public Payroll(@Qualifier("employee") Person person){ 
      this.person = person; 
    } 

} 
1

を提供同じタイプの複数のBeanがある場合、自動配線競合を解決するために使用されます。

@Qualifierアノテーションは、@Componentでアノテーションされたクラスでも、@Beanでアノテーションされたメソッドでも使用できます。この注釈は、コンストラクタ引数またはメソッドパラメータにも適用できます。

例: -

public interface Vehicle { 
    public void start(); 
    public void stop(); 
} 

2つのBeanがあり、車やバイクは@Qualifierアノテーションで@Autowiredを使用してVehicleServiceにおける車両インターフェース

@Component(value="car") 
public class Car implements Vehicle { 

    @Override 
    public void start() { 
      System.out.println("Car started"); 
    } 

    @Override 
    public void stop() { 
      System.out.println("Car stopped"); 
    } 

} 

@Component(value="bike") 
public class Bike implements Vehicle { 

    @Override 
    public void start() { 
      System.out.println("Bike started"); 
    } 

    @Override 
    public void stop() { 
      System.out.println("Bike stopped"); 
    } 

} 

ジェクトバイクBeanを実装します。 @Qualifierを使用しなかった場合は、NoUniqueBeanDefinitionExceptionがスローされます。

@Component 
public class VehicleService { 

    @Autowired 
    @Qualifier("bike") 
    private Vehicle vehicle; 

    public void service() { 
     vehicle.start(); 
     vehicle.stop(); 
    } 
} 
関連する問題