我正在研究Spring Core认证,我对Spring如何处理bean的生命周期,尤其是bean后处理器有疑问。
所以我有这个架构:
我很清楚这是什么意思:
在“ 装入Bean定义”阶段执行以下步骤:
@Configuration类被处理和/或@Components被扫描和/或XML文件进行解析。
Bean定义已添加到BeanFactory(每个索引都在其ID下建立索引)
调用特殊的BeanFactoryPostProcessor bean时,它可以修改任何bean的定义(例如,用于属性-占位符值的替换)。
然后,在Bean创建阶段执行以下步骤:
默认情况下,每个Bean都急切地实例化(以正确的顺序创建并注入了依赖项)。
依赖项注入后,每个bean都会进入后处理阶段,在该阶段中可能会进行进一步的配置和初始化。
在后期处理之后,bean被完全初始化并可以使用(通过其id进行跟踪,直到上下文被销毁)
好的,这对我来说很清楚,我也知道有两种类型的Bean后处理器:
初始化程序:如果有指示,则初始化Bean(即@PostConstruct)。
和所有其余的:其允许额外的配置和其之前或初始化步骤之后运行
所以对我来说很清楚初始化器 bean后处理器是什么(它们是用@PostContruct批注注释的方法,这些方法在setter方法之后立即自动调用(因此在依赖项注入之后),我知道我可以使用执行一些初始化批处理(如上例中那样填充缓存)。
但是,到底什么代表了另一个bean后处理器呢?当我们说这些步骤在初始化阶段之前或之后执行时,这是什么意思?
因此,实例化了我的bean并注入了它的依赖项,然后完成了初始化阶段(通过执行@PostContruct带注释的方法)。在初始化阶段之前使用Bean后处理器是什么意思?这意味着它发生在@PostContruct注释方法执行之前?这是否意味着它可能在依赖项注入之前发生(在调用setter方法之前)?
当我们说它是在初始化步骤之后执行时,我们到底是什么意思。这意味着它会在执行@PostContruct带注释的方法之后发生,还是什么?
我可以很容易地想到为什么我需要一个@PostContruct带注释的方法,但是我无法弄清楚另一种bean后处理器的典型示例,您能告诉我一些什么时候使用的典型示例吗?
Spring doc在使用BeanPostProcessor定制bean下解释了BPP 。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的生命周期,以及何时确切调用该方法,请检查文档
postProcessBeforeInitialization(Object bean,String beanName)在任何bean初始化回调(如InitializingBean的afterPropertiesSet或自定义init-method)之前,将此BeanPostProcessor应用于给定的新bean实例。
postProcessAfterInitialization(Object bean,String beanName)在任何bean初始化回调(如InitializingBean的afterPropertiesSet或自定义的init-method)之后,将此BeanPostProcessor应用于给定的新bean实例。
重要的一点是
该bean将已经用属性值填充。
对于与关系的关系@PostConstruct
,该注释是一种声明postProcessAfterInitialization
方法的便捷方法,当你通过注册CommonAnnotationBeanPostProcessor
或指定<context:annotation-config />in bean
配置文件时,Spring会意识到这一点。该@PostConstruct
方法将在其他任何方法之前还是之后执行postProcessAfterInitialization
取决于order属性
你可以配置多个BeanPostProcessor
实例,并且可以通过设置order
属性来控制这些BeanPostProcessor
的执行顺序。
问题内容: 在查找(测试)信息时,我遇到了一些问题,完全不知道为什么会发生。现在,我知道没有实际的理由执行此操作,这绝对是可怕的代码,但是为什么行得通呢? 因此,基本上,我将对象添加到Quods的ArrayList中。现在,我看到java如何无法有效地检查它,因为它必须浏览所有引用,而这些引用可能甚至都没有存储在任何地方。但是为什么get()起作用了。get()是否不是要返回Quod的实例,就像在
问题内容: 注释如何工作? 如果我有这样的事情: 将如何影响testNumber?它甚至会影响testNumber吗? 谢谢。让我知道我是否使用错了。 问题答案: 不会影响电话号码。它仅用于制作javadocs。 有关Javadoc的更多信息:http : //www.oracle.com/technetwork/java/javase/documentation/index-137868.htm
我们知道主存域很少:年轻的、终生的(旧的gen)和PermGen。 年轻领域分为伊甸园和幸存者(有两个)。 OldGen用于生存的对象。 MaxTenuringThreshold防止对象过早地被最终复制到OldGen空间。这很清楚,也很容易理解。 但是它是如何工作的呢?垃圾回收器如何处理这些在MaxTenuringThreshold之前仍然存在的对象,以何种方式?它们位于何处? 对象被复制回幸存者
问题内容: 我一直在阅读其手册页,但尚未成功弄清其工作原理。在调用system()时,是否分叉了一个新的子进程,并在其中添加了shell二进制文件exec()?但这可能是一个愚蠢的猜测。 问题答案: 是的,system()本质上是传递的命令字符串的fork()和exec()“ sh -c”。可以在此处找到示例实现(来自eglibc,最近来自glibc)。
我正在学习Spring核心认证,我对Spring如何处理JDBC查询有一些疑问: 因此,为了获得一个作为int值的简单对象,我使用queryForObject()方法,将sql stattment和我期望从该方法接收的对象类型传递给它。 好的,这很简单,我认为这是可以的。 2)查询输入到Map对象中的整个表行:因此,如果我不需要单个值(可以在表的特定行的单个列中,或者类似前面的示例),我可以使用q
我正在学习Spring核心认证,我对Spring如何处理bean生命周期有一些疑问,特别是bean后处理器。 所以我有了这个模式: 我很清楚这意味着什么: 然后在bean创建阶段执行以下步骤: > 每个bean都在缺省情况下被急切地实例化(按照正确的顺序创建,并注入其依赖项)。 在依赖注入之后,每个bean都会经历一个后处理阶段,在这个阶段中可能会进行进一步的配置和初始化。 > 初始化器:如果指示