Spring bean初始化及销毁方法
共几种初始化方式
public class TestBean implements InitializingBean , CommandLineRunner , DisposableBean , ApplicationRunner { private String x; @Override public void afterPropertiesSet() throws Exception { System.out.println("执行了InitializingBean-afterPropertiesSet"); } public void init(){ System.out.println("执行了initMethod-init"); } public void destroy(){ System.out.println("执行了DisposableBean-destroy"); } public void des(){ System.out.println("执行了destroyMethod-des"); } @Override public void run(String... args) { System.out.println("执行了CommandLineRunner-run"); } @PostConstruct private void run(){ System.out.println("执行了PostConstruct-run"); } @PreDestroy private void predestory(){ System.out.println("执行了PreDestroy-PreDestroy"); } @Override public void run(ApplicationArguments args) throws Exception { System.out.println("执行了ApplicationRunner-run"); } }
@Configuration public class HttpSessionConfig { @Bean(initMethod = "init",destroyMethod = "des") @Scope("prototype") //多例模式 默认时单例模式 public TestBean testBean(){ return new TestBean(); } /*@Bean public ServletRegistrationBean servletRegistrationBean(){ return new ServletRegistrationBean( new TestServlet1(),"/test"); }*/ }
bean单例模式下(注解的默认情况是单例,Scope(“singlon”),多例模式为Scope(“prototype”))@PostConstruct注解、implements InitializingBean重写afterPropertiesSet方法、@Bean的 initMethod属性指定的bean的成员方法、implements ApplicationRunner接口的run方法、implements CommandLineRunner的run方法,执行顺序和罗列顺序保持一致,而且执行afterPropertiesSet和initMethod有相关性,afterPropertiesSet执行出错则initMethod不会执行。单例模式下spring容器会在其启动时创建对象并实例化,多例模式则不会,会在获取时创建。单例模式下,容器关闭时会一次调用@PreDestroy注解标注方法、implements DisposableBean的destroy方法、@Bean的destroyMethod指定的成员方法。
bean的实例化:调用bean的构造方法,我们可以在bean的无参构造方法中执行相应的逻辑。
bean的初始化:在初始化时,可以通过BeanPostProcessor的postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法进行拦截,执行自定义的逻辑;通过@PostConstruct注解、InitializingBean和init-method来指定bean初始化前后执行的方法,在该方法中咱们可以执行自定义的逻辑。
bean的销毁:可以通过@PreDestroy注解、DisposableBean和destroy-method来指定bean在销毁前执行的方法,在该方法中咱们可以执行自定义的逻辑。
bean的生命周期


浙公网安备 33010602011771号