proceso de desarrollo, B, similar al caso de A-> B-> A existe a menudo; ver el DefaultSingletonBeanRegistry fuente primavera
getSingleton (String beanName, allowEarlyReference boolean) 方法:
/ ** * Hoja de Ruta de primavera referencias circulares: referencias autorizados a realizar objeto singleton Actualmente creado de antemano, * Las propiedades del avance de inyección Singleton referencia de objeto no se ha completado, es posible resolver el problema de las referencias circulares * Retorno del (crudo) objeto singleton registrada bajo el nombre dado. * <P> Los cheques ya instanciados únicos y también permite una temprana * Referencia a un producto único que está creando (resolución de una referencia circular). * Los cheques han creado instancias de objeto único y permite referencias para avanzar se está creando actualmente la implementación de un solo caso (para resolver referencias circulares). * @Param beanName el nombre del grano para tener en cuenta * @Param allowEarlyReference si los primeros referencias se deben crear o no * @Return el objeto singleton registrado, o {} @code nula si no localizados * / @Nullable Objeto protegido getSingleton (String beanName, allowEarlyReference boolean) { // iniciar caché Singleton de encontrar, no hemos encontrado la primera será determinar si se está creando el frijol // objeto singleton determina si el correspondiente isSingletonCurrentlyInCreation en la creación Objeto singletonObject = esto. singletonObjects .get (beanName); si (singletonObject == null && isSingletonCurrentlyInCreation (beanName)) { sincronizadas (this.singletonObjects) { // earlySingletonObjects ahorro todos los casos individuales de la exposición temprana, tratan mirando desde earlySingletonObjects singletonObject = esto. earlySingletonObjects .get (beanName); si (singletonObject == null && allowEarlyReference) { // Si se permite que la dependencia a tiempo, puede tratar de encontrar el modo de realización correspondiente a la planta de singletonFactories ObjectFactory <?> = SingletonFactory esto. singletonFactories .get (beanName); si (singletonFactory! = null) { // Crear frijol de soja, la exposición temprana y la memoria caché de frijol, atributo aún no se inyecta, se utiliza para resolver dependencias circulares singletonObject = singletonFactory.getObject (); this.earlySingletonObjects.put (beanName, singletonObject); this.singletonFactories.remove (beanName); } } } } volver singletonObject; }
Descripción:
/ ** caché de objetos Singleton: Nombre del grano a la instancia del bean. * /
/ * * Caché Singleton frijol /
final privado Map <String, Object> singletonObjects = new ConcurrentHashMap <> (256);
/ ** Caché de fábricas simples: nombre del bean a ObjectFactory. * /
/ * ** Las fábricas sola cache /
final privado Map <String, ObjectFactory <>> singletonFactories = new HashMap <> (16);
/ ** caché de objetos Singleton principios: Nombre del grano a la instancia del bean. * /
/ * Cache bean singleton exposición temprana es decir inyecta propiedad de bean no se ha completado * /
privados finales mapa <String, Object> earlySingletonObjects = new HashMap <> (16);
/ ** Conjunto de embarazos únicos registrados, que contienen los nombres de frijol en orden de inscripción. * /
Conjunto final privado <String> registeredSingletons = new LinkedHashSet <> (256);
interfaz () método getObject ObjectFactory:
pública interfaz ObjectFactory <T> { / ** * Este método devuelve una instancia del bean de gestión de la planta de haba * Devolver una instancia (posiblemente compartido o independiente) * Del objeto gestionado por esta fábrica. * @Return la instancia resultante * @Throws BeansException en caso de errores de creación * / T getObject () lanza BeansException; }
Recycling Solutions referencias:
1 usando anotación @Autowired, tiempo de inyección determinado por el resorte de atributo de objeto, una referencia al objeto A se expone, cuando el objeto B requiere la inyección;
método de inyección 2 setter basado en el atributo B