静下心来的个人专栏
上一篇

Spring BeanPostProcessor 自定义 bean

广告
选中文字可对指定文章内容进行评论啦,→和←可快速切换按钮,绿色背景文字可以点击查看评论额。
大纲

Spring BeanPostProcessor 自定义 bean

Spring BeanPostProcessor beans 是一种特殊的 beans,它在任何其他 beans 之前创建,Spring 允许您为其分配自定义回调。Spring提供了BeanPostProcessor接口,你可以实现它的方法来提供你自己的实例化逻辑和依赖解析逻辑。

使用 BeanPostProcessor 之前,注意一下内容

1、BeanPostProcessor 方法在 Spring IoC 完成实例化、配置和初始化 bean 后执行。

2、您可以插入一个或多个自定义 BeanPostProcessor 实现。

3、当使用多个 Bean Postprocessors时,您应该实现 Ordered 接口来控制这些处理器的执行顺序。

4、请记住,BeanPostProcessor 实例的范围是每个容器。

 

BeanPostProcessor 使用示例

您需要做的就是在您的自定义类中实现接口 BeanPostProcessor。接口如下图,表示你可以实现自己喜欢的方法,默认每个方法都返回bean。

public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) 
    throws BeansException {
        return bean;
  }
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) 
    throws BeansException {
        return bean;
   }
}

您需要做的就是实现接口并实现回调方法。下面的代码解释了 Spring BeanPostProcessor 的简单使用。

TraceBeanPostProcessor

@Component
public class TraceBeanPostProcessor implements BeanPostProcessor {
  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName)
      throws BeansException {
    System.out.println("Inside postProcessBeforeInitialization - " + beanName);
    return bean;
  }
  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName)
      throws BeansException {
    System.out.println("Inside postProcessAfterInitialization - " + beanName);
    return bean;
  }
}

ExampleBean

@Component
public class ExampleBean {
  @PostConstruct
  public void initData() {
    System.out.println("Your custom initialization code goes here...");
  }
  @PreDestroy
  public void clearData() {
    System.out.println("Your custom destroy code goes here...");
  }
}

ExampleConfig

@Configuration
@ComponentScan("core.bean.postprocessor")
public class ExampleConfig {
  //Extra config goes
}

TestExampleBean

public class TestExampleBean {
  public static void main(String[] args) {
    ConfigurableApplicationContext context
        = new AnnotationConfigApplicationContext(ExampleConfig.class);
    context.getBean(ExampleBean.class);
    //This is important
    context.registerShutdownHook();
  }
}

输出结果如下:

Inside postProcessBeforeInitialization exampleConfig
Inside postProcessAfterInitialization exampleConfig
Inside postProcessBeforeInitialization exampleBean
Your custom initialization code goes here...
Inside postProcessAfterInitialization exampleBean
Your custom destroy code goes here...

正如您在上面的输出中看到的,bean 后处理器方法被调用两次,每个 bean 一次。这是因为 Spring IoC 在这里创建了 2 个 bean(exampleConfig 和 exampleBean)。

您可以在 Spring 应用程序中拥有多个自定义 BeanPostProcessor 类,但请记住也要实现 Ordered 接口。

BeanPostProcessor 的一个实际用例

bean 后处理器的实际用例是当您想要将原始 IoC 创建的 bean 包装在代理实例中时,例如当您使用 @Transactional、Spring-AOP 或 BeanValidationPostProcessor 时。我列出了一些使用 bean 后处理器接口的 Spring 框架类。

1、Spring-Tx 中的 BootstrapContextAwareProcessor。

2、Spring-Web 中的 ServletContextAwareProcessor。

3、Spring-orm 项目中的 PersistenceAnnotationBeanPostProcessor。

版权声明:著作权归作者所有。

X

欢迎加群学习交流

联系我们