一文了解Spring提供的几种扩展能力

基于 spring bean 的扩展

1. BeanPostProcessor

spring 提供的针对 bean 的初始化过程时提供的扩展能力,从方法名也很容易看出,提供的两个方法分别是为 bean 对象提供了初始化之前以及初始化之后的扩展能力。

package com.wyl.conf;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
   

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
   
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
   
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}

2. InstantiationAwareBeanPostProcessor

package com.wyl.conf;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
   

    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
   
        // 相当于new这个bean对象之前
        return InstantiationAwareBeanPostProcessor.super.postProcessBeforeInstantiation(beanClass, beanName);
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
   
        // 相当于new这个bean对象之后
        return InstantiationAwareBeanPostProcessor.super.postProcessAfterInstantiation(bean, beanName);
    }

    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
   
        // 在注入bean对象属性时调用,@Autowired注解就是基于此方法实现的
        return InstantiationAwareBeanPostProcessor.super.postProcessProperties(pvs, bean, beanName);
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
   
        // 初始化这个bean对象,被spring注入上下文中之前
        return InstantiationAwareBeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
   
        // 初始化这个bean对象,被spring注入上下文中之后
        return InstantiationAwareBeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}

3. InitializingBean

package com.wyl.conf;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

@Component
public class MyInitializing implements InitializingBean {
   
    @Override
    public void afterPropertiesSet() throws Exception {
   
        System.out.println("===MyInitializing===");
    }
}

4. 初始化器(ApplicationContextInitializer)

ConfigurableEnvironment 中注册一些 property sources 或获取 getBeanFactory 来访问容器中的 bean

package com.wyl.initializer;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;

public class MyInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
   
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
   

        // environment
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        MutablePropertySources propertySources = environment.getPropertySources();
        String[] activeProfiles = environment.getActiveProfiles();

        // beanFactory
        applicationContext.getBeanFactory().addBeanPostProcessor(new BeanPostProcessor() {
   
            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
   
                return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
            }
        });
    }
}

同样可通过 spring.factories 方式进行注册

org.springframework.context.ApplicationContextInitializer=\
com.wyl.initializer.MyInitializer

5. BeanFactoryPostProcessor

package com.wyl.conf;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
   
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
   
        System.out.println("MyBeanFactoryPostProcessor---postProcessBeanFactory");
    }
}

基于 spring boot 的扩展

1. 监听器(SpringApplicationRunListener)

这是针对 SpringApplication.run 方法执行时提供的一种监听能力,可以在服务启动的多个阶段进行控制。

package com.wyl.listener;

import org.springframework.boot.ConfigurableBootstrapContext;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码拉松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值