2012-02-26 3 views
0

Какой из них является лучшим способом инъекции моих зависимостей? ЗАЧЕМ? В чем разница между этими двумя?Java - Правильный способ инъекции зависимостей?

public abstract class Service { 

    private IConfig config; 

    @Inject 
    public Service(IConfog config) { 
     this.config = config 
    } 
} 

ИЛИ

public abstract class Service { 

    @Inject private IConfig config; 

    @Inject 
    public Service() { 

    } 
} 

ответ

4

Конструктор инъекции (1-е) предпочтительнее, чем инкубационном инъекции, учитывая, что это делает его легче поддерживать «неизменные» сущности или объекты, поведение которых хорошо определены и немодифицируемые после строительства , Constructor vs Setter inject

Для меня эмпирическое правило должно сначала впрыснуть конструктор и перейти к установке инъекции, если инжектор конструктора требует, чтобы я сгибал спину, то есть при работе с устаревшим кодом с методами «ОГП-приемник и сеттер».

EDIT: Я предполагаю, что вы пытаетесь решить конструктор «конструктор» и «сеттер». Но также кажется, что вы используете абстрактные классы, которые не могут быть созданы. Может быть, у вас есть что-то еще?

+0

Не могу сказать, какой путь лучше для инъекции образца, лучше, если во время построения мы не можем или не хотим вводить зависимости. – MJM

3

Прежде всего, я не помещаю аннотации, связанные с инъекциями, в абстрактных классах - на мой взгляд, нет смысла решать, как что-то должно быть создано, если оно на самом деле не может быть создано (конечно, это только мое мнение, может согласиться или нет).

Обычно я делаю это следующим образом:

public abstract class AbstractService { 

    private IConfig config; 

    public AbstractService(IConfog config) { 
    this.config = config 
    } 
} 

public class Service extends AbstractService { 
    @Inject 
    public Service(IConfig config) { 
    super(config); 
    } 
} 

Теперь вы можете использовать оба класса с и без зависимостей (построить его вручную, пройдя все необходимые ссылки). Также вы можете быть уверены, что Служба создается в соответствующем состоянии каждый раз.

1

Основной целью внедрения зависимостей, чтобы сделать модульное тестирование легко, позволяя делать

Service serviceToTest = new Service(mockConfig); 

или

Service serviceToTest = new Service(); 
serviceToTest.setConfig(mockConfig); 

Второй способ инжекции зависимостей делает невозможным сделать abover. Вы можете только протестировать его, предоставив Guice создать сервис и ввести ложную зависимость, или используя отражение, чтобы установить зависимость mock.

Смежные вопросы