一、Bean 的生命周期
1. 什么是 Bean 的生命周期?
- Bean 的 创建 > 初始化 > 销毁。
- 由容器管理 Bean 的生命周期,可以指定 Bean 的 初始化 和 销毁方法。
- 容器启动的时候,Bean 对象就创建了。
- 容器销毁的时候,也会调用 Bean 销毁方法。
- 容器启动的时候,Bean 是不会被创建的,而是在获取 Bean 的时候被创建。
- Bean 销毁不受 IOC 容器的管理。
2. initMethod 和 destroyMethod
- initMethod 构造后。
- destroyMethod 销毁前 (多例时不会调用)。
@Scope("prototype")
@Bean(initMethod = "init", destroyMethod = "destroy")
public Qs qs() {
return new Qs();
}
3. @PostConstruct 和 @PreDestroy
- @PostConstruct 构造后。
- @PreDestroy 销毁前 (多例时不会调用)。
@Component
public class QsHome {
@PostConstruct
public void init() {
System.out.printf("`%s`init", this.getClass().getName()).println();
}
@PreDestroy
public void destroy() {
System.out.printf("`%s`destroy", this.getClass().getName()).println();
}
}
4. InitializingBean 初始化 Bean
@Component
public class MyInitializingBean implements InitializingBean {
@PostConstruct
public void init() {
System.out.printf("`%s`init", this.getClass().getName()).println();
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.printf("`%s`afterPropertiesSet", this.getClass().getName()).println();
}
}
5. DisposableBean 销毁 Bean
@Component
public class MyDisposableBean implements DisposableBean {
@PreDestroy
public void preDestroy() {
System.out.printf("`%s`preDestroy", this.getClass().getName()).println();
}
@Override
public void destroy() throws Exception {
System.out.printf("`%s`destroy", this.getClass().getName()).println();
}
}
6. BeanPostProcessor Bean 的后置处理器
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@PostConstruct
public void init() {
System.out.printf("`%s`init", this.getClass().getName()).println();
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.printf("`%s`postProcessBeforeInitialization,beanName = %s", this.getClass().getName(), beanName).println();
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.printf("`%s`postProcessAfterInitialization,beanName = %s", this.getClass().getName(), beanName).println();
return bean;
}
}
7. InstantiationAwareBeanPostProcessor 实例化 Bean 的后置处理器
@Component
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@PostConstruct
public void init() {
System.out.printf("`%s`init", this.getClass().getName()).println();
}
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
System.out.printf("`%s`postProcessBeforeInstantiation,beanName = %s", this.getClass().getName(), beanName).println();
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
System.out.printf("`%s`postProcessAfterInstantiation,beanName = %s", this.getClass().getName(), beanName).println();
return false;
}
@Override
public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
System.out.printf("`%s`postProcessPropertyValues,beanName = %s", this.getClass().getName(), beanName).println();
return pvs;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.printf("`%s`postProcessBeforeInitialization,beanName = %s", this.getClass().getName(), beanName).println();
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.printf("`%s`postProcessAfterInitialization,beanName = %s", this.getClass().getName(), beanName).println();
return bean;
}
}
二、注册 Bean
1. 四种注解方式,往 IOC 容器中添加组件
- @CompentScan + @Compent (@Controller、@Service、@Repository) 扫描 Bean,适用于自己写的组件可以通过扫描来加载到容器中。
- @Bean 适用于导入第三方组件的类。
- @Import 导入Bean,导入 组件的ID 为 全类名路径。
- @ImportResource 导入 Xml 配置文件。
2. FactoryBean 接口,往容器中注册组件
@Data
public class CarFactoryBean implements FactoryBean<Car> {
public CarFactoryBean() {
System.out.printf("`%s`无参构造", this.getClass().getName()).println();
}
@Override
public Car getObject() throws Exception {
return new Car();
}
@Override
public Class<?> getObjectType() {
return Car.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
@Data
public class DriverFactoryBean implements FactoryBean {
private String jdbcUrl;
@Override
public Object getObject() throws Exception {
return DriverManager.getDriver(jdbcUrl);
}
@Override
public Class<?> getObjectType() {
return java.sql.Driver.class;
}
@Override
public boolean isSingleton() {
return true;
}
}