As you probably know, when a bean is instantiated the first called method is the corresponding constructor. Afterwards, we have the method annotated with @PostConstruct. When this method is called we say that the dependency injections is done and we can exploit the injected artifacts. By annotating a common method with @Inject, we basically instruct CDI to call this method also when the bean in instantiated. For example, the below initFooBuzzBizz() is called after the constructor, but before the @PostConstruct:
@Named
@Named
@RequestScoped
public class TheBean {
private static final Logger LOG = Logger.getLogger(TheBean.class.getName());
public TheBean() {
LOG.info("TheBean#constructor called ...");
Messages.addGlobalInfo("TheBean#constructor called ...");
}
@PostConstruct
public void init() {
LOG.info("TheBean#init() called ...");
Messages.addGlobalInfo("TheBean#init() called ...");
}
public void callFooBuzzBizzAction() {
LOG.info("TheBean#callFooBuzzBizz() called ...");
Messages.addGlobalInfo("TheBean#callFooBuzzBizz() called ...");
}
@Inject
private void initFooBuzzBizz(Foo foo, Buzz buzz, Bizz bizz) {
LOG.info("TheBean#initFooBuzzBizz() called ...");
Messages.addGlobalInfo("TheBean#initFooBuzzBizz() called ...");
foo.fooify();
buzz.buzzify();
bizz.bizzify();
}
}
The output will be:
- TheBean#constructor called ...
- TheBean#initFooBuzzBizz() called ...
- Foo#fooify() called ...
- Buzz#buzzify() called ...
- Bizz#bizzify() called ...
- TheBean#init() called ...
- TheBean#callFooBuzzBizz() called ...
The complete example is available here,