BeanPostProcessor怎么在spring中的应用
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍了BeanPostProcessor怎么在spring中的应用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇BeanPostProcessor怎么在spr
千家信息网最后更新 2026年11月02日BeanPostProcessor怎么在spring中的应用1)断点查看代码
1.在MyBeanPostProcessor添加断点,运行测试方法通过观察栈,查看执行流程 下方长长的英文是调试中右下角的窗口: 2. :84, AnnotationConfigApplicationContext 初始化容器
3. refresh:543, AbstractApplicationContext 调用refresh() 函数 ,实例化所有剩余的单例
4 .finishBeanFactoryInitialization:867, AbstractApplicationContext
preInstantiateSingletons:761, DefaultListableBeanFactory,具体通过getBean函数进行初始化剩余的Bean 5. doGetBean:302, AbstractBeanFactory 这一步 通过getSingleton 获取单实例, 通过初始化createBean 方法创建Bean 6. createBean:483, AbstractAutowireCapableBeanFactory,调用初始化,获取Bean 实例
7. doCreateBean:555, AbstractAutowireCapableBeanFactory 进入到具体创建Bean 中 通过populateBean() 进行填充Bean 操作 8.最后可以看到 initializeBean:1620, AbstractAutowireCapableBeanFactory 中 执行 applyBeanPostProcessorsBeforeInitialization 和 applyBeanPostProcessorsAfterInitialization 进行 postProcessBeforeInitialization() 函数和postProcessAfterInitialization() 函数的调用;中间调用 invokeInitMethods(beanName, wrappedBean, mbd) ;进行 初始化 函数的调用 9. applyBeanPostProcessorsBeforeInitialization:409,AbstractAutowireCapableBeanFactory 最后通过 getBeanPostProcessors() 扫描所有的 BeanPostProcessor 直到遇到null 进行返回退出循环 2) 总结 运行过程中的执行原理
通过查看断点调试结果, 可以看到,创建单例容器Bean 通过 在spring 中大量使用BeanPostProcessor ,进行处理,下面举例3个进行断点、代码测试: 1).ApplicationContextAwareProcessor 帮助组件注入IOC 容器 在Dog 中实现 implements ApplicationContextAware 接口,编写, setApplicationContext 将容器保存至属性方法中 1. postProcessBeforeInitialization:97,ApplicationContextAwareProcessor 可以看到 通过 postProcessBeforeInitialization 函数进行将容器进行赋值 2).InitDestroyAnnotationBeanPostProcessor 用于处理 @PostConstruct 、@PreDestroy 注解。 查看 InitDestroyAnnotationBeanPostProcessor 源码, postProcessBeforeInitialization 函数代码,如下: 使用 findLifecycleMetadata(bean.getClass()); 获取所有的生命周期函数,通过 metadata.invokeInitMethods(bean, beanName); 进行代理调用对应的生命周期函数 3).BeanValidationPostProcessor 数据校验 用于进行数据校验,查看 BeanValidationPostProcessor 的源码 postProcessBeforeInitialization 和 postProcessAfterInitialization 代码如下,进行 doValidate()函数进行数据校验。
这篇文章主要介绍了BeanPostProcessor怎么在spring中的应用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇BeanPostProcessor怎么在spring中的应用文章都会有所收获,下面我们一起来看看吧。
1.BeanPostProcessor 执行原理
public AnnotationConfigApplicationContext(Class>... annotatedClasses) { this(); register(annotatedClasses); refresh(); }// Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory);
// Instantiate all remaining (non-lazy-init) singletons. beanFactory.preInstantiateSingletons();
getBean(beanName);
// Create bean instance. if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, new ObjectFactoryObject beanInstance = doCreateBean(beanName, mbdToUse, args);
Object exposedObject = bean; try { populateBean(beanName, mbd, instanceWrapper); if (exposedObject != null) { exposedObject = initializeBean(beanName, exposedObject, mbd); } }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);}
@Overridepublic Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {result = beanProcessor.postProcessBeforeInitialization(result, beanName);if (result == null) {return result;}}return result;}
populateBean() 函数进行填充,invokeInitMethods(beanName, wrappedBean, mbd);
函数进行初始化,然后前后有applyBeanPostProcessorsBeforeInitialization 和applyBeanPostProcessorsAfterInitialization 进行对所有的BeanPostProcessor 扫描执行。
2.BeanPostProcessor 在spring 中的应用
@Componentpublic class Dog implements ApplicationContextAware {private ApplicationContext applicationContext;public Dog(){System.out.println("dog constructor...");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {// TODO Auto-generated method stubthis.applicationContext = applicationContext;}}
2.通过invokeAwareInterfaces判断Bean 的类型进行类型转换,并进行赋值
private void invokeAwareInterfaces(Object bean) { if (bean instanceof Aware) { if (bean instanceof EnvironmentAware) { ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment()); } if (bean instanceof EmbeddedValueResolverAware) { ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver); } if (bean instanceof ResourceLoaderAware) { ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext); } if (bean instanceof ApplicationEventPublisherAware) { ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext); } if (bean instanceof MessageSourceAware) { ((MessageSourceAware) bean).setMessageSource(this.applicationContext); } if (bean instanceof ApplicationContextAware) { ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext); } } }@Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { LifecycleMetadata metadata = findLifecycleMetadata(bean.getClass()); try { metadata.invokeInitMethods(bean, beanName); } catch (InvocationTargetException ex) { throw new BeanCreationException(beanName, "Invocation of init method failed", ex.getTargetException()); } catch (Throwable ex) { throw new BeanCreationException(beanName, "Failed to invoke init method", ex); } return bean; }public void invokeInitMethods(Object target, String beanName) throws Throwable { Collection initMethodsToIterate = (this.checkedInitMethods != null ? this.checkedInitMethods : this.initMethods); if (!initMethodsToIterate.isEmpty()) { boolean debug = logger.isDebugEnabled(); for (LifecycleElement element : initMethodsToIterate) { if (debug) { logger.debug("Invoking init method on bean '" + beanName + "': " + element.getMethod()); } element.invoke(target); } }} @Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (!this.afterInitialization) {doValidate(bean);}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (this.afterInitialization) {doValidate(bean);}return bean;}
关于"BeanPostProcessor怎么在spring中的应用"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"BeanPostProcessor怎么在spring中的应用"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
函数
应用
容器
代码
断点
实例
数据
方法
知识
内容
原理
周期
周期函数
源码
生命
篇文章
类型
剩余
处理
测试
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网与科技
湖北九亚互联网络科技有限公司
互联网科技行业发展
金融科技还是互联网
互联网科技垄断
互联网科技有限公司图片
互联网科技的
喔噻互联网科技
深圳互联网络科技有限公司
有马互联网科技
凡科互联网科技
撒么互联网科技公司
互联网科技股午盘股票涨跌
互联网公司会议桌创意科技软装饰
深圳国际航运科技和互联网
港股科技和互联网
张召忠谈中国互联网科技
从那以后互联网科技有限公司
陕西云淼互联网科技公司
互联网科技企业商标注意事项
咖啡
广东万易互联网科技有限公司惠州分公司
互联网和科技创新
科技互联网技术
无线互联网科技
深圳国际航运科技和互联网
移动互联网科技股
移动互联网年度科技创新
中国互联网十大科技股排名
唐山双旺合互联网科技产业园