Springboot 自定義Bean生命週期的另一種方式(實現InitializingBean, DisposableBean接口)

上一篇博客,我們講解了如何通過設置@Bean的參數來定製Bean的生命週期。這篇博客,我們來讓Bean的類實現InitializingBean,和DisposableBean接口來定製Bean的生命週期。

  • 實現InitializingBean,和DisposableBean接口的類:
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class College implements InitializingBean, DisposableBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Initial method is calling.");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("Destroyed method is calling.");
    }
}
  • 通過@Bean註解注入Bean
import com.michael.annotation.demo.POJO.College;
import org.springframework.context.annotation.*;

@Configuration
public class MyConfig {

    @Scope("singleton")//這裏可以不寫,Bean默認爲單例
    @Bean("St Andrews")
    public College college(){
        System.out.println("The Bean is created.");
        return new College();
    }
}
  • 測試代碼:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

import static java.lang.System.out;
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        ApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);
        out.println("The container has been initialized.");
         for(String name : applicationContext.getBeanDefinitionNames()){
             if(!name.contains("."))
                out.println(name);
        }
        out.println("The container has been destroyed.");
    }
}
  • 輸出:
The Bean is created.
Initial method is calling.
2020-03-24 18:32:22.375  INFO 24519 --- [           main] c.m.annotation.demo.DemoApplication      : Started DemoApplication in 0.611 seconds (JVM running for 0.903)
The container has been initialized.
demoApplication
test
myConfig
personService
St Andrews
propertySourcesPlaceholderConfigurer
taskExecutorBuilder
applicationTaskExecutor
taskSchedulerBuilder
The container has been destroyed.
Destroyed method is calling.
  • 輸出結果和上篇博客使用設置@Bean參數的方法得到的結果一樣。其實我們可以根據實際需求,單獨實現這兩個接口;從這一點來看,Spring設計的代碼複用性和靈活性非常明顯,推測該功能應該是由Java反射和AOP實現的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章