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ãoApplicationContextAware
: 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 interfaceInitializingBean
)@PreDestroy
: Método de destruição (correspondente a destruir-método ficheiro de configuração da mola, a interfaceDisposableBean
)
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 BeanPostProcessor
a execução, eu Calculator
nã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 @PostConstruct
ser 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 BeanPostProcessor
o uso.
Olhe para a classe de configuração acima, você não pode ter sido GlobalConfig
em 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;
}
}
BeanPostProcessor
Ser 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");