ВВЕДЕНИЕ: Круглая зависимость - это вложенная цикл в классах N. Если эта круговая зависимость возникает в ежедневной разработке с использованием метода нового объекта, программа будет продолжать вызывать его цикл во время выполнения, пока память не переполнит и сообщает об ошибке. Давайте поговорим о весне, если она решает круговые зависимости.
Первый тип: параметр конструктора Циклическая зависимость
Весенний контейнер разместит каждый идентификатор бобов, созданный в «текущем пуле бобов», и идентификатор бобов останется в этом пуле во время процесса создания. Поэтому, если вы обнаружите, что вы уже находитесь в «текущем пуле бобов» во время процесса создания, он будет брошен.
Исключение BeancurlyincreationException указывает на круговую зависимость; Созданный фасоль будет очищен из «в настоящее время созданного бассейна бобов».
Сначала мы инициализируем три боба.
Общественный класс Студент {Частный Студент Студент public void setStudentb (StudentB StudentB) {this.StudentB = StudentB; } public Studenta () {} public Studenta (StudentB StudentB) {this.StudentB = StudentB; }} Public Class Student public void setStudentc (studentC StudentC) {this.Studentc = StudentC; } public StudentB () {} public StudentB (StudentC StudentC) {this.Studentc = StudentC; }} Public Class Student public void setStudenta (студентка студента) {this.Studenta = Studenta; } public StudentC () {} public StudentC (студентка студента) {this.Studenta = Studenta; }}ОК, вышеупомянутые три очень основных класса. Структура параметров Studenta - студент. Структура параметров StudentB - это StudentC, а структура параметров StudentC - это Studenta, которая создает ситуацию с циркулярной зависимостью.
Мы все передали эти три боба управлению пружиной и создали их с помощью конструкций параметров
<bean id = "a"> <constructor-arg index = "0" ref = "b"> </constructor-arg> </bean> <bean id = "b"> <constructor-arg index = "0" ref = "c"> </constructor-arg> </bean> <bean id = "c"> <constructor-arg = "0" "" ref = "a"> </constructor-arg> </bean>
Вот тестовый класс:
открытый тест класса {public static void main (string [] args) {ApplicationContext context = new ClassPathxMlapplicationContext ("com/zfx/studive/applicationContext.xml"); //System.out.println(context.getbean("a ", Student.class)); }}Сообщение об ошибке результата выполнения:
Вызвано: org.springframework.beans.factory.beancurlyincreationException:
Ошибка Создание боба с именем «A»: Запрашиваемый Bean в настоящее время находится в создании: есть ли неразрешимая круговая ссылка?
Если вы понимаете предложение в начале, вы не должны удивляться сообщению об этой ошибке. Весенний контейнер сначала создает Singleton Studenta. Студента зависит от студента, а затем помещает в «текущий бассейн бобов». В настоящее время создается Student В настоящее время создается студент, студент зависит от студента. Однако в настоящее время студент уже находится в бассейне, поэтому будет сообщена ошибка. Поскольку все бобы в бассейне не были инициализированы, они будут зависеть от ошибок. (Инициализированная фасоль будет удален из бассейна)
Второй тип: метод сеттера Singleton, метод по умолчанию
Если вы хотите поговорить о инъекции сеттера, нам лучше посмотреть на картину экстремительных бобов весной
Как показано в первых двух шагах на рисунке, Spring создает объект бобов, а затем устанавливает свойства объекта.
Измените файл конфигурации, чтобы ввести его в режим установки:
<!-scope = "singleton" (по умолчанию-это метод Singleton)-> <bean id = "a" scope = "singleton"> <name = "studentb" ref = "b"> </property> </bean> <bean id = "b" scope = "singleton"> <property name = "studentc" ref = "c"> </property> </bean> <bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> <bean> Scope = "singleton"> <name = "student" ref = "a"> </property> </bean>
Вот тестовый класс:
открытый тест класса {public static void main (string [] args) {ApplicationContext context = new ClassPathxMlapplicationContext ("com/zfx/studive/applicationContext.xml"); System.out.println (context.getbean ("a", Student.class)); }}Результат печати:
com.zfx.student.studenta@1fbfd6
Почему вы не сообщите об ошибке, используя метод SET?
Давайте посмотрим на картинку выше. Весна первая создает объект бобов с помощью конструкций. В настоящее время Spring поместит созданный объект в карту, а пружина предоставляет метод получения справочной справки объекта с помощью атрибута Unset. Основываясь на нашем примере, когда Spring создает Studenta, StudentB и StudentC, он затем установит свойства объекта. В настоящее время Studenta будет полагаться на StudentB и выберет объект Singleton Student
Ниже приведен метод реализации в исходном коде Spring. Следующий исходный код находится в классе Defalingingletonbeanregistry.java в пакете весеннего боба
/ ** Кэш из объектов Singleton: имя боба -> экземпляр боба (коллекция карт, которые кэшируют синглтон -созданные объекты)*/ Private Final Map <String, Object> SingletonObjects = new Concurrenthashmap <String, Object> (64); / ** Кэш синглтонских фабрик: имя бобов -> objectFactory (Singleton Factory Cacache Cache)*/ Private Final Map <String, ObjectFactory> singletonfactory = new Hashmap <String, ObjectFactory> (16); / ** Кэш ранних объектов Singleton: имя боба -> экземпляр боба*/ private final Map <String, Object> RanachsingletonObjects = new Hashmap <String, Object> (16); / ** Набор зарегистрированных синглтонов, содержащих имена бобов в заказах за регистрацию*/ private final Set <stry> зарегистрированные линии = new LinkedHashset <string> (64); /*** Добавить экземпляр Синглтона* Решите проблему круговых ссылок* Добавьте данную синглтонскую фабрику для создания указанного Синглтона* при необходимости. * <p> для того, чтобы быть призванным для нетерпеливой регистрации синглтонов, например, чтобы иметь возможность * разрешить круговые ссылки. * @param beanname Имя боба * @param singletonfactory Фабрика для объекта Singleton */ Protected void Addsingletonfactory (String Beanname, ObjectFactory SingletonFactory) {assert.notnull (singletonfactory, "Singleton Factory не должен быть null"); синхронизированный (this.singletonObjects) {if (! this.singletonobjects.containskey (beanname)) {this.singletonfactories.put (beanname, singletonfactory); это. this.Reargedsingletons.add (Beanname); }}Третий тип: прототип сеттера, прототип
Изменить файл конфигурации на:
<bean id = "a" <span style = "color:#ff0000;"> scope = "prototype" </span >> <name = "studentb" ref = "b"> </property> </bean> <bean id = "b" <span style = "color:#ff0000;"> scope = "Prototype" </span >> <name = name = "reftc"/"ref"/"ref"/"ref"/"ref"/"ref"/"ref"/"ref"/"ref"/"ref"/"ref"/"/" ref "/" ref "/" ref ". <bean id="c" <span style="color:#FF0000;">scope="prototype"</span>> <property name="studentC" ref="c"></property> </bean> <bean id="c" <span style="color:#FF0000;">scope="prototype"</span>> <property name="studentA" ref="a"></property> </bean>
Scope = "Prototype" означает, что объект экземпляра создается каждый раз, когда вы запрашиваете. Разница между этими двумя: Stateful Beans использует применение прототипа, в то время как бездейство обычно используют синглтон -синглтон.
Тестовые примеры:
открытый тест класса {public static void main (string [] args) {ApplicationContext context = new ClassPathxMlapplicationContext ("com/zfx/studive/applicationContext.xml"); <strong> // В настоящее время вы должны получить экземпляр управления Spring, потому что теперь Scope = "Prototype" будет создавать только этот объект при запросе на получение </strong> system.out.println (context.getbean ("a", student.class)); }} Результат печати:
Вызвано: org.springframework.beans.factory.beancurlyIncreationException: Ошибка создания бобов с именем «A»: Запрашиваемый Бин в настоящее время находится в создании: есть ли неразрешимая круговая ссылка?
Почему модель прототипа неверна?
Для бобов «прототип» пружинный контейнер не может завершить инъекцию зависимостей, потому что пружинный контейнер не кэширует бобы в «прототипе», поэтому созданные бобы не могут быть выставлены заранее.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.