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

Spring BeanPostProcessor到底是如何工作的?

陆洛城
2023-03-14

我正在学习Spring核心认证,我对Spring如何处理bean生命周期有一些疑问,特别是bean后处理器。

所以我有了这个模式:

我很清楚这意味着什么:

然后在bean创建阶段执行以下步骤:

>

  • 每个bean都在缺省情况下被急切地实例化(按照正确的顺序创建,并注入其依赖项)。

    在依赖注入之后,每个bean都会经历一个后处理阶段,在这个阶段中可能会进行进一步的配置和初始化。

    >

  • 初始化器:如果指示(即@postConstruct)初始化bean。

    和所有其他内容:允许附加配置,并且可以在初始化步骤之前或之后运行

    我贴出这张幻灯片:

  • 共有1个答案

    南宫海超
    2023-03-14

    Spring文档解释了使用BeanPostProcessor定制bean下的BPPs。BPP bean是一种特殊的bean,它先于其他bean创建,并与新创建的bean交互。有了这个构造,Spring就可以通过自己实现BeanPostProcessor来连接和定制生命周期行为。

    拥有自定义BPP(如

    public class CustomBeanPostProcessor implements BeanPostProcessor {
    
        public CustomBeanPostProcessor() {
            System.out.println("0. Spring calls constructor");
        }
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName)
                throws BeansException {
            System.out.println(bean.getClass() + "  " + beanName);
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName)
                throws BeansException {
            System.out.println(bean.getClass() + "  " + beanName);
            return bean;
        }
    }
    

    并打印出每个创建的bean的类和bean名称。

    bean将已经填充了属性值。

    关于与@PostConstruct的关系,请注意,这个注释是声明PostProcessAfterInitialization方法的一种方便方法,当您通过注册CommonAnnotationBeanPostProcessor或在bean配置文件中指定 时,Spring就会意识到这一点。@PostConstruct方法是在任何其他PostProcessAfterInitialization之前还是之后执行,取决于Order属性

    您可以配置多个BeanPostProcessor实例,并且可以通过设置order属性来控制这些BeanPostProcessor的执行顺序。

     类似资料:
    • 我们知道主存域很少:年轻的、终生的(旧的gen)和PermGen。 年轻领域分为伊甸园和幸存者(有两个)。 OldGen用于生存的对象。 MaxTenuringThreshold防止对象过早地被最终复制到OldGen空间。这很清楚,也很容易理解。 但是它是如何工作的呢?垃圾回收器如何处理这些在MaxTenuringThreshold之前仍然存在的对象,以何种方式?它们位于何处? 对象被复制回幸存者

    • 这是一个简单的错误:我在对象的格式字符串中使用了而不是。但我完全困惑于我的测试结果与错误的格式字符串。 以下代码: @Jan建议依赖toString()方法可能会有问题,所以我定义了一个日期格式,以与上面相同的代码打印。下面是附加输出:

    • 我几乎理解了尾递归是如何工作的,以及它与普通递归之间的区别。我只是不明白为什么它不要求堆栈记住它的返回地址。 在尾递归函数中调用函数本身后没有什么可做的,但对我来说这没有意义。

    • 当我创建一个api并使用laravel资源时,是更好地获取完整的数据,然后选择在资源文件中发送哪些列,还是从数据库中选择数据时,确定应该选择哪些列? 1)

    • 根据Javadoc关于字符串。实习生(): 调用intern方法时,如果池中已经包含一个由equals(Object)方法确定的等于此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中并返回对此String对象的引用。 我对此没有什么问题。 当创建一个新的字符串对象(不是使用字符串文字,而是使用new()操作符)时,如:

    • 问题内容: 在查找(测试)信息时,我遇到了一些问题,完全不知道为什么会发生。现在,我知道没有实际的理由执行此操作,这绝对是可怕的代码,但是为什么行得通呢? 因此,基本上,我将对象添加到Quods的ArrayList中。现在,我看到java如何无法有效地检查它,因为它必须浏览所有引用,而这些引用可能甚至都没有存储在任何地方。但是为什么get()起作用了。get()是否不是要返回Quod的实例,就像在