Clase de herramienta que contiene contexto de primavera

package com.muxue.common.util;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 持有spring上下文的工具类,一个系统只有一个SpringContextHolder
 * <p>该工具类主要用于:通过spring上下文获取bean</p>
 */
@Component
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        if(applicationContext!=null) throw new IllegalStateException("applicationContext 上下文已存在");
        System.out.println("spring注入上下文");
        applicationContext=context;
    }

    private static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
    /**
     * 本类SpringContextHolder 被销毁时,将spring上下文置空
     * @throws Exception
     */
    @Override
    public void destroy() throws Exception {
        applicationContext=null;
    }

    /**
     * 根据类型获取ioc容器中的bean
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }
    /**
     * 根据beanName获取bean
     * @param beanName
     * @return
     */
    public static <T> T  getBean(String beanName) {
        return (T)getApplicationContext().getBean(beanName);

    }
}

Cuando una clase implementa ApplicationContextAware, esta clase puede obtener fácilmente todos los beans en ApplicationContext y puede obtener directamente todos los objetos bean a los que se hace referencia en el archivo de configuración de Spring.

principio

setApplicationContext es un método de enlace clave reservado por el marco Spring. El proceso de carga detallado de Spring es el siguiente:

  1. Llame al método setBeanName de BeanNameAware
  2. Llame al método setBeanFactory de BeanFactoryAware
  3. Llame a setApplicationContext de ApplicationContextAware
  4. Al llamar a afterPropertiesSet de InitializingBean o no implementar esta interfaz, pero especificar @Bean (initMethod="nombre del método sin paréntesis"), este método se ejecutará.
  5. Llame al método postProcessBeforeInitialization de BeanPostProcessor
  6. Llame al método postProcessAfterInitialization de BeanPostProcessor
  7. La inicialización del Bean está completa y se puede utilizar.
  8. Antes de cerrar el contenedor, llame al método de destrucción de DesechableBean

Al cargar el archivo de configuración de Spring, si la clase Bean definida en el archivo de configuración de Spring implementa la interfaz ApplicationContextAware, al cargar el archivo de configuración de Spring, se llamará automáticamente a setApplicationContext en la interfaz ApplicationContextAware y se inyectará automáticamente ApplicationContext.

En la clase de implementación de ApplicationContextAware, el Bean en el contenedor Spring se puede obtener a través de este objeto de contexto.

Guess you like

Origin blog.csdn.net/puzi0315/article/details/130238455