springIOC的一些扩展点解读

Spring扩展点

1、SpringIOC扩展点
1.1、bean的生命周期
  • BeanNameAware's {@code setBeanName}

  • BeanClassLoaderAware's {@code setBeanClassLoader}

  • BeanFactoryAware's {@code setBeanFactory}

  • EnvironmentAware's {@code setEnvironment}

  • EmbeddedValueResolverAware's {@code setEmbeddedValueResolver}

  • ResourceLoaderAware's {@code setResourceLoader}

============ 应用程序上下文运行时可用================ start

  • ApplicationEventPublisherAware's {@code setApplicationEventPublisher}
  • MessageSourceAware's {@code setMessageSource}
  • ApplicationContextAware's {@code setApplicationContext}

============ 应用程序上下文运行时可用================ end
============ web应用程序上下文运行时可用================ start

  • ServletContextAware's {@code setServletContext}

============ web应用程序上下文运行时可用================ end

============ 初始化阶段============================================

  • {@code postProcessBeforeInitialization} methods of BeanPostProcessors
  • InitializingBean's {@code afterPropertiesSet}
  • a custom init-method definition
  • {@code postProcessAfterInitialization} methods of BeanPostProcessors

============ 销毁阶段============================================

  • {@code postProcessBeforeDestruction} methods of DestructionAwareBeanPostProcessors
  • DisposableBean's {@code destroy}
  • a custom destroy-method definition

解释下xxxAware 我们看到bean的生命周期是先加载了一堆的Aware结尾的类。Aware意思为具有xxx的能力,假如你实现了该类型接口,你的类就具有了Aware前面描述的能力,例如

我实现了EnvironmentAware 我的当前类就拥有了Environment的能力。

public class CustomEnvironment implements EnvironmentAware{
	private static Environment environment;

	@Override
    public void setEnvironment(Environment environment) {
        CustomEnvironment.environment = environment;
    }
}

这些类的作用就是让你在做扩展的时候能够很方便直接使用IOC容器的一系列能力。

执行完Aware之后接下来就是初始化阶段执行实现了BeanPostProcessors接口的postProcessBeforeInitialization方法,然后再执行InitializingBeanafterPropertiesSet方法初始化,然后执行自定义初始化方法,然后再执行BeanPostProcessorspostProcessAfterInitialization方法。销毁阶段先执行DestructionAwareBeanPostProcessorpostProcessBeforeDestruction方法销毁需要回收的bean实例,如listener实例。接着执行DisposableBean接口的destroy方法,最后执行自定义的销毁方法。

简单的验证例子

定义一个CustomBeanPostProcessor

/**
 * @Description TODO
 * @Author 姚仲杰#80998699
 * @Date 2021/3/16 14:27
 */
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
    
    @Bean(initMethod = "customInit",destroyMethod = "customDestroy")
    TestBean testBean(){
        return new TestBean();
    }
    
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
        throws BeansException {
        if (bean instanceof TestBean) {
            System.out.println("2、BeanPostProcessor:postProcessBeforeInitialization");
        }
        return bean;
    }
    
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
        throws BeansException {
        if (bean instanceof TestBean) {
            System.out.println("5、BeanPostProcessor:postProcessAfterInitialization");
        }
        return bean;
    }

在定义一个TestBean,并在CustomBeanPostProcessor使用@Bean注解初始化设置自定义初始化以及销毁方法。按我们所知道的顺序给他们标上序号。

/**
 * @Description TODO
 * @Author 姚仲杰#80998699
 * @Date 2021/3/16 14:38
 */
public class TestBean implements InitializingBean, DisposableBean, ApplicationContextAware {
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("1、setApplicationContext");
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("3、InitializingBean:afterPropertiesSet");
    }
    /**
     * 自定义初始化
     */
    public void customInit() {
        System.out.println("4、TestBean:custom init");
    }
    
    @Override
    public void destroy() throws Exception {
        System.out.println("6、DisposableBean:destroy");
    }
    /**
     * 自定义销毁
     */
    public void customDestroy() {
        System.out.println("7、TestBean:custom destroy");
    }
    
}

然后直接运行输出结果如下。

1、setApplicationContext
2、BeanPostProcessor:postProcessBeforeInitialization
3、InitializingBean:afterPropertiesSet
4、TestBean:custom init
5、BeanPostProcessor:postProcessAfterInitialization
停止时打印如下信息
6、DisposableBean:destroy
7、TestBean:custom destroy

小提示:不要把@PostConstruct 与@PreDestroy当作自定义初始化和销毁的注解。他们不是。这两个注解执行时机时在InitializingBean:afterPropertiesSet之前和DisposableBean:destroy之前。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值