Cómo entender la diferencia entre @Resource y @Reference
@Resource: anotación de primavera, función: obtener beans que se han inyectado en primavera
@Referencia: anotación dubbo, función: inyectar el objeto del servicio duboo
2. Problemas encontrados:
Configuración local:
Error: No hay ningún proveedor disponible en el registro **** para el servicio ------- -- ---
Vaya, un error clásico cuando vi este error, pensé que era que el productor no había iniciado Hola, fui a zk para ver la situación del productor dubbo. de hecho no hay problema. Parece que ha sido descubierto, etc. No sé por qué quiere ir al Registro 1. ¿No debería ir al Registro 1 y 2 al mismo tiempo? Por cierto, no importa qué método utilice para registrar dubbo, no es más que especificar el registro y la versión. Como no lo especificé, debe ensamblarse automáticamente según el entendimiento de Spring, así que configuré dos aquí. ¿Podrá buscar en el registro de forma inteligente? (No, si el productor de Dubbo especifica varios registros, entonces el servicio declarado por
Basado en una serie de conjeturas, cambié la configuración a:
El problema fue resuelto,,,,,
Descubrí un nuevo problema: usar @Reference Inject dubbo service. Si quiero usarlo en varios lugares del proyecto, uso @Reference en varias clases. ¿No significa que tengo que inyectar varios beans (hay un problema con esta comprensión? aún no lo sé). Obviamente, esto es un problema, por lo que quería inyectar el servicio Dubbo en Spring como una instancia única y reemplazarlo con la etiqueta @Resource propia de Spring para obtenerlo, así que cambié la configuración:
Prueba: es De hecho, es factible, ya que no hay ningún problema con el uso de la configuración, se ajusta a la lógica normal de cada uno,
Pero también hay un problema, es decir:
"Lo descubrí". un nuevo problema: usar la inyección @Reference Cuando uso el servicio dubbo, si quiero usarlo en varios lugares de mi proyecto, no inyectará varios beans cuando uso @Reference en varias clases". ¿Existe realmente este problema?
Respondamos esta pregunta a continuación:
Spring usa xml o anotaciones para la configuración, pero la forma en que se usan es diferente. El efecto de @Reference y
Si varias etiquetas @Reference inyectan servicios con exactamente la misma información de configuración, habrá un caché de bean de servicio. Para garantizar que solo habrá un bean de servicio, el código fuente es el siguiente: El método generateReferenceBeanCacheKey. ? es la clave de caché que se va a obtener.
private ReferenceBean > buildReferenceBean(Reference reference, Class > referenceClass) throws Exception { // Obtener la clave de caché para el objeto de referencia del servicio String referenceBeanCacheKey = generateReferenceBeanCacheKey(reference, referenceClass); el objeto de referencia del servicio del mapa de caché ReferenceBean> referenceBean = referenceBeansCache.get(referenceBeanCacheKey); if (referenceBean == null) { // Si el objeto de referencia está vacío, crea un ReferenceBeanBuilder en su lugar beanBuilder = ReferenceBeanBuilder .create(reference , classLoader, applicationContext) .interfaceClass(referenceClass); referenceBean = beanBuilder.build() // y poner en el mapeo de caché. referenceBeansCache.putIfAbsent(referenceBeanCacheKey, referenceBean); } return referenceBean; } private String generateReferenceBeanCacheKey(Referencia de referencia, Clase > beanClass) { // Obtener el nombre de la interfaz String interfaceName = resolveInterfaceName(reference, beanClass); + nombre de la interfaz + número de versión de la interfaz + agrupación de interfaces para usar como clave de caché Clave de cadena = referencia.url() + "/" + nombre de la interfaz + "/" + referencia.versión() + "/" + referencia.grupo() ; Entorno entorno = applicationContext.getEnvironment(); clave = entorno.resolvePlaceholders(clave) }
De esta manera, se completa el enunciado del problema.
Preguntas:
1. Para registros múltiples y cableado automático de Spring, debe especificar un registro o configurar el registro en verdadero de forma predeterminada.
2. @Resource y @Reference se pueden inyectar en el servicio dubbo, pero los conceptos son diferentes.
3. La anotación @Reference se puede inyectar en varias clases con el mismo bean de servicio sin que el bean de servicio exista en varias clases.
Nota: El código fuente hace referencia al artículo/artículo/121.