CDI——生命周期管理
参考:
主要就是两个注解:
@PostConstruct与@PreDestroy
Java EE5 引入了@PostConstruct和@PreDestroy这两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操作。
页面显示的时候,从后台获取数据显示。
<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>
@RequestScoped
public class MyMemberListProducer {
// 构造函数
public MyMemberListProducer() {
System.out.println("MyMemberListProducer 构造函数");
}
private List<Member> myMembers;
@Inject
private EntityManager em;
@Produces //动态注入 方法
@Named
public List<Member> getMyMembers() {
return myMembers;
}
// 新增完以后 会通知观察者 重新获取数据 实现当前页面的刷新
public void reGetMemberList(@Observes Member member) {
System.out.println("@Observes:" + member.getName());
getMemberList();
}
// 构造函数以后执行这里
@PostConstruct
public void getMemberList() {
System.out.println("MyMemberListProducer @PostConstruct");
myMembers = memberList();
}
public List<Member> memberList() {
System.out.println("开始查询数据库...");
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 *
// 条件查询
// Predicate condition = criteriaBuilder.equal(member.get("name"), "王灵生");
// query.where(condition);
TypedQuery<Member> tq = em.createQuery(query);
List<Member> list = tq.getResultList();
return list;
}
@PreDestroy
public void destroy() {
System.out.println("Destroying...");
}
}
15:47:43,997 INFO [stdout] (default task-2) MyMemberListProducer 构造函数
15:47:44,001 INFO [stdout] (default task-2) MyMemberListProducer @PostConstruct
15:47:44,001 INFO [stdout] (default task-2) 开始查询数据库...
15:47:44,068 INFO [stdout] (default task-2) Hibernate: select member0_.id as id1_0_, member0_.email as email2_0_, member0_.name as name3_0_, member0_.phone_number as phone_number4_0_ from TT_Member member0_
15:47:44,099 INFO [stdout] (default task-2) Destroying...
整个流程就是构造函数
1)构造函数
2)@PostConstruct
3)@PreDestroy
构造函数与@PostConstruct 二者的区别:
jsf-2 – JSF – 从构造函数的@PostConstruct和直接方法调用之间有什么区别?
分析得很详细
二者都可以初始化,构造函数的时候bean是没有初始化的,无法执行查询等操作,只有的时候bean才会完全初始化
才可以执行下面操作。
要是没有涉及到bean的初始化,@PostConstruct就是多余的。
补充(注意一下几点):
- 只有一个方法可以使用此注释进行注解;
- 被注解方法不得有任何参数;
- 被注解方法返回值为void;
- 被注解方法不得抛出已检查异常;
- 被注解方法需是非静态方法;
- 此方法只会被执行一次;
使用此注解时会影响到服务的启动时间。
服务器在启动时会扫描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包。