一、创建出代理类
1.在加载bean的时候扫描含@Reference注解的属性2.注入代理对象 二、创建出的代理类如何完成的调用总结
一、创建出代理类 1.在加载bean的时候扫描含@Reference注解的属性
ReferenceAnnotationBeanPostProcessor间接实现InstantiationAwareBeanPostProcessor接口,重写postProcessPropertyValues方法
protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
......
// 这里的getBeanPostProcessors()能拿到dubbo的Processor
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
// 走dubbo的Processor
pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
if (pvs == null) {
return;
}
}
}
......
}
寻找被标记的属性或者方法
private Injectionmetadata findReferencemetadata(String beanName, Class> clazz, PropertyValues pvs) {
// Fall back to class name as cache key, for backwards compatibility with custom callers.
String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());
// Quick check on the concurrent map first, with minimal locking.
ReferenceInjectionmetadata metadata = this.injectionmetadataCache.get(cacheKey);
if (Injectionmetadata.needsRefresh(metadata, clazz)) {
synchronized (this.injectionmetadataCache) {
metadata = this.injectionmetadataCache.get(cacheKey);
if (Injectionmetadata.needsRefresh(metadata, clazz)) {
if (metadata != null) {
metadata.clear(pvs);
}
try {
// 解析类中被@Reference标注的field或者method
metadata = buildReferencemetadata(clazz);
// 注入代理类对象
this.injectionmetadataCache.put(cacheKey, metadata);
} catch (NoClassDefFoundError err) {
throw new IllegalStateException("Failed to introspect bean class [" + clazz.getName() +
"] for reference metadata: could not find class that it depends on", err);
}
}
}
}
return metadata;
}
基操,勿6
private ReferenceInjectionmetadata buildReferencemetadata(final Class> beanClass) {
Collection fieldElements = findFieldReferencemetadata(beanClass);
Collection methodElements = findMethodReferencemetadata(beanClass);
return new ReferenceInjectionmetadata(beanClass, fieldElements, methodElements);
}
2.注入代理对象
ReferenceAnnotationBeanPostProcessor.ReferenceFieldElement#inject
protected void inject(Object bean, String beanName, PropertyValues pvs) throws Throwable {
Class> referenceClass = field.getType();
referenceBean = buildReferenceBean(reference, referenceClass);
ReflectionUtils.makeAccessible(field);
// 为Reference范型对象生成代理
field.set(bean, referenceBean.getObject());
}
生成Reference对象
private ReferenceBean> buildReferenceBean(Reference reference, Class> referenceClass) throws Exception {
String referenceBeanCacheKey = generateReferenceBeanCacheKey(reference, referenceClass);
ReferenceBean> referenceBean = referenceBeansCache.get(referenceBeanCacheKey);
if (referenceBean == null) {
ReferenceBeanBuilder beanBuilder = ReferenceBeanBuilder
.create(reference, classLoader, applicationContext)
.interfaceClass(referenceClass);
// lookup
referenceBean = beanBuilder.build();
referenceBeansCache.putIfAbsent(referenceBeanCacheKey, referenceBean);
}
return referenceBean;
}
public final B build() throws Exception {
checkDependencies();
// 这里
B bean = doBuild();
configureBean(bean);
if (logger.isInfoEnabled()) {
logger.info(bean + " has been built.");
}
return bean;
}
protected ReferenceBean doBuild() {
// 生成范型空对象
return new ReferenceBean
填充属性
protected void configureBean(B bean) throws Exception {
// 注解上的所有key value都赋予给此bean
preConfigureBean(annotation, bean);
// todo 这些只要看懂一个就行了
configureRegistryConfigs(bean);
configureMonitorConfig(bean);
configureApplicationConfig(bean);
configureModuleConfig(bean);
postConfigureBean(annotation, bean);
}
ReferenceAnnotationBeanPostProcessor.ReferenceMethodElement#inject->ReferenceBean.getObject()->ReferenceConfig#init
private void init() {
if (initialized) {
return;
}
initialized = true;
if (interfaceName == null || interfaceName.length() == 0) {
throw new IllegalStateException(" interface not allow null!");
}
// get consumer's global configuration
checkDefault();
appendProperties(this);
if (getGeneric() == null && getConsumer() != null) {
setGeneric(getConsumer().getGeneric());
}
if (ProtocolUtils.isGeneric(getGeneric())) {
interfaceClass = GenericService.class;
} else {
try {
interfaceClass = Class.forName(interfaceName, true, Thread.currentThread()
.getContextClassLoader());
} catch (ClassNotFoundException e) {
throw new IllegalStateException(e.getMessage(), e);
}
checkInterfaceAndMethods(interfaceClass, methods);
}
String resolve = System.getProperty(interfaceName);
String resolveFile = null;
if (resolve == null || resolve.length() == 0) {
resolveFile = System.getProperty("dubbo.resolve.file");
if (resolveFile == null || resolveFile.length() == 0) {
File userResolveFile = new File(new File(System.getProperty("user.home")), "dubbo-resolve.properties");
if (userResolveFile.exists()) {
resolveFile = userResolveFile.getAbsolutePath();
}
}
if (resolveFile != null && resolveFile.length() > 0) {
Properties properties = new Properties();
FileInputStream fis = null;
try {
fis = new FileInputStream(new File(resolveFile));
properties.load(fis);
} catch (IOException e) {
throw new IllegalStateException("Unload " + resolveFile + ", cause: " + e.getMessage(), e);
} finally {
try {
if (null != fis) fis.close();
} catch (IOException e) {
logger.warn(e.getMessage(), e);
}
}
resolve = properties.getProperty(interfaceName);
}
}
if (resolve != null && resolve.length() > 0) {
url = resolve;
if (logger.isWarnEnabled()) {
if (resolveFile != null) {
logger.warn("Using default dubbo resolve file " + resolveFile + " replace " + interfaceName + "" + resolve + " to p2p invoke remote service.");
} else {
logger.warn("Using -D" + interfaceName + "=" + resolve + " to p2p invoke remote service.");
}
}
}
if (consumer != null) {
if (application == null) {
application = consumer.getApplication();
}
if (module == null) {
module = consumer.getModule();
}
if (registries == null) {
registries = consumer.getRegistries();
}
if (monitor == null) {
monitor = consumer.getMonitor();
}
}
if (module != null) {
if (registries == null) {
registries = module.getRegistries();
}
if (monitor == null) {
monitor = module.getMonitor();
}
}
if (application != null) {
if (registries == null) {
registries = application.getRegistries();
}
if (monitor == null) {
monitor = application.getMonitor();
}
}
checkApplication();
checkStubAndMock(interfaceClass);
Map map = new HashMap();
Map
二、创建出的代理类如何完成的调用 总结



