Spring注解系列十六:生命周期-BeanPostProcessor使用

 Spring底层对 BeanPostProcessor 的使用:bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async等等都是利用 BeanPostProcessor来完成的。
1、BeanPostProcessor
在这里插入图片描述
2、ApplicationContextAwareProcessor。可以帮我们给组件中注入IOC容器

public class Dog implements ApplicationContextAware {

	private ApplicationContext applicationContext;

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		// TODO Auto-generated method stub
		this.applicationContext = applicationContext;
	}

}

快捷键 Alt+7就显示ApplicationContextAwareProcessor中的所有方法
在这里插入图片描述

public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
    AccessControlContext acc = null;
    if (System.getSecurityManager() != null && (bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware || bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware || bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) {
        acc = this.applicationContext.getBeanFactory().getAccessControlContext();
    }

    if (acc != null) {
        AccessController.doPrivileged(new PrivilegedAction<Object>() {
            public Object run() {
                ApplicationContextAwareProcessor.this.invokeAwareInterfaces(bean);
                return null;
            }
        }, acc);
    } else {
        this.invokeAwareInterfaces(bean);
    }

    return bean;
}



private void invokeAwareInterfaces(Object bean) {
    if (bean instanceof Aware) {
        if (bean instanceof EnvironmentAware) {
            ((EnvironmentAware)bean).setEnvironment(this.applicationContext.getEnvironment());
        }

        if (bean instanceof EmbeddedValueResolverAware) {
            ((EmbeddedValueResolverAware)bean).setEmbeddedValueResolver(this.embeddedValueResolver);
        }

        if (bean instanceof ResourceLoaderAware) {
            ((ResourceLoaderAware)bean).setResourceLoader(this.applicationContext);
        }

        if (bean instanceof ApplicationEventPublisherAware) {
            ((ApplicationEventPublisherAware)bean).setApplicationEventPublisher(this.applicationContext);
        }

        if (bean instanceof MessageSourceAware) {
            ((MessageSourceAware)bean).setMessageSource(this.applicationContext);
        }

        if (bean instanceof ApplicationContextAware) {
            ((ApplicationContextAware)bean).setApplicationContext(this.applicationContext);
        }
    }

}

3、BeanValidationPostProcessor。用来做数据校验

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    if (!this.afterInitialization) {
        this.doValidate(bean);
    }

    return bean;
}


public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    if (this.afterInitialization) {
        this.doValidate(bean);
    }

    return bean;
}


protected void doValidate(Object bean) {
    Set<ConstraintViolation<Object>> result = this.validator.validate(bean, new Class[0]);
    if (!result.isEmpty()) {
        StringBuilder sb = new StringBuilder("Bean state is invalid: ");
        Iterator it = result.iterator();

        while(it.hasNext()) {
            ConstraintViolation<Object> violation = (ConstraintViolation)it.next();
            sb.append(violation.getPropertyPath()).append(" - ").append(violation.getMessage());
            if (it.hasNext()) {
                sb.append("; ");
            }
        }

        throw new BeanInitializationException(sb.toString());
    }
}

4、InitDestroyAnnotationBeanPostProcessor。用来处理PostConstruct注解和PreDestroy注解

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
	LifecycleMetadata metadata = findLifecycleMetadata(bean.getClass());
	try {
		metadata.invokeInitMethods(bean, beanName);
	}
	catch (InvocationTargetException ex) {
		throw new BeanCreationException(beanName, "Invocation of init method failed", ex.getTargetException());
	}
	catch (Throwable ex) {
		throw new BeanCreationException(beanName, "Failed to invoke init method", ex);
	}
	return bean;
}


@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
	return bean;
}

5、AutowiredAnnotationBeanPostProcessor。用来处理Autowired注解

猜你喜欢

转载自blog.csdn.net/lizhiqiang1217/article/details/89953429