我正在尝试用Spring替换我的CDI / EJB注释。但我正在努力做到这一点。
这就是我在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实体?
答案 0 :(得分:1)
无状态和有状态概念是EJB;春天没有这样的概念。 Spring使用POJO,不支持有状态bean。你自己在那里。
Spring使用javax.annotation.Resource
注释;我更喜欢@Autowired
。
答案 1 :(得分:1)
Stateless
和Stateful
Bean是EJB
个概念,但Spring
通过Service Bean提供类似的服务。将@Service
注释放在Business Logic类中,如果您希望bean“无状态”或“有状态”,只需配置bean范围(如Request
或Session
)。 / p>
Spring
也有内置的事务管理API,因此您的交易注释可能需要更改。
最后,Spring
与许多持久性框架兼容,包括JPA
。如果你想保留JPA
就可以了,如果你愿意,可以根据其他技术改变它(可能Hibernate
或MyBatis
)
答案 2 :(得分:1)
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;
}