Monday, May 4, 2015

Малоизвестные Spring аннотации - @Primary

Сегодня поговорим о мало кому известной аннотации @Primary. Возможно, вы о ней читали, но возьмусь предположить, как и я, наверняка, не использовали.

Для внедрения зависимостей в Spring IoC используется @Autowired, если контейнер "находит" бин с указанным типом, то производит "инъекцию" - все предельно просто. Теперь рассмотрим пример, когда есть контракт некого бина и несколько реализаций(в нашем случае две). Для того чтобы "подсказать" контейнеру, что именно инжектить, обычно, используется аннотация @Qualifier, но есть еще один способ:

public interface Shape {
    int angles();
}

@Primary
@Component
public class Triangle implements Shape {
    @Override
    int angles(){ return 3; }
}

@Component
public class Square implements Shape {
    @Override
    int angles(){ return 4; }
}

@Component
public class ShapeManager {
    
    @Autowired
    private Shape shape;
}

Как можно догодаться, в ShapeManager будет внедрен бин помеченный как @Primary. Если заглянуть в доку, то гласит она буквально следующее: маркер(или индикатор) того, что данному бину будет отданно предпочнение среди прочих. Если существует только один класс помеченный данной аннотацией, то он будет внедрен в качестве зависимости.

No comments:

Post a Comment