Siéntete libre de compartir nuestro sitio y códigos con otro, necesitamos tu ayuda para ampliar esta comunidad.
Solución:
Cuando Spring crea instancias de beans, busca un par de interfaces como ApplicationContextAware
y InitializingBean
. Si se encuentran, se invocan los métodos. Por ejemplo (muy simplificado)
Class> beanClass = beanDefinition.getClass();
Object bean = beanClass.newInstance();
if (bean instanceof ApplicationContextAware)
((ApplicationContextAware) bean).setApplicationContext(ctx);
Tenga en cuenta que en la versión más nueva puede ser mejor usar anotaciones, en lugar de implementar interfaces específicas de Spring. Ahora puedes simplemente usar:
@Inject // or @Autowired
private ApplicationContext ctx;
Código fuente de Spring para explicar cómo funciona ApplicationContextAware
cuando usas ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
En AbstractApplicationContext
clase, la refresh()
método tiene el siguiente código:
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
entrar en este método,beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
agregará ApplicationContextAwareProcessor a AbstractrBeanFactory.
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// Tell the internal bean factory to use the context's class loader etc.
beanFactory.setBeanClassLoader(getClassLoader());
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
// Configure the bean factory with context callbacks.
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
...........
Cuando la primavera inicializa el frijol en AbstractAutowireCapableBeanFactory
en método initializeBean
,llamada applyBeanPostProcessorsBeforeInitialization
para implementar el proceso de publicación de bean. el proceso incluye inyectar el applicationContext.
@Override
public 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;
cuando BeanPostProcessor implementa Object para ejecutar el método postProcessBeforeInitialization, por ejemplo ApplicationContextAwareProcessor
que agregó antes.
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(
new EmbeddedValueResolver(this.applicationContext.getBeanFactory()));
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);
Sección de Reseñas y Valoraciones
Si te animas, puedes dejar un enunciado acerca de qué te ha parecido este enunciado.