Tobia
Tobia

Reputation: 9506

Spring PostConstruct of a container

How can I run some code inside a Spring Container after all beans has been loaded? I know I can use @PostConstruct for a single bean, but I would like to run that piece of code after all PostConstructs are called. Is is possibile?

---UPDATE---

I tried to follow the ApplicationListener way, this is the implementation:

@Component
public class PostContructListener implements ApplicationListener<ContextRefreshedEvent> {

    private static Logger log = LoggerFactory.getLogger(PostContructListener.class);

    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        Collection<Initializable> inits= contextRefreshedEvent.getApplicationContext().getBeansOfType(Initializable.class).values();
        for (Initializable initializable : inits) {
            try{
                log.debug("Initialization {} ",initializable.getClass().getSimpleName());
                initializable.init();
            }catch(Exception e){
                log.error("Error initializing {} ",initializable.getClass().getSimpleName(),e);
            }
        }
    }
}

Applying "Initializable" interface to all services I got what I needed, how every this way I broke all autowires, I cannot understand why but seems to be connected to the new "Initializable" interface:

java.lang.IllegalArgumentException: Can not set com.service.MyService field com.controller.RestMultiController.myService to com.sun.proxy.$Proxy41

Upvotes: 2

Views: 547

Answers (1)

Duncan
Duncan

Reputation: 717

I think you need this.

public class SpringListener implements ApplicationListener<ContextRefreshedEvent>{

        public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent ) {
                 // do things here
        }
    }

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#context-functionality-events

Upvotes: 1

Related Questions