继承了AnnotationInjectedBeanPostProcessor类,其中传入泛型Reference注解。
着重来看下@Reference的依赖注入,主要逻辑在父类。实际上和@Autowired的依赖注入是一样的。ReferenceBean的相关逻辑,后面再单独来看。
public class ReferenceAnnotationBeanPostProcessor extends AnnotationInjectedBeanPostProcessor<Reference>
implements ApplicationContextAware, ApplicationListener {
public static final String BEAN_NAME = "referenceAnnotationBeanPostProcessor";
private static final int CACHE_SIZE = Integer.getInteger(BEAN_NAME + ".cache.size", 32);
private final ConcurrentMap<String, ReferenceBean<?>> referenceBeanCache =
new ConcurrentHashMap<String, ReferenceBean<?>>(CACHE_SIZE);
private final ConcurrentHashMap<String, ReferenceBeanInvocationHandler> localReferenceBeanInvocationHandlerCache =
new ConcurrentHashMap<String, ReferenceBeanInvocationHandler>(CACHE_SIZE);
private final ConcurrentMap<InjectionMetadata.InjectedElement, ReferenceBean<?>> injectedFieldReferenceBeanCache =
new ConcurrentHashMap<InjectionMetadata.InjectedElement, ReferenceBean<?>>(CACHE_SIZE);
private final ConcurrentMap<InjectionMetadata.InjectedElement, ReferenceBean<?>> injectedMethodReferenceBeanCache =
new ConcurrentHashMap<InjectionMetadata.InjectedElement, ReferenceBean<?>>(CACHE_SIZE);
private ApplicationContext applicationContext;
public Collection<ReferenceBean<?>> getReferenceBeans() {
return referenceBeanCache.values();
}
public Map<InjectionMetadata.InjectedElement, ReferenceBean<?>> getInjectedFieldReferenceBeanMap() {
return Collections.unmodifiableMap(injectedFieldReferenceBeanCache);
}
public Map<InjectionMetadata.InjectedElement, ReferenceBean<?>> getInjectedMethodReferenceBeanMap() {
return Collections.unmodifiableMap(injectedMethodReferenceBeanCache);
}
//由父类调用,实例化ReferenceBean
@Override
protected Object doGetInjectedBean(Reference reference, Object bean, String beanName, Class<?> injectedType,
InjectionMetadata.InjectedElement injectedElement) throws Exception {
//构造referencedBeanName
String referencedBeanName = buildReferencedBeanName(reference, injectedType);
//实例化ReferenceBean
ReferenceBean referenceBean = buildReferenceBeanIfAbsent(referencedBeanName, reference, injectedType, getClassLoader());
//缓存injectedElement和referenceBean的映射关系
cacheInjectedReferenceBean(referenceBean, injectedElement);
//为ReferenceBean创建代理对象
Object proxy = buildProxy(referencedBeanName, referenceBean, injectedType);
return proxy;
}
//jdk动态代理
private Object buildProxy(String referencedBeanName, ReferenceBean referenceBean, Class<?> injectedType) {
InvocationHandler handler = buildInvocationHandler(referencedBeanName, referenceBean);
Object proxy = Proxy.newProxyInstance(getClassLoader(), new Class[]{injectedType}, handler);
return proxy;
}
private InvocationHandler buildInvocationHandler(String referencedBeanName, ReferenceBean referenceBean) {
//具体代理类的拦截逻辑
ReferenceBeanInvocationHandler handler = localReferenceBeanInvocationHandlerCache.get(referencedBeanName);
if (handler == null) {
handler = new ReferenceBeanInvocationHandler(referenceBean);
}
//容器中找不到ReferencedBeanName的bean,则调用init方法初始化该bean
if (applicationContext.containsBean(referencedBeanName)) { // Is local @Service Bean or not ?
// ReferenceBeanInvocationHandler's initialization has to wait for current local @Service Bean has been exported.
localReferenceBeanInvocationHandlerCache.put(referencedBeanName, handler);
} else {
// Remote Reference Bean should initialize immediately
handler.init();
}
return handler;
}
private static class ReferenceBeanInvocationHandler implements InvocationHandler {
private final ReferenceBean referenceBean;
private Object bean;
private ReferenceBeanInvocationHandler(ReferenceBean referenceBean) {
this.referenceBean = referenceBean;
}
//判断bean是否存在,否则调用init实例化
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
try {
if (bean == null) { // If the bean is not initialized, invoke init()
// issue: https://github.com/apache/incubator-dubbo/issues/3429
init();
}
result = method.invoke(bean, args);
} catch (InvocationTargetException e) {
// re-throws the actual Exception.
throw e.getTargetException();
}
return result;
}
//初始化ReferenceBean的逻辑后面文章再来看
private void init() {
this.bean = referenceBean.get();
}
}
@Override
protected String buildInjectedObjectCacheKey(Reference reference, Object bean, String beanName,
Class<?> injectedType, InjectionMetadata.InjectedElement injectedElement) {
//构建cacheKey
String key = buildReferencedBeanName(reference, injectedType) +
"#source=" + (injectedElement.getMember()) +
"#attributes=" + AnnotationUtils.getAttributes(reference, getEnvironment(), true);
return key;
}
//使用 类名 和 Reference注解的group属性和version属性 构建ReferencedBeanName
private String buildReferencedBeanName(Reference reference, Class<?> injectedType) {
ServiceBeanNameBuilder builder = ServiceBeanNameBuilder.create(reference, injectedType, getEnvironment());
return getEnvironment().resolvePlaceholders(builder.build());
}
private ReferenceBean buildReferenceBeanIfAbsent(String referencedBeanName, Reference reference,
Class<?> referencedType, ClassLoader classLoader)
throws Exception {
//先从referenceBeanCache中获取
ReferenceBean<?> referenceBean = referenceBeanCache.get(referencedBeanName);
if (referenceBean == null) {
//第一次获取不到
//构建ReferenceBean对象。ReferenceBean对象的实例化和作用的源码,后续文章再来分析。
ReferenceBeanBuilder beanBuilder = ReferenceBeanBuilder
.create(reference, classLoader, applicationContext)
.interfaceClass(referencedType);
referenceBean = beanBuilder.build();
//放入referenceBeanCache中
referenceBeanCache.put(referencedBeanName, referenceBean);
}
return referenceBean;
}
//缓存injectedElement和referenceBean的映射关系
private void cacheInjectedReferenceBean(ReferenceBean referenceBean,
InjectionMetadata.InjectedElement injectedElement) {
if (injectedElement.getMember() instanceof Field) {
injectedFieldReferenceBeanCache.put(injectedElement, referenceBean);
} else if (injectedElement.getMember() instanceof Method) {
injectedMethodReferenceBeanCache.put(injectedElement, referenceBean);
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
//这里后面文章讲到ServiceBean发布事件的时候再来看
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ServiceBeanExportedEvent) {
onServiceBeanExportEvent((ServiceBeanExportedEvent) event);
} else if (event instanceof ContextRefreshedEvent) {
onContextRefreshedEvent((ContextRefreshedEvent) event);
}
}
private void onServiceBeanExportEvent(ServiceBeanExportedEvent event) {
ServiceBean serviceBean = event.getServiceBean();
initReferenceBeanInvocationHandler(serviceBean);
}
private void initReferenceBeanInvocationHandler(ServiceBean serviceBean) {
String serviceBeanName = serviceBean.getBeanName();
// Remove ServiceBean when it's exported
ReferenceBeanInvocationHandler handler = localReferenceBeanInvocationHandlerCache.remove(serviceBeanName);
// Initialize
if (handler != null) {
handler.init();
}
}
private void onContextRefreshedEvent(ContextRefreshedEvent event) {
}
//bean或者容器销毁时 清除缓存
@Override
public void destroy() throws Exception {
super.destroy();
this.referenceBeanCache.clear();
this.localReferenceBeanInvocationHandlerCache.clear();
this.injectedFieldReferenceBeanCache.clear();
this.injectedMethodReferenceBeanCache.clear();
}
}
AnnotationInjectedBeanPostProcessor继承了InstantiationAwareBeanPostProcessorAdapter ,实现了MergedBeanDefinitionPostProcessor接口。看到postProcessMergedBeanDefinition方法和postProcessPropertyValues方法
public abstract class AnnotationInjectedBeanPostProcessor<A extends Annotation> extends
InstantiationAwareBeanPostProcessorAdapter implements MergedBeanDefinitionPostProcessor, PriorityOrdered,
BeanFactoryAware, BeanClassLoaderAware, EnvironmentAware, DisposableBean {
private final static int CACHE_SIZE = Integer.getInteger("", 32);
private final Log logger = LogFactory.getLog(getClass());
private final Class<A> annotationType;
private final ConcurrentMap<String, AnnotationInjectedBeanPostProcessor.AnnotatedInjectionMetadata> injectionMetadataCache =
new ConcurrentHashMap<String, AnnotationInjectedBeanPostProcessor.AnnotatedInjectionMetadata>(CACHE_SIZE);
private final ConcurrentMap<String, Object> injectedObjectsCache = new ConcurrentHashMap<String, Object>(CACHE_SIZE);
private ConfigurableListableBeanFactory beanFactory;
private Environment environment;
private ClassLoader classLoader;
private int order = Ordered.LOWEST_PRECEDENCE;
public AnnotationInjectedBeanPostProcessor() {
//需要扫描的注解类型
//ClassUtils的静态方法resolveGenericType 获取 ReferenceAnnotationBeanPostProcessor传过来的泛型值
this.annotationType = resolveGenericType(getClass());
}
private static <T> Collection<T> combine(Collection<? extends T>... elements) {
List<T> allElements = new ArrayList<T>();
for (Collection<? extends T> e : elements) {
allElements.addAll(e);
}
return allElements;
}
//返回要扫描的注解类型
public final Class<A> getAnnotationType() {
return annotationType;
}
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
Assert.isInstanceOf(ConfigurableListableBeanFactory.class, beanFactory,
"AnnotationInjectedBeanPostProcessor requires a ConfigurableListableBeanFactory");
this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
}
//对字段和方法完成依赖注入
@Override
public PropertyValues postProcessPropertyValues(
PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeanCreationException {
//postProcessMergedBeanDefinition已经向injectionMetadataCache放入了值,这里直接获取到InjectionMetadata
InjectionMetadata metadata = findInjectionMetadata(beanName, bean.getClass(), pvs);
try {
//调用父类InjectedElements的inject方法,循环掉用injectedElements集合中element的inject方法
metadata.inject(bean, beanName, pvs);
} catch (BeanCreationException ex) {
throw ex;
} catch (Throwable ex) {
throw new BeanCreationException(beanName, "Injection of @" + getAnnotationType().getName()
+ " dependencies is failed", ex);
}
return pvs;
}
private List<AnnotationInjectedBeanPostProcessor.AnnotatedFieldElement> findFieldAnnotationMetadata(final Class<?> beanClass) {
final List<AnnotationInjectedBeanPostProcessor.AnnotatedFieldElement> elements = new LinkedList<AnnotationInjectedBeanPostProcessor.AnnotatedFieldElement>();
//查找类中所有的字段
ReflectionUtils.doWithFields(beanClass, new ReflectionUtils.FieldCallback() {
@Override
public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
//判断字段上是否存在@Reference注解
A annotation = getAnnotation(field, getAnnotationType());
if (annotation != null) {
//静态字段不处理
if (Modifier.isStatic(field.getModifiers())) {
if (logger.isWarnEnabled()) {
logger.warn("@" + getAnnotationType().getName() + " is not supported on static fields: " + field);
}
return;
}
//将字段和字段上的Refrence注解封装为AnnotatedFieldElement
elements.add(new AnnotationInjectedBeanPostProcessor.AnnotatedFieldElement(field, annotation));
}
}
});
return elements;
}
private List<AnnotationInjectedBeanPostProcessor.AnnotatedMethodElement> findAnnotatedMethodMetadata(final Class<?> beanClass) {
final List<AnnotationInjectedBeanPostProcessor.AnnotatedMethodElement> elements = new LinkedList<AnnotationInjectedBeanPostProcessor.AnnotatedMethodElement>();
//查找类中所有的方法
ReflectionUtils.doWithMethods(beanClass, new ReflectionUtils.MethodCallback() {
@Override
public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException {
//由桥接方法找到被桥接的原方法
//非桥接方法直接原样返回
Method bridgedMethod = findBridgedMethod(method);
//判断method和bridgedMethod返回值,参数个数,参数类型是否一致,不一致则不处理
if (!isVisibilityBridgeMethodPair(method, bridgedMethod)) {
return;
}
//获取方法上的@Reference注解
A annotation = findAnnotation(bridgedMethod, getAnnotationType());
//如果有注解且方法与beanClass中的方法一致
if (annotation != null && method.equals(ClassUtils.getMostSpecificMethod(method, beanClass))) {
//静态方法不处理
if (Modifier.isStatic(method.getModifiers())) {
if (logger.isWarnEnabled()) {
logger.warn("@" + getAnnotationType().getSimpleName() + " annotation is not supported on static methods: " + method);
}
return;
}
//无参方法不处理
if (method.getParameterTypes().length == 0) {
if (logger.isWarnEnabled()) {
logger.warn("@" + getAnnotationType().getSimpleName() + " annotation should only be used on methods with parameters: " +
method);
}
}
//将方法包装为PropertyDescriptor
PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, beanClass);
//将方法和Reference注解包装为AnnotatedMethodElement
elements.add(new AnnotationInjectedBeanPostProcessor.AnnotatedMethodElement(method, pd, annotation));
}
}
});
return elements;
}
private AnnotationInjectedBeanPostProcessor.AnnotatedInjectionMetadata buildAnnotatedMetadata(final Class<?> beanClass) {
//扫描@Reference字段,包装为AnnotatedFieldElement
Collection<AnnotationInjectedBeanPostProcessor.AnnotatedFieldElement> fieldElements = findFieldAnnotationMetadata(beanClass);
//扫描@Reference方法,包装为AnnotatedMethodElement
Collection<AnnotationInjectedBeanPostProcessor.AnnotatedMethodElement> methodElements = findAnnotatedMethodMetadata(beanClass);
//将两个集合合并为一个AnnotatedInjectionMetadata类型的集合返回
return new AnnotationInjectedBeanPostProcessor.AnnotatedInjectionMetadata(beanClass, fieldElements, methodElements);
}
public InjectionMetadata findInjectionMetadata(String beanName, Class<?> clazz, PropertyValues pvs) {
//beanName作为cacheKey
String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());
//injectionMetadataCache存放cacheKey和AnnotatedInjectionMetadata的映射关系
//后续直接通过cacheKey获取,不需要再重复扫描类中的@Refrence注解去生成InjectionMetadata
AnnotationInjectedBeanPostProcessor.AnnotatedInjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey);
//如果metadata为空,返回true
//否则判断传入进来的clazz和metadata中的类对象是否一致
if (InjectionMetadata.needsRefresh(metadata, clazz)) {
synchronized (this.injectionMetadataCache) {
//再次从injectionMetadataCache拿一次。
metadata = this.injectionMetadataCache.get(cacheKey);
if (InjectionMetadata.needsRefresh(metadata, clazz)) {
if (metadata != null) {
metadata.clear(pvs);
}
try {
//查找类中@Reference注解的字段和方法,包装为InjectionMetadata返回
metadata = buildAnnotatedMetadata(clazz);
//放入injectionMetadataCache中
this.injectionMetadataCache.put(cacheKey, metadata);
} catch (NoClassDefFoundError err) {
throw new IllegalStateException("Failed to introspect object class [" + clazz.getName() +
"] for annotation metadata: could not find class that it depends on", err);
}
}
}
}
return metadata;
}
//收集类中@Reference注解的字段和方法,包装为InjectionMetadata
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
if (beanType != null) {
//查找类中@Reference注解的字段和方法,包装为InjectionMetadata
InjectionMetadata metadata = findInjectionMetadata(beanName, beanType, null);
metadata.checkConfigMembers(beanDefinition);
}
}
@Override
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
//bean或者容器销毁时 清除缓存
@Override
public void destroy() throws Exception {
for (Object object : injectedObjectsCache.values()) {
if (logger.isInfoEnabled()) {
logger.info(object + " was destroying!");
}
if (object instanceof DisposableBean) {
((DisposableBean) object).destroy();
}
}
injectionMetadataCache.clear();
injectedObjectsCache.clear();
if (logger.isInfoEnabled()) {
logger.info(getClass() + " was destroying!");
}
}
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}
public void setEnvironment(Environment environment) {
this.environment = environment;
}
protected Environment getEnvironment() {
return environment;
}
protected ClassLoader getClassLoader() {
return classLoader;
}
protected ConfigurableListableBeanFactory getBeanFactory() {
return beanFactory;
}
/**
* Gets all injected-objects.
*
* @return non-null {@link Collection}
*/
protected Map<String, Object> getInjectedObjects() {
return this.injectedObjectsCache;
}
protected Object getInjectedObject(A annotation, Object bean, String beanName, Class<?> injectedType,
InjectionMetadata.InjectedElement injectedElement) throws Exception {
//调到子类的buildInjectedObjectCacheKey方法,生成cacheKey
String cacheKey = buildInjectedObjectCacheKey(annotation, bean, beanName, injectedType, injectedElement);
//使用cacheKey从injectedObjectsCache中获取RefrenceBean
Object injectedObject = injectedObjectsCache.get(cacheKey);
if (injectedObject == null) {
//第一次依赖注入该RefrenceBean
//调用子类的doGetInjectedBean方法,实例化bean
injectedObject = doGetInjectedBean(annotation, bean, beanName, injectedType, injectedElement);
// Customized inject-object if necessary
//cacheKey和RefrenceBean放入injectedObjectsCache中
injectedObjectsCache.putIfAbsent(cacheKey, injectedObject);
}
return injectedObject;
}
protected abstract Object doGetInjectedBean(A annotation, Object bean, String beanName, Class<?> injectedType,
InjectionMetadata.InjectedElement injectedElement) throws Exception;
protected abstract String buildInjectedObjectCacheKey(A annotation, Object bean, String beanName,
Class<?> injectedType,
InjectionMetadata.InjectedElement injectedElement);
//继承InjectionMetadata
public class AnnotatedInjectionMetadata extends InjectionMetadata {
private final Collection<AnnotationInjectedBeanPostProcessor.AnnotatedFieldElement> fieldElements;
private final Collection<AnnotationInjectedBeanPostProcessor.AnnotatedMethodElement> methodElements;
//持有AnnotatedFieldElement和AnnotatedMethodElement
public AnnotatedInjectionMetadata(Class<?> targetClass, Collection<AnnotationInjectedBeanPostProcessor.AnnotatedFieldElement> fieldElements,
Collection<AnnotationInjectedBeanPostProcessor.AnnotatedMethodElement> methodElements) {
//将fieldElements和methodElements集合赋值给父类InjectionMetadata 的 injectedElements集合
super(targetClass, combine(fieldElements, methodElements));
this.fieldElements = fieldElements;
this.methodElements = methodElements;
}
public Collection<AnnotationInjectedBeanPostProcessor.AnnotatedFieldElement> getFieldElements() {
return fieldElements;
}
public Collection<AnnotationInjectedBeanPostProcessor.AnnotatedMethodElement> getMethodElements() {
return methodElements;
}
}
//继承InjectedElement , 重写inject方法
public class AnnotatedMethodElement extends InjectionMetadata.InjectedElement {
private final Method method;
private final A annotation;
private volatile Object injectedBean;
protected AnnotatedMethodElement(Method method, PropertyDescriptor pd, A annotation) {
super(method, pd);
this.method = method;
this.annotation = annotation;
}
@Override
protected void inject(Object bean, String beanName, PropertyValues pvs) throws Throwable {
//获取依赖注入的类
Class<?> injectedType = pd.getPropertyType();
//获取依赖注入ReferenceBean
injectedBean = getInjectedObject(annotation, bean, beanName, injectedType, this);
ReflectionUtils.makeAccessible(method);
//反射调用方法
method.invoke(bean, injectedBean);
}
public Method getMethod() {
return method;
}
public A getAnnotation() {
return annotation;
}
public Object getInjectedBean() {
return injectedBean;
}
public PropertyDescriptor getPd() {
return this.pd;
}
}
//继承InjectedElement 重写inject方法
public class AnnotatedFieldElement extends InjectionMetadata.InjectedElement {
private final Field field;
private final A annotation;
private volatile Object injectedBean;
protected AnnotatedFieldElement(Field field, A annotation) {
super(field, null);
this.field = field;
this.annotation = annotation;
}
@Override
protected void inject(Object bean, String beanName, PropertyValues pvs) throws Throwable {
//获取依赖注入的类
Class<?> injectedType = field.getType();
//获取依赖注入ReferenceBean
injectedBean = getInjectedObject(annotation, bean, beanName, injectedType, this);
ReflectionUtils.makeAccessible(field);
//反射设置依赖注入的字段值
field.set(bean, injectedBean);
}
public Field getField() {
return field;
}
public A getAnnotation() {
return annotation;
}
public Object getInjectedBean() {
return injectedBean;
}
}
}