Перенос аннотаций CDI / EJB в аннотации Spring - PullRequest
2 голосов
/ 04 марта 2012

Я пытаюсь заменить свои аннотации CDI / EJB на Spring.Но я изо всех сил пытаюсь сделать это правильно.

Вот что я имею в CDI / EJB:

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
class Service {
    @Inject
    EntityManager em;
}


@Named
@RequestScoped
class Facade {
    @Inject
    Service service;
}

Теперь я бы сделал следующее:

@Stateless
@Transactional
@Repository
class Service {
    @Inject
    EntityManager em;   
}

А как насчет лиц без гражданства?Что такое водный ресурс весной?Очевидно, что я не могу просто удалить эту аннотацию, потому что я получаю следующее исключение:

javax.el.PropertyNotFoundException: /input.xhtml @15,30 registerButtonAction="#{facade.createNew()}": The class 'Facade$Proxy$_$$_WeldClientProxy' does not have the property ...

Далее:

@Named
@Service
class Facade {
    @Autowired
    Service service;
}

Нужно ли просто заменять все аннотации @Inject на @Autowired?Есть ли в Spring что-нибудь, что позаботится об именовании EL, чтобы я мог удалить @Named?

Нужно ли мне также аннотировать объекты JPA?

Ответы [ 3 ]

1 голос
/ 04 марта 2012
Бины

Stateless и Stateful являются концепциями EJB, но Spring предлагает аналогичные услуги через сервисные бины.Поместите аннотацию @Service в свои классы бизнес-логики, и, если вы хотите, чтобы ваши bean-компоненты были "не сохраняющими состояние" или "Stateful", просто настройте свою область действия (например, Request или Session).

Spring также имеет встроенный API управления транзакциями, поэтому ваши аннотации транзакций, возможно, придется изменить.

Наконец, Spring совместим со многими средами персистентности, включая JPA.Если вы хотите сохранить JPA, то все в порядке, и можете смело менять его на другую технологию, если хотите (возможно, Hibernate или MyBatis)

1 голос
/ 22 августа 2012

Spring поддерживает @Inject и @Named напрямую.Нет необходимости использовать @Autowired и @Component (эквиваленты Spring), если вы не хотите.Не нужно вводить @Resource.

// This is a singleton by default, which is OK since you previously
// had it marked as stateless
@Named
@Transactional(propagation=Propagation.REQUIRES_NEW)
class Service {
    @PersistenceContext   // Use JPA's usual annotation
    EntityManager em;
}

// You may not still need this, but if you do ...
@Named
@Scope("request")
class Facade {
    @Inject
    Service service;
}
1 голос
/ 04 марта 2012

Концепции без сохранения состояния и состояния - это EJB; Весна не имеет такого понятия. Spring использует POJO без какой-либо поддержки bean-компонентов с состоянием. Вы там одни.

Spring использует javax.annotation.Resource аннотацию; Я предпочел бы это @Autowired.

...