我试图在Spring中了解BeanPostProcessor,但我不了解它的作用。BeanPostProcessor定义在这些点上调用的两个方法是否正确:
那是对的吗?给定示例和第118页上的文字,这进一步令人困惑。我认为我不能从文本中复制更多内容到问题,但是注释和那里发生的事情很难理解。
您是否应该在想要的bean上实现此接口,还是应该在许多bean通用的bean上使用此接口?我看到您同时传入了object和string参数。
有时,您可能会发现自己处于需要在Spring实例化bean之前和之后立即执行一些其他处理的位置。处理可以像修改bean一样简单,也可以像返回完全不同的对象一样复杂!BeanPostProcessor接口有两种方法:postProcessBeforeInitialization,在Spring调用任何bean初始化钩子(例如InitializingBean.afterPropertiesSet或init- method)之前被调用;以及postProcessAfterInitialization,在初始化钩子成功后,Spring进行调用。
Pro Spring 2.5,第118页
Spring不仅为您提供了很多后处理器BeanPostProcessor。另外,大多数都由Spring本身使用。您在此问题中提到的那个实例(如其名称所示)用于在实例化之后发布process bean。Spring容器的行为如下:
BeanPostProcessor
Spring实例化bean调用其构造函数
postProcessBeforeInitialization(Object bean, String beanName) 叫做
postProcessBeforeInitialization(Object bean, String beanName)
bean初始化过程:@PostConstruct,afterPropertiesSet()(由InitializingBean回调接口定义),自定义配置的init方法
@PostConstruct
afterPropertiesSet()
InitializingBean
init
postProcessAfterInitialization(Object bean, String beanName) 叫做
postProcessAfterInitialization(Object bean, String beanName)
乍看起来,它看起来很复杂且令人难以理解,但是当您在Spring的顶部构建复杂的应用程序时,所有这些功能都是无价的。
例如,可能的场景(取自Spring本身):
AutowiredAnnotationBeanPostProcessor
@Autowire
RequiredAnnotationBeanPostProcessor
@Required
ServletContextAwareProcessor
ServletContext
ServletContextAware
@PreDestroy
CommonAnnotationBeanPostProcessor
当然,所有提到的后处理器必须按特定的顺序执行,但这是Spring的责任,以确保执行此后处理。