spring小知识点–Bean的初始化方法和销毁方法该如何设置()-spring
spring小知识点–Bean的初始化方法和销毁方法该如何设置()
1. 含义
如果仅仅看属性名称的话,那就是指 AbstractBeanDefinition类中 initMehtodName和destroyMethodName,但我们这里想说的是有哪些初始化以及销毁方式;
2. 设置方式
2.1 @Bean注解设置这2个属性
@Bean注解中存在 initMethod 和 destroyMethod 这2个属性,分别规定 初始化方法 和 销毁方法;
比如:
@Configuration
public class BeanConfigTest{
@Bean(initMethod = "init", destroyMethod = "destroyTest")
public BeanTest getBean() {
return new BeanTest();
}
}
package com.apache
public class BeanTest {
public void init() {}
public void destroyTest() {}
}
@Bean注解是在 ConfigurationClassPostProcessor#processConfigBeanDefinitions() 类中解析的,具体是 ConfigurationClassBeanDefinitionReader#loadBeanDefinitions() 类进行解析;
@Bean注解是在 ConfigurationClassPostProcessor#processConfigBeanDefinitions() 类中解析的,具体是 ConfigurationClassBeanDefinitionReader#loadBeanDefinitions() 类进行解析;
2.2 @PostContruct注解和@PreDestroy注解
@PostContruct注解定义的是初始化方法;
@PreDestroy注解定义的是销毁方法;
比如:
@Component
public class PostPreTest {
@PostConstruct
public void init() {}
@PreDestroy
public void destroy() {}
}
这2个注解都是 CommonAnnotationBeanPostProcessor#postProcessMergedBeanDefinition() 类进行解析的,当然,主要是利用了InitDestroyAnnotationBeanPostProcessor#postProcessMergedBeanDefinition() 里面的方法(CommonAnnotationBeanPostProcessor 继承 InitDestroyAnnotationBeanPostProcessor);
这2个注解都是 CommonAnnotationBeanPostProcessor#postProcessMergedBeanDefinition() 类进行解析的,当然,主要是利用了InitDestroyAnnotationBeanPostProcessor#postProcessMergedBeanDefinition() 里面的方法(CommonAnnotationBeanPostProcessor 继承 InitDestroyAnnotationBeanPostProcessor);
2.3 实现初始化和销毁接口
接口InitializingBean#afterPropertiesSet() 定义一个初始化方法
接口DisposableBean#destroy() 定义一个销毁方法
@Component
public class InitializingBeanTest implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() {
...
}
@Override
public void destroy() {
...
}
}
在创建bean对象时,AbstractAutowireCapableBeanFactory#invokeInitMethod() 类中会判断类是否是InitializingBean类型,如果是,则调用afterPropertiesSet()方法来实现初始化;
AbstractAutowireCapableBeanFactory#registerDisposableBeanIfNecessary()会注册detroy()方法;
在创建bean对象时,AbstractAutowireCapableBeanFactory#invokeInitMethod() 类中会判断类是否是InitializingBean类型,如果是,则调用afterPropertiesSet()方法来实现初始化;
AbstractAutowireCapableBeanFactory#registerDisposableBeanIfNecessary()会注册detroy()方法;
2.4 xml设置这2个方法(了解即可)
<bean id="test" class="com.apache.BeanTest" init-method="init" destroy-method="destroyTest" />
PS
第1种方式 外面的类上需要使用@Configuration注解,这样类中的@Bean注解才能被解析;
第2,3种方式类上需要@Component注解,以便类能够被spring容器扫描到;
1. 含义
如果仅仅看属性名称的话,那就是指 AbstractBeanDefinition类中 initMehtodName和destroyMethodName,但我们这里想说的是有哪些初始化以及销毁方式;
2. 设置方式
2.1 @Bean注解设置这2个属性
@Bean注解中存在 initMethod 和 destroyMethod 这2个属性,分别规定 初始化方法 和 销毁方法;
比如:
@Configuration
public class BeanConfigTest{
@Bean(initMethod = "init", destroyMethod = "destroyTest")
public BeanTest getBean() {
return new BeanTest();
}
}
package com.apache
public class BeanTest {
public void init() {}
public void destroyTest() {}
}
@Bean注解是在 ConfigurationClassPostProcessor#processConfigBeanDefinitions() 类中解析的,具体是 ConfigurationClassBeanDefinitionReader#loadBeanDefinitions() 类进行解析;
@Bean注解是在 ConfigurationClassPostProcessor#processConfigBeanDefinitions() 类中解析的,具体是 ConfigurationClassBeanDefinitionReader#loadBeanDefinitions() 类进行解析;
2.2 @PostContruct注解和@PreDestroy注解
@PostContruct注解定义的是初始化方法;
@PreDestroy注解定义的是销毁方法;
比如:
@Component
public class PostPreTest {
@PostConstruct
public void init() {}
@PreDestroy
public void destroy() {}
}
这2个注解都是 CommonAnnotationBeanPostProcessor#postProcessMergedBeanDefinition() 类进行解析的,当然,主要是利用了InitDestroyAnnotationBeanPostProcessor#postProcessMergedBeanDefinition() 里面的方法(CommonAnnotationBeanPostProcessor 继承 InitDestroyAnnotationBeanPostProcessor);
这2个注解都是 CommonAnnotationBeanPostProcessor#postProcessMergedBeanDefinition() 类进行解析的,当然,主要是利用了InitDestroyAnnotationBeanPostProcessor#postProcessMergedBeanDefinition() 里面的方法(CommonAnnotationBeanPostProcessor 继承 InitDestroyAnnotationBeanPostProcessor);
2.3 实现初始化和销毁接口
接口InitializingBean#afterPropertiesSet() 定义一个初始化方法
接口DisposableBean#destroy() 定义一个销毁方法
@Component
public class InitializingBeanTest implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() {
...
}
@Override
public void destroy() {
...
}
}
在创建bean对象时,AbstractAutowireCapableBeanFactory#invokeInitMethod() 类中会判断类是否是InitializingBean类型,如果是,则调用afterPropertiesSet()方法来实现初始化;
AbstractAutowireCapableBeanFactory#registerDisposableBeanIfNecessary()会注册detroy()方法;
在创建bean对象时,AbstractAutowireCapableBeanFactory#invokeInitMethod() 类中会判断类是否是InitializingBean类型,如果是,则调用afterPropertiesSet()方法来实现初始化;
AbstractAutowireCapableBeanFactory#registerDisposableBeanIfNecessary()会注册detroy()方法;
2.4 xml设置这2个方法(了解即可)
<bean id="test" class="com.apache.BeanTest" init-method="init" destroy-method="destroyTest" />
PS
第1种方式 外面的类上需要使用@Configuration注解,这样类中的@Bean注解才能被解析;
第2,3种方式类上需要@Component注解,以便类能够被spring容器扫描到;