Skip to content

Bean lifecycle

-> Container started

  1. Bean instantiated
  2. Dependencies injected
  3. Internal Spring Processing
  4. Your own custom init method (init-method)
  5. Bean is ready for use
  6. Your own custom destroy method (destroy-method)

-> Container is shut down

  • Prototype scopes do not call the destroy method!

Init and destroy methods (XML)

<bean id="myFortuneService"
      class="com.hvitoi.springdemo.HappyFortuneService">
</bean>

<bean id="myCoach"
      class="com.hvitoi.springdemo.TrackCoach"
      init-method="doMyStartup"
      destroy-method="doMyCleanup">
    <!-- set up constructor injection -->
    <constructor-arg ref="myFortuneService" />
</bean>
package com.hvitoi.springdemo;

public class TrackCoach implements Coach {

    private FortuneService fortuneService;

    public TrackCoach() {}

    public TrackCoach(FortuneService fortuneService) {
        this.fortuneService = fortuneService;
    }

    @Override
    public String getDailyWorkout() {
        return "Run a hard 5k";
    }

    @Override
    public String getDailyFortune() {
        return "Just Do It: " + fortuneService.getFortune();
    }

    // init method
    public void doMyStartup() {
        System.out.println("TrackCoach: inside doMyStartup");
    }

    // destroy method
    public void doMyCleanup() {
        System.out.println("TrackCoach: inside doMyCleanup");
    }
}

Init and destroy methods (Annotations)

@PostConstruct
public void doMyStartup() {
    System.out.println(">> TennisCoach: inside of doMyStartup()");
}

@PreDestroy // Never called for prototype scopes!
public void doMyCleanup() {
    System.out.println(">> TennisCoach: inside of doMyCleanup()");
}