Saltar al contenido

¿Cómo funciona ApplicationContextAware en Spring?

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 AbstractAutowireCapableBeanFactoryen 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *