2013-11-15 2 views
1

Я использую Spring для этого проекта, но у меня была такая же проблема с Guice.Передача состояния контейнерам, управляемым CDI

В принципе, у меня есть функциональность, для которой необходимы как помощники без состояния, так и данные состояния.

public class AwesomeDoer { 
    @Inject 
    private Helper helper; //stateless 
    ... 
    public void doAwesome(int state) { 
     helper.help(state) 
    } 

} 

Это выглядит довольно хорошо, пока doAwesome не имеет 5 параметров и вызываются 1000 раз, но 3 из аргументов имеют одинаковое значение каждый раз, в то время как четвертый аргумент может измениться лишь несколько раз. Изменение подходящих параметров в полях является очевидным решением. Тем не менее, это требует от вас жертвовать либо управлением CDI этого класса, либо вы должны иметь инициализатор или сеттеры, чтобы заполнить состояние после того, как весна делает свое дело.

Я обычно удосужился, создав завод, управляемый Spring, т.е.

public class AwesomeFactory { 
    @Inject 
    private Helper helper; 

    public AwesomeDoer getAwesomeDoer(int state) { 
     return new AwesomeDoer(helper, state); 
    } 
} 

Но опять же, это не означает, что мой AwesomeDoer больше не управляется Spring, и это требует от меня, чтобы написать еще еще один уровень не-бизнес-логики. Также легко представить себе такой подход, который приведет к созданию AwesomeFactoryFactory и т. Д., Что всегда заставляет меня немного умереть внутри.

У кого-нибудь есть более чистый способ сделать это?

+0

Всякий раз, когда возникает слишком много параметров, вводите контекст или объект передачи, например 'StateDTO' или' StateContext', который обертывает параметры. Это было бы лучше, чем «обходной путь» с aop. – membersound

ответ

1

Вы можете пометить свой bean-компонент, используя @Configurable от Spring, и создать его с помощью new AwesomeDoer и передать параметры в вашем конструкторе. @Configurable заставляет вас создавать бобы по требованию, а фасоль будет управляться весной, чтобы уволить инъекции, такие как @Autowired.

Дополнительная информация: Create a bean using new keyword and managed by Spring, проверьте раздел внизу.

+0

Хм ... Это довольно круто. Он по-прежнему жертвует некоторыми из МОК, и мне очень неприятно отлаживать код AOP, но я обязательно посмотрю на этот – Floegipoky

+1

@Floegipoky, здесь нет серебряной пули :(, иначе все люди будут использовать его :). –

+0

* Вставьте что-нибудь о том, что нужно заплатить за обед. * Знаете ли вы, что это влияет на остальную часть жизненного цикла компонента? Могу ли я использовать метод уничтожения и все эти хорошие вещи? – Floegipoky

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