[Primavera] de haba de ciclo de vida y de la aplicación escenarios (edición anotada)

prefacio

Aclarar proceso de gestión del recipiente de granos de primavera nos ayudará a desarrollar mejores un diseño más racional basada en las necesidades, mejorar la escalabilidad y la eficiencia del sistema.

frijol del ciclo de vida

Abajo para ordenar ciclo de vida del recipiente de granos de primavera con un ejemplo sencillo.

Nosotros de la totalidad de los datos, en primer lugar es comenzar un contenedor cargado Bean, que es un proceso conjunto.

/**
 * 测试 Spring Bean 生命周期
 * @author zyj
 */
public class LifeCycleTest {
    @Test
    public void testLifeCycle() {
        // 通过注解开启容器,并加载Bean
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(GlobalConfig.class);
        // 关闭容器
        context.close();
    }
}

@Configuration
public class GlobalConfig {
    @Bean
    public Calculator calculator() {
        return new Calculator();
    }
    /**
     * @Order:加载到容器的优先级,越小代表优先级越高
     * @return
     */
    @Order(0)
    @Bean
    public FullyBeanPostProcessor fullyBeanPostProcessor() {
        return new FullyBeanPostProcessor();
    }
}

A continuación, echar un vistazo a cuando se carga el depósito de granos han hecho lo tratamiento.

Necesitamos unir grano de interfaz de Primavera-específica, estas interfaces pueden ser vistos como la intervención en el proceso de carga de los desarrolladores de entrada de Bean.

public class Calculator implements BeanNameAware, ApplicationContextAware {

    public Calculator() {
        System.out.println("<<<构造器执行>>>");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("<<<BeanNameAware.setBeanName执行>>>");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("<<<ApplicationContextAware.setApplicationContext执行>>>");
    }

    @PostConstruct
    public void init() {
        System.out.println("<<<@PostConstruct执行>>>");
    }

	@PreDestroy
    public void destroy() {
        System.out.println("<<<@PreDestroy执行>>>");
    }
}

Desde aquí se puede ver el código tiene las siguientes interfaces y notas:

  • BeanNameAware: Obtener el nombre actual en el depósito de granos
  • ApplicationContextAware: La corriente inyectada en el depósito de granos
  • @PostConstruct: Inicialización método (que corresponde al archivo de configuración del resorte init-método, la interfaz InitializingBean)
  • @PreDestroy: Método de destrucción (correspondiente a destruir-método archivo de configuración del resorte, la interfaz DisposableBean)

orden de ejecución

三月 06, 2020 3:09:52 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@4f47d241: startup date [Fri Mar 06 15:09:52 CST 2020]; root of context hierarchy
三月 06, 2020 3:09:52 下午 org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker postProcessAfterInitialization
信息: Bean 'globalConfig' of type [class com.zyj.spring.config.GlobalConfig$$EnhancerBySpringCGLIB$$5aa1013d] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

<<<构造器执行>>>
<<<BeanNameAware.setBeanName执行>>>
<<<ApplicationContextAware.setApplicationContext执行>>>
<<<BeanPostProcessor.postProcessBeforeInitialization执行>>>
<<<@PostConstruct执行>>>
<<<BeanPostProcessor.postProcessAfterInitialization执行>>>

三月 06, 2020 3:09:52 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@4f47d241: startup date [Fri Mar 06 15:09:52 CST 2020]; root of context hierarchy

<<<@PreDestroy执行>>>

Process finished with exit code 0

Cuidado socio pequeño debe haber notado BeanPostProcessorla ejecución, que Calculatorno se había dado cuenta de esta interfaz, por eso que cuando se carga imprimirlo?

Al principio pensé que merecía ser ejecutado por cada grano BeanPostProcessor, para que pueda @PostConstructser tratado antes y después de la ejecución.

Pero estaba equivocado, el resultado se valida cuando la carga de la corriente Bean no hacer lo que se logra BeanPostProcessor.

Después de buscar un poco de información, no sabía BeanPostProcessorel uso.

Vistazo a la clase de configuración anterior, no puede haber sido GlobalConfigen FullyBeanPostProcessor.

public class FullyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof Calculator) {
            System.out.println("<<<BeanPostProcessor.postProcessBeforeInitialization执行>>>");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof Calculator) {
            System.out.println("<<<BeanPostProcessor.postProcessAfterInitialization执行>>>");
        }
        return bean;
    }
}

BeanPostProcessorSer realizada por una clase separada, clase unificado por el proceso realizado para determinar cuál de que Bean.

escenarios

ApplicationContextAware

Acción: por la que el recipiente se puede obtener de primavera

Escenario: Cuando la instancia y no a la gestión de la primavera, que no pueden utilizar automática inyectado. Por ejemplo Utilidades utilizan Dao, este tiempo puede ser obtenida por Dao Asamblea celebró un recipiente de primavera.

@Component
public class SpringJobBeanFactory implements ApplicationContextAware {

    private static ApplicationContext applicationContext;
        
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringJobBeanFactory.applicationContext=applicationContext;    
    }
	public static ApplicationContext getApplicationContext() {
		return applicationContext;
    }
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
		if (applicationContext == null){
			return null;
		}
		return (T)applicationContext.getBean(name);
	}
}

使用:

TypeDao typeDao = SpringJobBeanFactory.getBean("typeDao");
Publicados 107 artículos originales · ganado elogios 88 · vistas 260 000 +

Supongo que te gusta

Origin blog.csdn.net/Code_shadow/article/details/104696923
Recomendado
Clasificación