1. BeanReference
Ø com.liferay.portal.spring.annotation.BeanReferenceAnnotationBeanPostProcessor
implements BeanFactoryAware, InstantiationAwareBeanPostProcessor,
MergedBeanDefinitionPostProcessor
通过实现以上接口,完成BeanReference注解的功能。
BeanFactoryAware接口实现了beanFactory Aware.
InstantiationAwareBeanPostProcessor接口的3个方法:
l Object postProcessBeforeInstantiation(Class beanClass, String beanName) throws BeansException
l boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException:实现带@BeanReference 注解Field属性转换对应的Bean对象。
l public PropertyValues postProcessPropertyValues(
PropertyValues propertyValues,
PropertyDescriptor[] propertyDescriptors, Object bean,
String beanName):实现带@BeanReference 注解Method属性转换对应的Bean对象
l public void postProcessMergedBeanDefinition(
RootBeanDefinition beanDefinition, Class beanType,
String beanName):实现* Post-process the given merged bean definition for the specified bean.
最终加载通过:
类:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.java
方法名:protected void populateBean(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw)
// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
// state of the bean before properties are set. This can be used, for example,
// to support styles of field injection.
boolean continueWithPropertyPopulation = true;
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (Iterator it = getBeanPostProcessors().iterator(); it.hasNext();) {
BeanPostProcessor beanProcessor = (BeanPostProcessor) it.next();
if (beanProcessor instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) beanProcessor;
if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
continueWithPropertyPopulation = false;
break;
}
}
}
}
Ø com.liferay.portal.spring.annotation.BeanReferenceElement
扩展了InjectionMetadata.InjectedElement类。
通过protected Object getResourceToInject(Object target, String requestingBeanName)方法来实现通过@BeanReference name对应的bean的获取。
Ø com.liferay.portal.spring.annotation.BeanReferenceCallback
扩展了FieldCallback、MethodCallback类。
public void doWith(Field field):实现InjectionMetadata增加Field。
public void doWith(Method method):实现InjectionMetadata增加Method。