Проект введения
В последние годы технологии выбора веб-систем в основном были представлены архитектурой SpringMVC + Spring или Struts2 + Spring, представляющей собой монолитный фреймворк. В процессе итеративной разработки реальных проектов задачи являются срочными, а цикл разработки коротким, при этом навыки разработчиков различаются, и через несколько лет эксплуатации системы могут возникнуть следующие проблемы:
В последнее время облачные нативные технологии, микросервисы Dubbo и архитектура SpringCloud становятся популярными. При переходе от монолитной системы к микросервисной архитектуре существуют следующие проблемы:
На основе вышеуказанных проблем был разработан этот проект, позволяющий монолитной системе (не SpringBoot, не Dubbo, не SpringCloud) быстро и стабильно подключаться к облачной нативной микросервисной архитектуре, и постепенно объяснять в последующих архитектурах регистрацию сервисов, обнаружение сервисов и вызовы сервисов монолитной системы, а также имитировать процесс проектирования и идеи SpringCloud.
Применимые проекты Этот проект не является системной платформой, а относится к категории промежуточного программного обеспечения. На рынке уже есть много открытых проектов на основе SpringCloud, этот проект подходит для многолетних монолитных систем (не SpringBoot, не Dubbo, не SpringCloud), помогая старым проектам переходить на облачную нативную архитектуру и плавно переходить к микросервисной архитектуре. В ходе этого процесса будет объяснено, как использовать идеи и концепции исходного кода SpringCloud во время разработки проекта, а также некоторые из моих собственных интеграционных опытов. Изучение микросервиса, исследование исходного кода SpringCloud или Dubbo является абстрактным, и этот проект может помочь понять и применить его к реальным проектам, чтобы лучше понять основные механизмы SpringCloud.
Традиционный проект MVC будет иметь следующие возможности:
Вы узнаете о следующих технологиях:
Архитектура программного обеспечения Описание архитектуры программного обеспечения: архитектура проста и понятна, ниже приведена упрощённая архитектура интеграции традиционного MVC с возможностями SpringCloud, чем проще внутренняя структура, тем сложнее технические детали, которые необходимо реализовать, и они будут объяснены позже с точки зрения структуры технологии.
[|input_image_description|]
Объяснение модуля Модуль mvc-adapter-cloud включает в себя:
SpringMVC — пример MVC:
Руководство по установке
<dependency>
<groupId>com.opages.mvc.adapter</groupId>
<artifactId>adapter-common</artifactId>
<version>1.0.0</version>
</dependency>
<bean class="com.opages.mvc.adapter.common.autoconfigure.MVCAutoConfiguration" />
<dependency>
<groupId>com.opages.mvc.adapter</groupId>
<artifactId>adapter-nacos</artifactId>
<version>1.0.0</version>
</dependency>
#激活nacos注册中心
spring.mvc.nacos.enable=true
#MVC服务定义为一个服务,设置服务名
``` **spring.mvc.nacos.discovery.serviceName=mvc-example**
# nacos 注册中心地址
**spring.mvc.nacos.discovery.serverAddr=http://127.0.0.1:8848**
# nacos 服务版本号
**spring.mvc.nacos.discovery.metadata[version]=1.0**
# nacos 服务权重
**spring.mvc.nacos.discovery.metadata[weight]=10**
<dependency>
<groupId>com.opages.mvc.adapter</groupId>
<artifactId>adapter-openfeign</artifactId>
<version>1.0.0</version>
</dependency>
# 激活 feign 功能,默认 false,不开启则不能使用 openfeign
**spring.mvc.openfeign.enable=true**
# SpringMVC 中启动 FeignClient 包的扫描路径地址
**spring.mvc.openfeign.scan=com.opages.mvc.**.**.api**
@FeignClient(name="mvc-example")
@RequestMapping("/mvc/example")
public interface MvcExampleApi {
@PostMapping("/get")
@ResponseBody
public MvcExampleDto getExample(@RequestParam("id") Integer id);
@PostMapping(value="/save")
public void save(MvcExampleDto exampleDto);
}
@RestController
public class MvcExampleController implements MvcExampleApi {
@Override
public MvcExampleDto getExample(@RequestParam("id") Integer id) {
MvcExampleDto dto = new MvcExampleDto();
dto.setId(id);
dto.setUsername("xiaomin");
dto.setPassword("123456");
return dto;
}
@Override
public void save(@RequestBody MvcExampleDto demoDto) {
System.err.println("MVC Example 保存 -->" + demoDto.toString());
}
}
Когда вы изучаете Spring, часто говорят о IOC и AOP, чтобы понять, что такое IOC и AOP, а затем говорят, что Bean управляется Spring. Когда мы обсуждаем, как Spring это делает, многие люди все еще сводят его к использованию отражения, Java динамического прокси или cglib. Если мы изменим способ понимания: IOC и AOP - это как они были разработаны? Как бы вы это объяснили?
Ответ на вышеуказанный вопрос перед просмотром ApplicationContext потока, поскольку этот проект использует традиционный Spring MVC, поэтому сначала посмотрите на загрузку XML контекста ClassPathXmlApplicationContext (Spring версия: 4.3.29).
Spring поток анализа каждый раз хочет упростить поток Spring, чтобы увидеть общую картину, но внутренняя конструкция взаимосвязана, и, начиная с определенного блока в качестве отправной точки, всегда будет не хватать чего-то, поэтому сначала объясните общую ситуацию с точки зрения бизнес-диаграммы, а затем отметьте ключевые процессы (другие не являются незначительными, просто разные точки внимания), чем больше вы анализируете исходный код Spring, тем больше вы чувствуете себя слабым цыпленком, так что, если у вас есть какие-либо ошибки, пожалуйста, оставьте сообщение, чтобы дать обратную связь. Ниже приведена ключевая диаграмма процесса:
Из приведенного выше процесса можно видеть, что просто говорить о технических принципах IOC и AOP недостаточно, чтобы объяснить, как реализовать проблему, и проблема реализации должна быть рассмотрена с точки зрения дизайна и общей архитектуры, то есть так называемого комплексного решения. С точки зрения определения Bean (абстрактный BeanDefinition), построения Bean (построение отражения и FactoryBean), создания Bean (инстанцирование и инициализация), а также основного дизайна расширения точки: постпроцессор пронизывает весь процесс. IOC и AOP связаны с постпроцессором. Чтобы Spring выполнял работу, необходимо выполнить два условия: ①. Bean управляется spring, ②. Атрибуты инъекции (значения или объекты) управляются spring, и основной операцией для достижения этой цели является постпроцессор. Из упрощенной диаграммы процесса выше видно, что Spring широко использует постпроцессор, который можно разделить на две большие категории:
(1). BeanFactoryPostProcessor: вмешательство в создание процесса BeanFactory, может прочитать конфигурацию метаданных перед контейнером экземпляра любого другого bean, изменить определение атрибута bean в соответствии с потребностями, необходимо обратить внимание на подынтерфейс BeanDefinitionRegistryPostProcessor, метод postProcessBeanDefinitionRegistry этого интерфейса определяется как родительский класс, главным образом для динамической регистрации аннотаций, соответствующих spring (@Component, @Service, @Controller и т.д.), генерирует DebanDefinition в контейнер.
(2). BeanPostProcessor: вмешивается в процесс создания Bean, присваивает значения свойствам при создании экземпляра Bean, например: Aware инъекция, @Autowired аннотация присваивает значение свойствам, общая проверка свойств, инициализация и уничтожение методов (@PostConstruct, @PreDestroy) вызов, реализация нижнего уровня динамического агента.
Дело должно быть сделано в общем сознании, после краткого объяснения выше, теперь мы можем поговорить о дизайне IOC и AOP. Во-первых, это этап подготовки, Spring заранее подготовил среду переменных, синтаксический анализатор, конвертер и т. д., которые применяются при чтении файлов и анализе файлов, и вызывает, когда это необходимо, BeanFactoryPostProcessor для предварительной обработки, сначала выполняет подынтерфейс BeanDefinitionRegistryPostProcessor для анализа Bean с использованием аннотации, наконец, анализирует ее в BeanDefinition, а затем выполняет интерфейс BeanFactoryPostProcessor, изменяет некоторые свойства Bean по умолчанию, внутренний интерфейс реализации:
- ConfigurationClassPostProcessor:конфигурация класса постпроцессора, анализ конфигурации класса с добавлением @Configuration, анализ @ComponentScan, @ComponentScans аннотированный пакет сканирования, анализ @Import, @Bean аннотированных. - PropertyPlaceholderConfigurer:в файле конфигурации XML добавить внешний файл свойств, ${key} заменить указанное значение в файле свойств. - PropertyOverrideConfigurer:разрешить переопределение любых свойств (beanName.propertyName=value) в определении bean, которое мы хотим обработать в Spring контейнере. - CustomEditorConfigurer:тип преобразователя, в зависимости от типа объекта, получить соответствующий PropertyEditor для конкретного преобразования типа.
После завершения обработки свойств Bean, согласно BeanPostProcessor (подынтерфейс InstantiationAwareBeanPostProcessor) постпроцессору, перед и после инстанцирования, инициализации до и после выполнения динамического расширения (введение свойств, создание прокси, выполнение метода инициализации, введение метода уничтожения):
- CommonAnnotationBeanPostProcessor:переписать postProcessPropertyValues, ввести @Resource - AutowiredAnnotationBeanPostProcessor: переписать postProcessPropertyValues, ввести @Autowire - PersistenceAnnotationBeanPostProcessor:используется для введения соответствующего ресурса JPA АбстрактАвтоПроксиКриэйтор: инициализация перед (постПроцессБефореИнстантиатион) возвращает указанный прокси-объект динамического прокси (не часто используется), инициализация после (постПроцессАфтерИнициализатион) возвращает обычный динамический прокси (Спринг АОП).
— КоммонАннотатионБинПостПроцессор: собирает @ПостКонструкт, @ПреДестрой (методы инициализации и уничтожения), внедряет классы с аннотацией @Ресурс. — ИмпортАварБианПостПроцессор: внедряет AnnotationMetadata подклассов ImportAware.
После вышеуказанной обработки создание Бина успешно завершается, и он помещается в кэш. В следующий раз он будет взят непосредственно из кэша.
— АОП реализуется через подклассы BeanPostProcessor.
Вкратце: при активации аннотации AnnotationAwareAspectJAutoProxyCreator создаётся AnnotationAwareAspectJAutoProxyCreator, который наследует BeanPostProcessor и реализует BeanFactoryAware, поэтому также создаётся Advisor фабрика. При создании Advisor объекта с помощью Advisor фабрики после создания Бина также создаётся класс расширения уведомлений. После инициализации Бина в соответствии с правилами AopUtils сопоставляется выражение pointCup для создания динамического JDK или Cglib прокси целевого класса и возврата его в контейнер.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )