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 granosApplicationContextAware
: 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 interfazInitializingBean
)@PreDestroy
: Método de destrucción (correspondiente a destruir-método archivo de configuración del resorte, la interfazDisposableBean
)
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 BeanPostProcessor
la ejecución, que Calculator
no 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 @PostConstruct
ser 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 BeanPostProcessor
el uso.
Vistazo a la clase de configuración anterior, no puede haber sido GlobalConfig
en 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 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");