ApplicationContextAware的使用理解

想象这么一个场景,一个单例bean中依赖有原型bean我们怎么去注入?

spring中我了解的大致有两种方式,一种是@Lookup依赖查找,另一种就是实现ApplicationContextAware 


使用方法

@Service
@Scope("prototype")
public class UserService {
	
}
@Component
public class UserService2 implements ApplicationContextAware {
	private ApplicationContext context;
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.context = applicationContext;
	}

	public void test(){
		UserService service = context.getBean(UserService.class);
		System.out.println(service);
	}
}

为什么我们实现这个接口就能拿到ApplicationContext?

首先在spring容器启动的时候,有添加一个ApplicationContextAwareProcessor

protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
		
		// Configure the bean factory with context callbacks.
		// 在beanFactory中添加ApplicationContextAwareProcessor,如果自定义类中有实现ApplicationContextAware就能拿到ApplicationContext
		beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
		
}

ApplicationContextAwareProcessor是BeanPostProcessor的实现在容器初始化过程中会执行所有的BeanPostProcessor

@Override
public void refresh() throws BeansException, IllegalStateException {
	// 前后代码就删掉了
	// Invoke factory processors registered as beans in the context.
	invokeBeanFactoryPostProcessors(beanFactory);

				
}

在ApplicationContextAwareProcessor有这么一段,如果一个bean是ApplicationContextAware的实现,就调用它的set方法传入spring context

private void invokeAwareInterfaces(Object bean) {
		
		if (bean instanceof ApplicationContextAware) {
			((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
		}
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章