Это 30-й день моего участия в августовском испытании обновлений. Ознакомьтесь с подробностями мероприятия: Испытание августовского обновления
В чем разница между BeanFactory и ApplicationContext
BeanFactory можно понимать как фабричный класс, содержащий коллекцию bean-компонентов. BeanFactory содержит определения различных bean-компонентов для создания экземпляра соответствующего bean-компонента при получении запроса клиента.
BeanFactory также может генерировать отношения между сотрудничающими классами при создании экземпляров объектов. Это освобождает конфигурацию самого компонента и клиента компонента. BeanFactory также содержит управление жизненным циклом бина, вызывая методы инициализации клиента (методы инициализации) и методы уничтожения (методы уничтожения).
На первый взгляд контекст приложения, как и фабрика компонентов, имеет определения компонентов, настройки ассоциации компонентов и функцию распределения компонентов в соответствии с запросами. Но контекст приложения также предоставляет другие функции на этой основе.
Предоставляет текстовые сообщения, которые поддерживают интернационализацию
Единый метод чтения файлов ресурсов
События для bean-компонентов, зарегистрированных в слушателях
Жизненный цикл Spring Bean
Жизненный цикл Spring Bean прост и понятен. При инициализации экземпляра компонента необходимо выполнить ряд операций инициализации, чтобы достичь пригодного для использования состояния. Точно так же, когда bean-компонент больше не вызывается, его необходимо уничтожить и удалить из контейнера bean-компонента.
Фабрика компонентов Spring отвечает за управление жизненным циклом компонентов, созданных в контейнере Spring. Жизненный цикл Бина состоит из двух наборов методов обратного вызова (callback).
Метод обратного вызова, вызываемый после инициализации.
Метод обратного вызова, вызываемый перед уничтожением.
Spring Framework предоставляет следующие четыре способа управления событиями жизненного цикла компонента:
Интерфейс обратного вызова InitializingBean и DisposableBean
Дополнительные интерфейсы Aware для особого поведения
Пользовательский метод init() и метод destroy() в файле конфигурации Bean
Методы аннотации @PostConstruct и @PreDestroy
Как реализован Spring IOC****
Пакеты org.springframework.beans и org.springframework.context в Spring составляют основу контейнера IoC Spring Framework.
Интерфейс BeanFactory предоставляет расширенный механизм конфигурации, который делает возможной настройку любого типа объекта. Интерфейс ApplicationContex расширяет BeanFactory (который является подчиненным интерфейсом) и добавляет другие функции, основанные на BeanFactory, такие как более простая интеграция с AOP Spring, а также предоставляет механизм для обработки ресурсов сообщений (для интернационализации), распространения событий и уровня приложения. конкретной конфигурации, такой как WebApplicationContext для веб-приложений.
org.springframework.beans.factory.BeanFactory — это конкретная реализация контейнера Spring IoC, который упаковывает и управляет различными компонентами, упомянутыми выше. Интерфейс BeanFactory — это основной интерфейс контейнера Spring IoC.
Talk Talk Весна АОП
Аспектно-ориентированное программирование, в нашем приложении нам часто нужно делать какие-то вещи, но эти вещи не имеют никакого отношения к основному делу, например, записывать время выполнения, оператора и другую информацию всех методов update*, записывать их в журнале,
Благодаря технологии Spring AOP это требование может быть выполнено без изменения кода обновления *.
Принцип реализации Spring АОП
Существует два основных способа динамического прокси в Spring AOP: динамический прокси JDK и динамический прокси CGLIB. Динамический прокси-сервер JDK получает проксируемый класс посредством отражения и требует, чтобы проксируемый класс реализовывал интерфейс. Ядром динамического прокси-сервера JDK является интерфейс InvocationHandler и класс Proxy.
Если целевой класс не реализует интерфейс, Spring AOP выберет использование CGLIB для динамического проксирования целевого класса. CGLIB
(Библиотека генерации кода) — это библиотека классов, сгенерированная кодом, которая может динамически генерировать подклассы класса во время выполнения.Обратите внимание, что CGLIB является динамическим прокси через наследование, поэтому, если класс помечен как final , он не может использовать CGLIB в качестве динамического прокси.
Динамические прокси (cglib и JDK)
И динамические прокси-классы JDK, и классы делегатов должны реализовывать один и тот же интерфейс. Другими словами, только классы, реализующие интерфейс, могут использовать механизм динамического прокси Java. Однако на самом деле не все классы, встречающиеся в использовании, будут реализовывать для вас интерфейс. Поэтому этот механизм нельзя использовать для классов, не реализующих интерфейс. С другой стороны, CGLIB может реализовать динамическое проксирование классов.
Реализация весенней транзакции
1. Метод кодирования
Так называемая программная транзакция относится к реализации транзакции посредством кодирования, что аналогично программированию JDBC для реализации управления транзакциями.
2. Декларативное управление транзакциями
Существует два способа реализовать декларативное управление транзакциями: один основан на файлах конфигурации xml, а другой заключается в аннотации @Transaction к бизнес-методам для применения правил транзакций к бизнес-логике.
Основной принцип транзакции Spring
А. Разделить блок обработки - IOC
Поскольку проблема, решаемая Spring, заключается в выполнении частичной обработки транзакций в одной базе данных, премьер-министр конкретной реализации разделяет блок обработки транзакций с IOC в spring. И поместите различные конфигурации транзакции в контейнер ioc (установите диспетчер транзакций, установите характеристики распространения и механизм изоляции транзакции).
б) АОП перехватывает классы, требующие обработки транзакций
Модуль обработки транзакций Spring реализует декларативную обработку транзакций через функцию АОП.Для конкретных операций (таких как конфигурация и чтение выполнения транзакции, абстракция объектов транзакций) используется интерфейс TransactionProxyFactoryBean для использования функции АОП для генерации прокси-объектов, которые выполняются через TransactionInterceptor Перехват прокси-метода, вплетая функциональность обработки транзакций в перехваченный метод. Прочитайте свойства конфигурации транзакции контейнера ioc и преобразуйте их в обработку транзакции spring.
Требуемая внутренняя структура данных (TransactionAttributeSourceAdvisor) преобразуется в объект данных, представленный TransactionAttribute.
c. Реализация обработки транзакций (генерация транзакций, отправка, откат, приостановка)
Spring делегирует конкретные реализации процессора транзакций. Реализована абстракция и адаптация. Адаптированные обработчики транзакций: поддержка источника данных DataSource, поддержка обработки транзакций источника данных в спящем режиме, поддержка обработки транзакций источника данных JDO, поддержка обработки транзакций источника данных JPA, JTA. Эти опоры по дизайну
PlatformTransactionManager, AbstractPlatforTransaction Ряд поддержки обработки транзакций. Ряд менеджеров транзакций предоставляется для поддержки общих источников данных.
д., совмещать
PlatformTransactionManager реализует интерфейс TransactionInterception и объединяет его с TransactionProxyFactoryBean для формирования системы разработки декларативной обработки транзакций Spring.
Как настроить функцию реализации аннотации
Создание пользовательской аннотации похоже на создание интерфейса, но ключевое слово интерфейса аннотации должно начинаться с символа @.
Аннотированные методы не могут иметь параметров;
Тип возвращаемого значения метода аннотации ограничен: базовым типом, String, Enums, Annotation или массивом этих типов;
Методы аннотации могут иметь значения по умолчанию;
Сами аннотации могут содержать метааннотации, которые используются для аннотирования других аннотаций.
Рабочий процесс Spring MVC
1. spring mvc отправляет все запросы в DispatcherServlet, который возлагает ответственность за реальную обработку запросов на другие модули прикладной системы.
2. DispatcherServlet запрашивает одно или несколько отображений HandlerMapping, чтобы найти контроллер, обрабатывающий запрос.
3. DispatcherServlet отправьте запрос целевому контроллеру.
4. После того, как контроллер обработает бизнес-логику, он вернет ModelAndView.
5. Dispathcher запрашивает один или несколько преобразователей представлений ViewResolver, чтобы найти объект представления, указанный объектом ModelAndView.
6. Объект представления отвечает за рендеринг и возврат его клиенту.
Процесс запуска Spring MVC
В файле web.xml загрузка при запуске настроена для сервлета Spring MVC, поэтому программа запускается
Когда Spring MVC инициализируется, contextConfigLocation будет настроен в HttpServletBean.
Атрибуту присваивается сервлет, а затем в FrameworkServlet создается WebApplicationContext,
DispatcherServlet инициализируется в соответствии с файлом xml в пути к классам, настроенном contextConfigLocation.
Общие компоненты Spring MVC.
Почему выбирают Нетти
- API прост в использовании, а порог освоения низкий;
- Мощные функции, предустановленные различные функции кодека, поддержка различных основных протоколов;
- Широкие возможности настройки, коммуникационная структура может быть гибко расширена с помощью ChannelHandler;
- Высокая производительность по сравнению с другими основными инфраструктурами NIO в отрасли, Netty имеет лучшую общую производительность;
- Зрелая и стабильная, Netty исправила все ошибки JDK NIO, которые были обнаружены, и бизнес-разработчикам больше не нужно беспокоиться об ошибках NIO;
6) Сообщество активное, цикл итерации версии короткий, найденные баги можно вовремя исправить, при этом будет добавляться больше новых функций;
- После крупномасштабного коммерческого тестирования качество было подтверждено. Он был успешно коммерциализирован во многих отраслях, таких как Интернет, большие данные, онлайн-игры, корпоративные приложения и телекоммуникационное программное обеспечение, доказав, что он может полностью соответствовать коммерческим приложениям в различных отраслях.
Именно из-за этих преимуществ Netty постепенно стала предпочтительной средой для программирования Java NIO.
Расскажите о сценариях использования Netty в бизнесе
Создавайте различное промежуточное ПО Java с высокой производительностью и малой задержкой, такое как MQ, инфраструктура распределенных служб, шина сообщений ESB и т. д. Netty в основном используется в качестве базовой коммуникационной среды для предоставления высокопроизводительных коммуникационных услуг с малой задержкой;
Базовая коммуникационная структура для общедоступных или частных стеков протоколов, например, на основе Netty может быть построен асинхронный высокопроизводительный стек протоколов WebSocket;
Для приложений в различных областях, таких как большие данные, игры и т. д., Netty, как высокопроизводительный коммуникационный фреймворк, используется для распределения данных, передачи и агрегации внутренних модулей и т. д., для достижения высокопроизводительного обмена данными между модулями. .
Нативный NIO имеет ошибку epoll в JDK 1.7.
Это приводит к пустому опросу селектора и, в конечном итоге, к 100% загрузке процессора. Официальный сайт утверждает, что проблема была исправлена в версии JDK 1.6 update18, но проблема все еще существует до версии JDK 1.7, но вероятность появления BUG снижена, и она не решена принципиально.
Что такое склеивание/распаковка TCP
1. Если данные для отправки превышают оставшееся место в буфере отправки TCP, произойдет распаковка.
2. Если отправляемые данные больше, чем MSS (максимальная длина сообщения), TCP распаковывает перед отправкой.
3. Размер отправляемых данных меньше, чем размер буфера отправки TCP.TCP будет отправлять данные, записанные в буфер, несколько раз за один раз, что приведет к залипанию пакета.
4. Если прикладной уровень принимающей стороны данных не считывает данные в приемном буфере вовремя, будут возникать липкие пакеты.
Решение проблемы склеивания/распаковки TCP
1. Отправитель добавляет к каждому пакету данных заголовок пакета.Заголовок должен содержать как минимум длину пакета данных, чтобы получатель мог узнать фактическую длину каждого пакета данных, прочитав поле длины заголовка пакета после получения данные. .
2. Отправитель инкапсулирует каждый пакет данных в фиксированную длину (если этого недостаточно, его можно заполнить 0), чтобы принимающая сторона естественным образом разделяла каждый пакет данных каждый раз, когда считывает данные фиксированной длины из приемного буфера. , Приходите.
3. Между пакетами данных может быть установлена граница, например добавление специальных символов, чтобы принимающая сторона могла разделить разные пакеты данных через эту границу.
Модель потоков Netty
Прежде всего, Netty использует EventLoop для обработки событий чтения и записи в соединении, и все запросы в соединении гарантированно обрабатываются в EventLoop.В EventLoop есть только один поток, поэтому все события в соединении будут только обрабатывается, выполняется в потоке. EventLoopGroup содержит несколько EventLoop, EventLoop можно рассматривать как поток в модели потоков Reactor, а EventLoopGroup аналогичен ExecutorService.
Разговор о нулевой копии Нетти
«Нулевая копия» относится к процессу работы компьютера, при котором центральному процессору не нужно потреблять ресурсы для копирования данных между памятью. И это обычно относится к тому, что когда компьютер отправляет файл по сети, ему не нужно копировать содержимое файла в пространство пользователя (пространство пользователя) и напрямую передает его в сеть в пространстве ядра (пространство ядра) .
Внутренний процесс выполнения Netty
- Получение и отправка Netty ByteBuffer использует DIRECT BUFFERS и использует прямую память вне кучи для чтения и записи Socket без необходимости во второй копии байтового буфера. Если традиционная память кучи (HEAP BUFFERS) используется для чтения и записи сокета, JVM скопирует буфер кучи памяти в прямую память, а затем запишет его в сокет. По сравнению с прямой памятью вне кучи, сообщение имеет дополнительную копию памяти буфера во время процесса отправки.