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();
	}

 

 

 

本文标签: 作用CDIbean