4 Replies Latest reply: Sep 1, 2010 9:18 AM by nimo stephan RSS

PostConstruct and PreDestroy of Bean

nimo stephan Master

I have something like this:





@SessionScoped @Named
public class A{

        @PersistenceContext EntityManager entityManager;

        @Inject B b;
        public B getB() {return b;}
        public void setB(B ob) {this.b = b;}

        @PostConstruct
        public void initialize()
        {
                System.out.println("@PostConstruct");
                System.out.println("Instance of B was constructed via inject.");
        }

        
           public void retrieveRecordsOfB(){

             b.setRecords(entityManager.createNamedQuery("getRec").getResultList());
        }

        @PreDestroy
        public void preDestroy()
        {
                System.out.println("@PreDestroy");
                System.out.println(this.getClass().getSimpleName() + " was destroyed.");
        }

}




and referred this bean in jsf-page:



<h:commandButton action="#{a.retrieveRecordsOfB}" value="retrieve"/>




I explored, that when viewing this page then the PreDestroy-Method is called even the session is not finished - why is the Instance of A instantly destroyed after it was constructed?


14:17:23,471 INFO  [STDOUT] @PostConstruct
14:17:23,471 INFO  [STDOUT] Instance of B was constructed via inject.
14:17:23,471 INFO  [STDOUT] @PreDestroy
14:17:23,471 INFO  [STDOUT] @PreDestroy A was destroyed





Another point is, that when clicking on retrieveRecordsOfB, then the database query is called twice (I guess, because of getter/setter). I have thought that this was solved in JSF2 or Weld?