2013-07-18 2 views
0

Я переместил свой код из конфигурации Spring Spring в конфигурацию Java. У меня все работает, но у меня есть вопрос о том, как я реализовал прототипы - в основном, в то время как то, что я делаю, это лучший способ сделать это? Каким-то образом это просто отключается!Spring Javaconfig и прототипированные бобы

я написал класс компонента таким образом:

@Component 
@Scope("prototype") 
public class ProtoBean { 
    ... 
} 

Затем использовать компонент - это часть, что я просто не уверен, хотя он работает:

@Component 
public class BeanUser implements ApplicationContextAware { 
    ApplicationContext context; 

    @Override 
    public void setApplicationContext(ApplicationContext context)throws BeansException 
    { 
     this.context = context; 
    } 

    public void getProtoBean() { 
     ProtoBean protoBean = context.getBean(ProtoBean.class); 
    } 
} 

Это дает мне прототипированный боб, и в модульных тестах я просто издевался над контекстом, называемым setApplicationContext с макетом, и имел вызов getBean из mock возвращать макет ProtoBean. Так что все хорошо.

Я сделал это в XML с помощью фабрики, но это, похоже, не слишком хорошо работает, так что это то место, где я закончил. Но есть ли способ сделать это без контекста? Или просто лучший способ?

Спасибо!

+0

На данный момент вы не используете конфигурацию на основе Java. Посмотрите здесь http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java – Bart

+0

Это интересная ссылка - спасибо. Я использую @ComponentScan, чтобы выбрать это в моем java-конфигурационном классе, так что, похоже, это похоже на то же самое, и интересно, что это соответствует первому примеру, который они дают, как это сделать в вашей ссылке, - но затем они продолжаются говорить о «методе инъекции», который, по-видимому, является их предлагаемым решением. Спасибо! –

ответ

1

Я не думаю, что это проблема Spring XML и Java-base, но одна из подходящих областей зависимости. Так как Spring может выполнять инъекцию зависимостей только на компоненте с одноэлементной областью во время создания, вам нужно искать фасоль с прототипом по запросу. Конечно, текущий подход к подбору компонентов работает, но создает зависимость от ApplicationContext. Я могу предложить несколько других возможностей, но корень проблемы - это действительно то, что участвует в создании ProtoBean, и какие компромиссы вы должны принять.

Вы можете сделать BeanUser сам прототипом, который позволит вам подключаться к ProtoBean как к члену. Конечно, компромисс у вас теперь есть такая же проблема для клиентов BeanUser, но иногда это не проблема.

Другой путь может использовать что-то вроде ProtoBeanFactory с одноэлементным расширением для обеспечения экземпляров ProtoBean и скрытия зависимостей в ProtoBeanFactory.

И, наконец, вы можете использовать компонент scobe-proxy, чтобы эффективно скрыть завод. Он использует АОП, чтобы сделать это, и не всегда ясно, какие вуду у тебя есть. С XML вы должны использовать <aop:scoped-proxy/> в объявлении bean. Для аннотаций вы должны использовать:

@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype") 
Смежные вопросы