2015-08-14 4 views
4

Вопрос:Vaadin компонентов, как Spring фасоли

Когда Vaadin компонент может быть фасоли весной контейнера (@SpringComponent аннотаций)?

Вопрос уточнение:

Я задаю этот вопрос, потому что я знаю, что Vaadin View может быть пружинный боб после использования @SpringView. Но если я комментирую Button компонент с @SpringComponent, он будет создан только один раз. Может ли это возникнуть проблема?

Пример:

У меня есть много JpaRepository фасоли:

public interface CustomerRepository extends JpaRepository<Customer, Long> 
// ... 

public interface UserRepository extends JpaRepository<User, Long> { 
// ... 

И я хочу использовать их в разных местах - например, в качестве компонента Tab (в Vaadin Tabsheet). Поэтому у меня есть идея - tabContent может быть также рессоры:

@SpringView(name = "viewName") 
public class SomeView extends VerticalLayout implements View { 

    @Autowired 
    private SomeTabContent tabContent; 
    //... 
    public void init() { // call every view enter() 
     removeAllComponents(); 
     // Initialize whole view. 
     tabSheet.addTab(tabContent, /* ... */); 
     // ... 
    } 

И тогда я могу вводить все необходимые бобы:

@SpringComponent 
public class SomeTabContent extends VerticalLayout { 
    @Autowired 
    private CustomerRepository customerRepository; 

    @Autowired 
    private UserRepository UserRepository; 
} 

ли это правильная архитектура?

Примечание: Я знаю, что у Vaadin есть функции CDI и Data Binding, но я не хочу их использовать. Я также знаю, что я мог вручную создать контекст приложения Spring в любом месте, но я думаю, что это не правильно.

ответ

1

После увеличения моих знаний у меня есть гипотеза.

Можем ли мы использовать компонент Vaadin в качестве весеннего боба? Почему нет. Я пробовал это, и он работает. Но ...

Но это вызывает также вызовы нескольких слушателей - поскольку у меня есть объект Button с классом.

Spring создает экземпляр компонента самостоятельно и помещает его где-нибудь. Поэтому я не могу ничего сделать в конструкторе компонентов. Кроме того, такой компонент следует очищать и инициализировать перед любым использованием. Звучит ли это странно? Я думаю да. И это может вызвать множество проблем - особенно в многопоточной среде.

Поэтому я не рекомендую создавать компонент любых компонентов Vaadin (например, Tab, Buttons ...). Потому что им нужно изменить свое состояние в зависимости от места использования.

Но как сделать доступными все весенние бобы в объекте, который не поддерживается весенним контейнером? Это не новый вопрос, и есть по крайней мере два решения:

  1. Annotate такой класс с @Configurable и дать возможность любому ткачеству (компилировать или время работы). Это объясняется, например, here или here.

  2. Непосредственно использование AutowireCapableBeanFactory и autowiredBeanProperty() способ. Небольшое объяснение можно найти here, а также на SO.

2

Если вы используете только @Component (или @SpringComponent) класс будет инстанцирован один раз для приложения, так что, да, вы получите проблемы с несколькими сеансами обмена результирующих объектов, когда вы не хотите, чтобы они , Итак, вы добавляете @UIScope. Это обеспечит получение одного экземпляра этого класса за сеанс. Вы можете хранить данные сеанса в классе (так же, как если бы вы использовали SpringSession, но для этого требуется использовать диспетчер Spring).

В классе @UIScope вы можете использовать @Autowired и @PostConstruct и т. Д. Я использую его для продолжения Windows и макета и т. Д. Вам нужен com.vaadin: vaadin-spring: 1.0.0 на вашем пути к классам. Дополнительная информация о vaadin-spring