请原谅这个春季初学者的问题。我正在阅读第一版的第4章,并介绍回调方法和Bean后处理器。
现在我只是对两者感到困惑,似乎他们俩都这样做了。在创建bean实例时,我该如何区分这两个?也许一个例子会很好?
我个人的理解是,如果我们必须找到差异,那么当实际创建bean时会启动回调方法,Bean创建之后会稍微调用Bean post处理器吗?另外,我认为差异很大也许那个初始化回调方法只关注一个bean,而Beanpost procsso会逐个处理所有的bean实例?
此外,是否有人可以帮助我通过comaring和对比JSR250注释@PreDestroy和@PostConstruct与上述两个概念来进一步解释差异?
非常感谢您的帮助!
答案 0 :(得分:4)
自从我使用其中任何一个以来已经有一段时间了,但我认为你所指的回调方法和@PostConstruct方法是一回事。但要回答你的问题,差异......
1)@PostConstruct(或afterPropertiesSet)方法是特定类的内部方法,将在实例化bean之后调用该方法。这实际上是您放置特定于类型的操作的地方。
2)BeanPostProcessor将触及所有Spring bean。因此,您可以在这里放置横切功能,而不一定是针对特定类别的。
一个小例子......说我有一个小的地址簿应用程序,用于跟踪我的朋友和他们的地址。如果我有一些我无法追踪的疯狂错误,我可能会使用BeanPostProcessor将所有我的Spring bean包装起来,例如“现在调用Address.getStreet()...”,现在调用Address.getCity()。 ..“。
现在我可以在Address中使用@PostConstruct方法来验证和查找某些Web服务的邮政编码,以查找我只有城市/州的地址。
现在,我实际上可能没有一个域对象实际上遇到Web服务,但是想法是说明@PostConstruct可以处理类特定的东西,而BeanPostProcessor可以处理跨越多个类的事物。
值得注意的是,BeanPostProcessor有两种方法可以覆盖:postProcessBeforeInitialization和postProcessAfterInitialization,它们可以让你决定在bean的@PostConstruct方法之前和之后运行什么。
答案 1 :(得分:0)
Bean post处理器接口有两种回调方法:1。 PostProcessBeforeInitialization 和 PostProcessAfterInitialization 。 在调用bean的init-method或afterPropertySet方法之前调用 PostProcessBeforeInitialization 方法。
PostProcessAfterInitialization 方法刚刚在bean初始化完成后调用。
Bean Post处理器有机会在bean初始化之前和之后做一些事情。