admin管理员组文章数量:1586729
参考:
CDI学习第二步,BEAN作用域
JAVA CDI 学习(2) - Scope 生命周期
这里慢慢整理,从用到开始。
1、@RequestScoped
每次request都会执行,h:commandButton 每次action就是一次request,相应的所有带有@RequestScoped的方法都会执行。
刷新页面也是一次request
<br /> 新增
<h:form>
<h:panelGrid columns="2">
<h:outputLabel value="name" for="name"/>
<h:inputText value="#{myNewMember.name}" id="name"/>
<h:outputLabel value="email" for="email"/>
<h:inputText value="#{myNewMember.email}" id="email"/>
<h:outputLabel value="phoneNumber" for="phoneNumber"/>
<h:inputText value="#{myNewMember.phoneNumber}" id="phoneNumber"/>
<h:commandButton action="#{myController.myRegister()}" value="register" />
</h:panelGrid>
</h:form>
2、@ApplicationScoped
一个web应用就用这一个查询方法,维护整个应用。
@ApplicationScoped
public class MemberRepository {
@Inject
private EntityManager em;
public Member findById(Long id) {
return em.find(Member.class, id);
}
public Member findByEmail(String email) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> criteria = cb.createQuery(Member.class);
Root<Member> member = criteria.from(Member.class);
// Swap criteria statements if you would like to try out type-safe criteria queries, a new
// feature in JPA 2.0
// criteria.select(member).where(cb.equal(member.get(Member_.name), email));
criteria.select(member).where(cb.equal(member.get("email"), email));
return em.createQuery(criteria).getSingleResult();
}
public List<Member> findAllOrderedByName() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> criteria = cb.createQuery(Member.class);
Root<Member> member = criteria.from(Member.class);
// Swap criteria statements if you would like to try out type-safe criteria queries, a new
// feature in JPA 2.0
// criteria.select(member).orderBy(cb.asc(member.get(Member_.name)));
criteria.select(member).orderBy(cb.asc(member.get("name")));
return em.createQuery(criteria).getResultList();
}
}
3、@ConversationScoped
对于一个持续的会话,维护一个对象。服务器可以用代码来控制conversation何时结束
CDI(Weld)基础<4>Scopes and contexts
ConversationScope其实功能上和传统的SessionScope是有点像的,但不一样的是SessionBean是不能手动控制的.也就是说会话结束,你的SessionBean才会销毁,所以用的时候很谨慎.但Conversation则可以手动进行开启,删除.如果@ConversationScoped不开启,相当于@RequestScoped.如果开启了,相当于一个可以让开发者能手动删除的@SessionScoped.
我们在web开发中,经常会用到ajax,page1上的ajax向另一个页面page2发起请求时,会建立client到server的短时连接,如果想在ajax请求期间,让多个page之间共同访问一些变量(或对象),请求结束时这些对象又自动销毁(注:显然SessionScoped、ApplicationScoped、RequestScoped都不太适合这种需求),这时可以考虑使用ConversionScoped.
ConversationScoped,默认与RequestScoped一致,但是如果开始了会话,并将cid传递过去,那么就可以在多个HTTP请求共享一个对象。OA系统中就是用到了@ConversationScoped 用户登录以后,只要不超时,所有的增删改查操作都会共享一个对象,省去了对象的创建。
@Named
@ConversationScoped
public class ClientHome extends EntityHome<Client, String> {
private static final long serialVersionUID = 1L;
@Override
public void initConversation() {
super.initConversation();
conversation.setTimeout(1000 * 60 * 5);
}
}
public void initConversation() {
if (conversation.isTransient()) {
conversation.begin();
}
}
public void flush() {
if (!conversation.isTransient())
conversation.end();
}
版权声明:本文标题:CDI——bean作用域 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1725458721a1024523.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论