Springboot 之 ObjectPostProcessor

文章目录

  • 一、ObjectPostProcessor 是什么?
  • 二、代码示例
  • 三、AutowireBeanFactoryObjectPostProcessor
    • 实现原理


一、ObjectPostProcessor 是什么?

ObjectPostProcessor 能对我们没有被扫描的类执行初始化, 注意是初始化 (initializeBean)。

二、代码示例

ObjectPostProcessor 有两个实现类,这里只研究 AutowireBeanFactoryObjectPostProcessor

  1. 创建一个普通的 Service

    @Service
    public class ComponentService {
    }
    
  2. 创建一个组件,但是不放入到 IOC 中管理

    // 实现了 ApplicationContextAware,但是没有放入到 ioc 中
    public class ComponentDemo implements ApplicationContextAware {
    
        @Autowired
        private ComponentService componentService;
    
        public void printComponentService() {
            System.out.println(componentService);
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            System.out.println("ComponentDemo - setApplicationContext 执行了");
        }
    }
    
    // 配置类
    @Configuration
    public class ObjectPostProcessorConfig {
    
        private ComponentDemo componentDemo;
    
    // objectPostProcessor 存在的话 @Autowired 标注的方法会自动执行
    // 如果不存在可以自行注入一个 objectPostProcessor
        @Autowired(required = false)
        public void autowiredObject(ObjectPostProcessor<Object> objectPostProcessor) {
        // 使用 objectPostProcessor 自动处理 ComponentDemo
            componentDemo = objectPostProcessor.postProcess(new ComponentDemo());
            componentDemo.printComponentService();
        }
    }
    
  3. 观察输出结果

    ComponentDemoprintComponentService() setApplicationContext() 都会被执行,而且 ComponentDemocomponentService 就是我们注入到 IOC 中的 componentService

  4. 附录:注入 AutowireBeanFactoryObjectPostProcessor

    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public ObjectPostProcessor<Object> objectPostProcessor(AutowireCapableBeanFactory beanFactory) {
    	return new AutowireBeanFactoryObjectPostProcessor(beanFactory);
    }
    

三、AutowireBeanFactoryObjectPostProcessor

实现原理

@Override
public <T> T postProcess(T object) {
	if (object == null) {
		return null;
	}
	T result = null;
	try {
		// 初始化 Bean 如果需要的话
		result = initializeBeanIfNeeded(object);
	}
	...
	// autowireBean
	this.autowireBeanFactory.autowireBean(object);
	...
	return result;
}
// AutowireBeanFactoryObjectPostProcessor#initializeBeanIfNeeded
private <T> T initializeBeanIfNeeded(T object) {
	if (!NativeDetector.inNativeImage() || !AopUtils.isCglibProxy(object)) {
	// initializeBean 你看到了什么,这不正是 springboot 创建 bean 的最后一步初始化 Bean 吗,这里面会干啥,执行 Aware 方法,执行初始化方法
		return (T) this.autowireBeanFactory.initializeBean(object, object.toString());
	}
	ObjectProvider<?> provider = this.autowireBeanFactory.getBeanProvider(object.getClass());
	Object bean = provider.getIfUnique();
	if (bean == null) {
		String msg = """
				Failed to resolve an unique bean (single or primary) of type [%s] from the BeanFactory.
				Because the object is a CGLIB Proxy, a raw bean cannot be initialized during runtime in a native image.
				"""
			.formatted(object.getClass());
		throw new IllegalStateException(msg);
	}
	return (T) bean;
}

你可能感兴趣的:(springboot,spring,boot,java,后端)