Spring框架中回调方法和Bean后处理器的区别

Kev*_*vin 2 java spring javabeans jakarta-ee

请原谅这个 Spring 初学者问题。我正在阅读第一版的第 4 章,并介绍了回调方法和 Bean 后处理器。

现在我对这两件事感到困惑,似乎他们都做了某事。bean 实例创建时,如何区分两者?也许举个例子会很好?

我个人的理解是,如果我们必须找到差异,那么回调方法会在bean实际创建时启动,Bean后处理器在bean创建后稍稍被调用?另外,我认为差异也可能是初始化回调方法只关注一个bean,而Beanpost procsso将一一处理所有bean实例?

另外,有人可以通过将 JSR250 注释 @PreDestroy 和 @PostConstruct 与上面的两个概念进行比较和对比来帮助我进一步解释其中的区别吗?

非常感谢您的帮助!

jef*_*eff 5

我已经有一段时间没有使用这些方法了,但我认为您所指的回调方法和 @PostConstruct 方法是同一件事。但要回答你的问题,区别......

1)@PostConstruct(或afterPropertiesSet)方法是特定类的内部方法,将在实例化bean后调用。这实际上是您放置特定于类型的操作的地方。

2) BeanPostProcessor 将接触所有 Spring beans。因此,您可以在这里放置横切功能,而不必是特定于类的功能。

举一个小例子……假设我有一个小型地址簿应用程序,用于跟踪我的朋友及其地址。如果我有一些无法追踪的疯狂错误,我可能会使用 BeanPostProcessor 来通过一些日志记录来包装所有 Spring beans,例如“现在调用 Address.getStreet()...,现在调用 Address.getCity()。 ……”。

现在,我可能会在 Address 中使用 @PostConstruct 方法来针对某些 Web 服务验证和查找邮政编码,以获取只有城市/州的地址。

现在,我实际上可能没有一个域对象访问 Web 服务,但其想法是为了说明 @PostConstruct 可以处理类特定的内容,并且 BeanPostProcessor 可以处理跨多个类的内容。

另外值得注意的是,BeanPostProcessor 有两个方法可以重写:postProcessBeforeInitialization 和 postProcessAfterInitialization,这将让您决定在 bean 的 @PostConstruct 方法之前和之后运行什么。