当前位置: 首页 > 知识库问答 >
问题:

如何避免BeanPost处理器在每个bean之后执行以及它在实际用例中的使用

谷梁浩思
2023-03-14

我已经阅读了Spring关于BeanPostProcessor的文档,以及与之相关的现有stackoverflow帖子。我可以理解BeanPostProcessor有两种方法postprocessinessafterinitializationpostprocessinessafterinitialization。而postProcessBeforeInitialization在初始化Springbean之后调用,在调用init()方法之前调用,postProcessAfterInitialization在init()之后调用。然而,关于它的行为,我有几个问题。

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/config/BeanPostProcessor.html

我已经编写了2个POJO类,1个主类,1个自定义BeanPost处理器类和1个Spring bean xml文件。

public class HelloWorld{
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }
   public void getMessage(){
      System.out.println("Your Message : " + message);
   }
   
   public void init() {
        System.out.println("I am init");
   }
    
   public void destroy() {
        System.out.println("I am destroy");
   }
}

波乔

public class NewHelloWorld{
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }
   public void getMessage(){
      System.out.println("NewHelloWorld Your Message : " + message);
   }
}

主类

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      ((AbstractApplicationContext)context).registerShutdownHook();
      HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
      NewHelloWorld newObj = (NewHelloWorld) context.getBean("newHelloWorld");
   }
}

自定义BeanPost处理器

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class DemoBeanPostProcessor implements BeanPostProcessor {
    
    @Override
    public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {
        System.out.println(arg1 + ": I am executing immediately after init method");
        return arg0;
    }
    
    @Override
    public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException{
        System.out.println(arg1 + ": I am executing after spring bean initialization but before init method");
        return arg0;
    }
}

Beans Xml文件

<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
  
<bean id="helloWorld" class="com.HelloWorld" init-method="init" destroy-method="destroy">
    <property name="message" value="helloworld-bean" />
</bean>

<bean id="newHelloWorld" class="com.NewHelloWorld">
    <property name="message" value="NewHelloworld-bean" />
</bean>

<bean class="com.tutorialspoint.DemoBeanPostProcessor" />

</beans>

问题#1:-无论我在POJO中编写的init和destroy方法是什么,BeanPostProcessor都会在bean实例化之后执行。在这种情况下,当定义声明它将在init方法之前和之后执行时,定义如何成立,因为我没有一个POJO的init,但它仍然会被执行。

问题#2:在BeanPostProcessor的方法中,我们有一些逻辑,比如连接到远程数据库、执行一些jms队列等。我们不希望在每个bean之后执行这些逻辑。在这种情况下,我们应该有一些机制,使BeanPostProcessor不在bean之后运行。如何才能做到这一点。如果无法实现,那么在现实世界的用例中,我们通常在BeanPostProcessor方法中编写什么样的操作?

共有1个答案

赵元白
2023-03-14

BeanPostProcessor的主要思想是配置bean。常见的用例是用代理封装注释了特定注释的bean。如果您有一些逻辑,比如执行jms队列,那么最好创建单独的bean,并在@PostConstruct方法中执行此逻辑。

 类似资料:
  • 我有以下场景。 一个类,其中我有一个API,其内容如下: 这里我们有一个MyOtherClass,它包含一个执行某些操作的API decodeAndGetName()。它在另一个包中,我无法修改它的代码。 要求 我需要为上面的编写一个jUnit测试。现在我想以某种方式模拟的对象并模拟的返回值。 我无法做到这一点,因为我们有一个新的MyOtherClass(),一旦流到达这一行,它就会创建一个新实例

  • 问题内容: 由于不是可重入的,因此在信号处理程序中使用它并不安全。但是我看过很多使用这种方式的示例代码。 所以我的问题是:我们什么时候需要避免在信号处理程序中使用,并且有推荐的替代品吗? 问题答案: 您可以使用一些标志变量,在信号处理程序中设置该标志,并在正常操作期间基于main()或程序其他部分中的该标志调用函数。 从信号处理程序中调用所有函数(例如)是不安全的。一种有用的技术是使用信号处理程序

  • 我想在这个导航用例中避免这种情况:A- 其中所有片段实例都保存在后栈中。原因:避免内存溢出错误。 我尝试创建一个自己的导航工作流,如下所述:https://stackoverflow.com/questions/18041583/fragments-backstack-issue?noredirect=1#comment26393904_18041583(它应该模仿活动行为,在开始一个新操作后调用

  • 本文向大家介绍Spring实战之Bean的后处理器操作示例,包括了Spring实战之Bean的后处理器操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Spring实战之Bean的后处理器操作。分享给大家供大家参考,具体如下: 一 配置文件 二 接口 Axe Person 三 Bean Chinese SteelAxe 四 Bean后处理器 五 测试结果 Spring实例化主调bea

  • 我需要一些帮助来了解spark如何决定分区的数量,以及它们在executors中是如何处理的,我很抱歉这个问题,因为我知道这是一个重复的问题,但即使在阅读了许多文章后,我仍然不能理解我正在放上一个我目前正在工作的真实生活用例,以及我的Spark提交配置和集群配置。 我的硬件配置: < code>3节点计算机,总Vcores=30,总内存=320 GB。 我正在使用spark dataframe J

  • 我要的是这种行为: 当然,当我打印时真正发生的是: 显然,它们在类中共享数据。我如何获得单独的实例来实现我想要的行为?