[Fonte] feijão de ciclo de vida e de aplicação cenários (edição anotada)

prefácio

Esclarecer processo de gestão do depósito de grãos Primavera vai nos ajudar a desenvolver melhor um design mais racional com base nas necessidades, melhorar a escalabilidade e eficiência do sistema.

feijão Lifecycle

Abaixo para classificar feijão Primavera ciclo de vida do recipiente por um exemplo simples.

Nós do todo para os detalhes, antes de tudo, é iniciar um contêiner carregado de feijão, é todo um processo.

/**
 * 测试 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();
    }
}

Então dê uma olhada quando o recipiente é carregado Feijão ter feito o tratamento.

Temos de unir interface específica do Spring Bean, essas interfaces pode ser visto como a intervenção no processo de carregamento para os desenvolvedores a 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执行>>>");
    }
}

A partir daqui você pode ver o código tem os seguintes interfaces e notas:

  • BeanNameAware: Obter o nome atual no recipiente de feijão
  • ApplicationContextAware: A corrente injectada no recipiente de feijão
  • @PostConstruct: Inicialização método (correspondendo ao método init-ficheiro de configuração da mola, a interface InitializingBean)
  • @PreDestroy: Método de destruição (correspondente a destruir-método ficheiro de configuração da mola, a interface DisposableBean)

ordem de execução

三月 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

parceiro de pequeno porte cuidado deve ter notado BeanPostProcessora execução, eu Calculatornão sabia que esta interface, por isso que quando carregado vai imprimi-lo?

No começo eu pensei merecia ser implementado por cada feijão BeanPostProcessor, de modo que você pode @PostConstructser tratada antes e após a execução.

Mas eu estava errado, o resultado é validado quando carregar a corrente de feijão não fazer o que for alcançado BeanPostProcessor.

Depois de olhar para algumas informações, não sabia BeanPostProcessoro uso.

Olhe para a classe de configuração acima, você não pode ter sido GlobalConfigem 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 uma classe separada, classe unificada pelo processo realizado para determinar qual dos quais Bean.

cenários

ApplicationContextAware

Acção: através da qual o recipiente pode ser obtido Primavera

Cenário: Quando a instância e não para a gestão da Primavera, não podemos usar automática injetado. Por exemplo Utils usar Dao, este tempo pode ser obtido por Dao montagem realizada num 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");
Publicado 107 artigos originais · Louvor obteve 88 · vista 260 000 +

Acho que você gosta

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