Интерфейс представляет возможность, а реализация интерфейса означает наличие возможности.
Отношения между BeanDefinition и Bean аналогичны отношениям между классом и объектом.Структура данных класса весной - BeanDefinition.Объект, полученный в соответствии с BeanDefinition, - это нужный нам Bean.
Я думаю, что понимание Bean и BeanDefinition является основой и ключом к пониманию всей архитектуры Spring. Я начну с Bean и BeanDefinition, чтобы медленно открыть внутреннюю часть spring.
Изучая beans и BeanDefinition, думаю, его можно разделить на две части для пошагового анализа.
- С одной стороны, начните с определения: изучите определение Bean/BeanDefinition весной.
- С другой стороны, начните с действий (операций): изучите связанные операции Bean/BeanDefinition.
BeanDefinition
BeanDefinition — это описание bean in spring. С помощью BeanDefinition мы можем создать Bean. BeanDefinition — это форма определения bean in spring. Далее давайте взглянем на связанные интерфейсы и классы BeanDefinition.
определение
- Интерфейс BeanDefinitionБазовый интерфейс верхнего уровня используется для описания bean-компонента и хранит метаданные bean-компонента, такие как имя класса bean-компонента, область действия, свойства, список параметров конструктора, зависимые bean-компоненты, является ли это одноэлементным классом, является ли он отложенной загрузкой, и другая информация.
вверх
- Интерфейс BeanMetadataElement: метаданные BeanDefinition, возвращает источник bean-компонента
- Интерфейс AttributeAccessor: Предоставляет возможность работать с атрибутами BeanDefinition,
вниз
-
Класс AbstractBeanDefinition: абстрактный класс единообразно реализует часть операций, определенных BeanDefinition, которые, можно сказать, определяют многие свойства BeanDefinition по умолчанию. Именно на основе AbstractBeanDefinition Spring создал ряд BeaDefinitions.
Здесь мы можем сосредоточиться на переопределенных методах equals(), hashcode(), toString().
Кроме того, атрибут initMethodName и атрибут destroyMethodName связаны с жизненным циклом этих двух компонентов атрибутов.Здесь упоминается только одно предложение и последующее объяснение.
Следующий. Давайте рассмотрим несколько классов, производных от AbstractBeanDefinition.
-
RootBeanDefinition: Представляет BeanDefinition из xml, java Config
-
ChildBeanDefinition: Позволяет дочерним определениям BeanDefinition иметь возможность наследовать конфигурацию от родителей.
-
GenericBeanDefinition:После весны 2.5 первым выбором для регистрации bean-компонентов является GenericBeanDefinition. GenericBeanDefinition позволяет динамически устанавливать родительский компонент GenericBeanDefinition можно использовать вместо RootBeanDefinition и ChildBeanDefinition.
-
Интерфейс AnnotatedBeanDefinition: Представляет тип аннотации BeanDefinition. Есть два важных атрибута, AnnotationMetadata и MethodMetadata, соответственно, представляющие метаинформацию аннотации и метаинформацию метода BeanDefinition. BeanDefinition, реализующий этот интерфейс, может получать метаданные аннотации и метаданные метода.
-
Класс AnnotatedGenericBeanDefinition: Представляет класс BeanDefinition с аннотацией @Configuration.
-
Класс ScannedGenericBeanDefinition: Представляет классы Bean, аннотированные @Component, @Service, @Controller и другими аннотациями.
действовать
Действия также можно разделить на два типа: Один из них — действие для самого себя: действие, предоставляемое извне, которое может действовать само по себе. Другая — внешняя операция BeanDefinition.
-
Интерфейс BeanDefinitionRegistry: Он имеет возможность добавлять, проверять и удалять BeanDefinition. Одновременно может быть зарегистрировано только одно определение BeanDefinition.
Реализовать классы SimpleBeanDefinitionRegistry, DefaultListableBeanFactory, GenericApplicationContext и т. д. Общий класс реализации имеет private final Map
beanDefinitionMap = new ConcurrentHashMap() для хранения BeanDefinition. -
Интерфейс BeanDefinitionReader: Либо используйте конструкцию BeanDefinitionRegistry. Вы также можете загрузить конфигурацию в несколько BeanDefinition через loadBeanDefinitions и зарегистрировать их в BeanDefinitionRegistry. Можно сказать, что это эффективная версия BeanDefinitionRegistry. Класс реализации имеет XmlBeanDefinitionReader считывает BeanDefinition из xml; PropertiesBeanDefinitionReader читает BeanDefinition из файла свойств
-
Класс AnnotatedBeanDefinitionReaderЗарегистрируйте BeanDefinition с аннотацией
-
Класс ClassPathBeanDefinitionScanner: BeanDefinitions, которые можно сканировать в @Component @Repository @Service @Controller, регистрируются в контейнере.
другие формы
- BeanDefinitionHolder: класс-оболочка BeanDefinition.
Bean
Bean — это нужный нам объект, результат, который мы получаем от spring, то есть экземпляр объекта
определение
На уровне определения Bean — это фактически тот объект, который нам нужен.
действовать
Давайте взглянем на связанные с операциями интерфейсы или классы, которые есть у Bean в Spring.
- Интерфейс SingletonBeanRegistry: соответствует регистрации BeanDefinition. Операция Bean также имеет аналогичный интерфейс для работы Bean. Интерфейс SingletonBeanRegistry предоставляет такие функции, как регистрация, получение и оценка существования Bean.
- InitializingBean: для bean-компонента, который реализует InitializingBean, он будет выполняться afterPropertiesSet() после того, как будут установлены все свойства bean-компонента.
- InstantiationStrategy: Предоставляет интерфейс стратегии для создания экземпляров Bean,
- DisposableBean: для bean-компонента, который реализует DisposableBean, он будет запускать destroy() после того, как контейнер Spring выпустит bean-компонент.
- FactoryBean: Бин, который производит Бин.
другие формы
- БинВраппер: Упаковка Bean.BeanWrapper можно рассматривать как продукт от BeanDefinition к процессу Bean, который можно назвать "низкоуровневым bean-компонентом", в общем, в реальных проектах мы его использовать не будем. BeanWrapper — важный компонентный класс в среде Spring. Он эквивалентен прокси-классу. Spring поручает BeanWrapper завершить заполнение свойств Bean. После создания экземпляра компонента с помощью InstantiatioonStrategy контейнер Spring оборачивает экземпляр компонента с помощью BeanWrapper, что выполняется с помощью BeanWrapper.setWrappedInstance().
Суммировать:
BeanDefinition是物料,Bean是成品,理解BeanDefinition与Bean的关系是理解spring的基础
.
Следующей частью является разделение склада материалов и склада готовой продукции, что отражается в операции «хранение». Приглашаю всех обратить внимание на мою общедоступную учетную запись [действие с исходным кодом], и последнее личное понимание будет доставлено своевременно.