参考:
@Produces 动态bean:
就是我在运行的时候获得动态的东西。如果按我们之前将的方式来做。获得的对象并不是动态的。因为注解加在了类上面,所以在运行时期就是这个实现类,并不能改变。
动态的关键技术就是注解加上方法上,获得的Bean是方法的返回值。既然是方法,那么方法里就可以写各种代码来实现了。这就是动态。
还是拿之前的jboss quickstart项目来分析:
新增数据之后,页面列表实现动态刷新显示
<p:dataList value="#{myMembers}" var="_member" >
<f:facet name="header">
Member
</f:facet>
<p:panel header="#{_member.name}">
<h:outputText value="#{_member.email}" class="removeBtn"/>
</p:panel>
</p:dataList>
定位:#{myMembers}
这里使用到动态注入 @Produces 就是 getMyMembers 方法,返回 myMembers
根据 reGetMemberList(@Observes)观察者从注册页面 CDI fire方法 接收传递过来的事件,重新给myMembers赋值,返回新的myMembers,实现页面动态刷新。
@RequestScoped
public class MyMemberListProducer {
private List<Member> myMembers;
@Inject
private EntityManager em;
@Produces //动态注入 方法
@Named
public List<Member> getMyMembers() {
return myMembers;
}
// 新增完以后 会通知观察者 重新获取数据 实现当前页面的刷新
public void reGetMemberList(@Observes Member member) {
getMemberList();
}
// 构造函数以后执行这里
@PostConstruct
public void getMemberList() {
myMembers = memberList();
}
public List<Member> memberList() {
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Member> query = criteriaBuilder.createQuery(Member.class); // createQuery的参数是Query返回值类型
Root<Member> member = query.from(Member.class); // 参数是对应于order表的实体类,query.from类似于sql中的from语句,该方法的执行等价于sql中的from
// 默认查询全部
query.select(member); // query.select(root)则等价于select *
TypedQuery<Member> tq = em.createQuery(query);
List<Member> list = tq.getResultList();
return list;
}
}
标识生产者方法或字段。 可以应用于bean类的方法或字段。
生成器方法必须是托管bean类或会话bean类的非抽象方法。
生产者方法可以是静态的也可以是非静态的。 如果bean是会话bean,则producer方法必须是EJB的业务方法或bean类的静态方法。