Spring FrameWork从入门到NB - BeanPostProcessor

这篇具有很好参考价值的文章主要介绍了Spring FrameWork从入门到NB - BeanPostProcessor。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring框架之所以NB,BeanPostProcessor功不可没。BeanPostProcessor通过生命周期回调实现对Bean的增强比如,其实Spring的AOP功能主要就是通过BeanPostProcessor实现的,以及,Spring重要的自动装配功能,也是通过BeanPostProcessor实现的。

BeanPostProcessor生效原理

BeanPostProcessor指的是Spring容器中所有实现了BeanPostProcessor接口的类,通过如下方式生效:

  1. BeanPostProcessor注册:所有实现了BeanPostProcessor接口的类,在Spring初始化过程中注册到Spring容器中
  2. Bean生命周期的初始化前、后,Spring分别回调BeanPostProcessor接口的postProcessBeforeInitialization、postProcessAfterInitialization,从而实现对bean的增强。

具体的回调过程,在AbstractAutowireCapableBeanFactory的initializeBean方法中:

	protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		catch (Throwable ex) {
			throw new BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
		}
		if (mbd == null || !mbd.isSynthetic()) {
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}

		return wrappedBean;
	}
beanPostProcessor的注册

Spring初始化时,refresh()方法中注册beanPostProcessor:

@Override
	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// Prepare this context for refreshing.
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
				registerBeanPostProcessors(beanFactory);
	...

registerBeanPostProcessors方法负责注册beanPostProcessors,所有当前容器中实现了BeanPostProcessor接口的类,按照如下顺序依次注册到容器的beanPostProcessors中:

  1. 首先,实现了PriorityOrdered接口的BeanPostProcessor
  2. 其次,实现了Ordered接口的BeanPostProcessor
  3. 最后,其他普通BeanPostProcessor

这样,所有的BeanPostProcessor就会在bean实例化、初始化之前的Spring启动阶段注册到Spring容器中。之后的Bean初始化过程中,Spring会自动检查所有的BeanPostProcessor,并依次回调两个接口方法从而实现BeanPostProcessor对bean的增强。

此外,还可以通过编程的方式注册BeanPostProcessor:通过ConfigurableBeanFactory的addBeanPostProcessor方法注册,编程方式注册的BeanPostProcessor优先于Spring自动注册的BeanPostProcessor,并且,编程方式注册的情况下BeanPostProcessor的顺序与BeanPostProcessor的Ordered接口无关、仅与注册先后顺序有关。

AOP与BeanPostProcessor

由于Spring AOP就是通过BeanPostProcessor实现代理对象的自动创建的,所以,如果一个AOP对象同时实现了BeanPostProcessor接口,该对象的AOP功能就没有办法实现,因为该AOP对象在Spring启动的过程中作为BeanPostProcessor被注册到Spring容器中,与实现AOP动态代理的BeanPostProcessor是处于同一级别的、从而不会被AOP的BeanPostProcessor增强,因此也就无法实现AOP。

同时,需要注意的是,如果你通过@Autowired或@Resource自动装配你的BeanPostProcessor类,在没有指定bean name的情况下,有可能会发生不可预料的结果,因为自动装配过程中,如果不能通过name匹配到bean,Spring会根据type自动匹配,由于容器中有很多BeanPostProcessor,所以,可能就会发生错乱…

上一篇 Spring FrameWork从入门到NB - 定制Bean文章来源地址https://www.toymoban.com/news/detail-531049.html

