CDI——生命周期管理

参考:

CDI技术第七步 生命周期管理

注解@PostConstruct与@PreDestroy详解及实例

主要就是两个注解:

@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就是多余的。

CDI——生命周期管理

 

补充(注意一下几点):

  • 只有一个方法可以使用此注释进行注解;
  • 被注解方法不得有任何参数;
  • 被注解方法返回值为void;
  • 被注解方法不得抛出已检查异常;
  • 被注解方法需是非静态方法;
  • 此方法只会被执行一次;

使用此注解时会影响到服务的启动时间。

服务器在启动时会扫描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包。