到了这里,关于Spring FrameWork从入门到NB - BeanPostProcessor的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入了解 Spring BeanPostProcessor 的应用

    Spring框架的强大之处在于其提供了丰富的扩展点,其中之一是BeanPostProcessor接口。这个接口允许我们在Spring容器实例化bean之后、在调用初始化方法之前和之后对bean进行一些自定义的处理。在这篇文章中,我们将深入研究BeanPostProcessor的使用场景,并通过一个详细的例子演示如

    2024年01月25日
    浏览(37)
  • Mr. Cappuccino的第61杯咖啡——Spring之BeanPostProcessor

    BeanPostProcessor:Bean对象的后置处理器,负责对已创建好的bean对象进行加工处理; BeanPostProcessor中的两个核心方法: postProcessBeforeInitialization:在每个bean对象的初始化方法执行之前执行该方法,如InitializingBean的afterPropertiesSet方法; postProcessAfterInitialization:在每个bean对象的初始

    2024年02月12日
    浏览(40)
  • Spring后置处理器BeanFactoryPostProcessor与BeanPostProcessor源码解析

    Spring有两种类型的后置处理器,分别是 BeanFactoryPostProcessor 和 BeanPostProcessor ,这里再贴出我画的 Spring 启动过程,可以看看这两种后置处理器在 Spring 启动过程中位置。 BeanFactoryPostProcessor 的 postProcessBeanFactory 方法在 Spring 容器启动时被调用,可以对整个容器中的 BeanDefinition (

    2024年02月13日
    浏览(53)
  • Spring-BeanPostProcessor PostConstruct init InitializingBean 执行顺序

    执行顺序探究 新建一个对象用于测试 新建一个TestBeanPostProcessor 实现 BeanPostProcessor 通过注解的 方式进行测试 得到的结果如下: 总结PostProcessBeforeInitialization - PostConstruct - InitializingBean - PostProcessAfterInitialization 通过Bean.xml的方式 执行结果如下: 总结PostProcessBeforeInitialization - I

    2024年01月20日
    浏览(54)
  • Spring高手之路6——Bean生命周期的扩展点:BeanPostProcessor

    在前一篇讲解生命周期的时候就可以讲解后置处理器了,但是内容比较多,还是分开来讲解。    BeanPostProcessor 的设计目标主要是提供一种扩展机制,让开发者可以在 Spring Bean 的初始化阶段进行自定义操作。这种设计理念主要体现了 Spring 的一种重要原则,即“开放封闭原

    2024年02月10日
    浏览(47)
  • Spring Boot 容器扩展BeanFactoryPostProcessor、BeanPostProcessor、 BeanDefinitionRegistryPostProcessor用法和解析

    之所以在企业级应用中Spring 到Spring Boot 一直立于不败之地,保持火热,其中很关键的一个点是,它的扩展简直太强大了,上一篇,我们聊了一下 Spring Boot整个生命周期中的扩展点,,比如 SpringApplicationRunListener 可以监听应用的各个阶段。本文我们聊聊,Spring 容器上的扩展。

    2024年02月11日
    浏览(42)
  • Spring Framework

    Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。 Spring 框架指的都是 Spring Framework,它是很多模块的集合,如下图所示: Spring 框架的核心模块,也可以说是基础模块,Spring 其他所有的功能基本都需要依赖于该模块。 Beans :提供对

    2024年02月22日
    浏览(38)
  • Spring Framework版本升级

    升级Spring Framework 版本 由于公司漏洞扫描后要求项目中Spring Framework版本不低于5.3.18,通过idea插件maven helper,查看所有项目中Spring Framework的版本,发现5个项目中的版本低于5.3.18,需要进行版本升级 1. springboot项目 ​ 对于springboot项目,查看springboot版本和他依赖的Spring Framewo

    2024年02月09日
    浏览(32)
  • Spring Boot 和 Spring Cloud Framework 的区别

    大家好,如果您从事 Java 开发并创建了微服务,那么您可能知道  Spring Boot 和 Spring Cloud是两个流行的基于 Java 的框架,广泛用于构建企业级应用程序,尤其是服务器端后端 Java 应用程序。这两个框架均由 Spring 团队开发,并提供独特的功能,使它们在市场上脱颖而出。虽然

    2024年02月07日
    浏览(44)
  • JavaWeb编程面试题——Spring Framework

    面试题==知识点,这里所记录的面试题并不针对于面试者,而是将这些面试题作为技能知识点来看待。不以刷题进大厂为目的,而是以学习为目的。这里的知识点会持续更新,目录也会随时进行调整。 关注公众号:编程火箭车 。在【粉丝福利】中点击【面题大全】,其中的

    2024年02月06日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包