����λ�ã���ҳ > �����̳� > �̳� > ��ȳ��Ľ���SpringWebFlux��Ӧʽ���15���������Դ��
������Spring WebFlux ��ܺ��������ȫ�������ˣ�ϣ�����԰�����ȫ����������� WebFlux��Ô������ע�����簮��̡�����ҳ��ɲ鿴V��ÿ����µ�Ô���������ݣ�������һ��ɳ���
Spring WebFlux �� Spring Framework 5.0 �汾�����һ����Ӧʽ Web ��ܣ����� Spring MVC ���棬�ṩ��һ��ȫ�µı�̷�ʽ��֧���첽�������� Web Ӧ�ÿ�����WebFlux ��ȫ������Ӧʽ���ģ�ͣ�֧�� Reactive Streams �淶������������ Netty��Undertow �Լ� Servlet 3.1+ ���������С�
WebFlux �ĺ��Ŀ������� DispatcherHandler���������� Spring MVC �е� DispatcherServlet����������ַ�����Ӧ�Ĵ�������DispatcherHandler ͨ������ Spring �����е� HandlerMapping��HandlerAdapter �� HandlerResultHandler ����������
�� WebFlux �У�Flux �� Mono �� Reactor ���е�������������ֱ����ڱ�ʾ���� 0 �� N ��Ԫ�غ� 0 �� 1 ��Ԫ�ص��첽���С�Flux �������ڱ�ʾһ�����������ӦʽԪ�ص������� Mono ���ڱ�ʾ����Ԫ�ص���Ӧʽ����
Spring WebFlux ֧�ֶ��ֱ��ģʽ����������ע��Ŀ������ͺ���ʽ�˵㡣�����߿���ʹ�� @RestController ע����������Ӧʽ����������ʹ�� @GetMapping��@PostMapping ��ע�������� HTTP ����ͬʱ��WebFlux Ҳ֧��ʹ�� WebClient ��Ϊ�������� HTTP �ͻ������������������ͨ�š�
WebFlux �IJ���ģ���봫ͳ�� Spring MVC ��������ͬ�����������������߳������������IJ��������������������������ԡ��������� Netty ��������ʱ��WebFlux ʹ���¼�Ñ���߳����������󣬱����˴�ͳ Servlet ������ÿ��������Ҫһ���̵߳�ģ�͡�
Spring WebFlux �����ó�����Ҫ�� IO �ܼ��͵�Ӧ�ã�����΢�������أ��������������������η���ת����������
��Ȼ����������е� Spring MVC Ӧ���ܹ������������󣬲�����Ŀ��ʹ����������� Servlet �߳�ģ�͵Ŀ⣬��ô����û�б�ҪǨ�Ƶ� WebFlux��
Դ����棬Spring WebFlux �������������漰�������������� Netty �������ij�ʼ��������Ľ��ա�DispatcherHandler ������ַ����Լ����յ�����������Ӧ���� Netty �������У��������漰�� ChannelHandler��ConnectionObserver���Լ� HttpHandler �ȶ���������Щ���Ðͬ������ʵ���� WebFlux �ķ���������Ӧʽ���ԡ�
Spring WebFlux �������������������ǹ�ͬ��������������Ӧʽ Web Ӧ�ÿ�ܡ�������һЩ��Ҫ�ĺ��������
DispatcherHandler������ WebFlux ������������������� Spring MVC �е� DispatcherServlet���������ֺ͵��� HTTP ����������handlers��������������ӳ�䡢���úͽ��������
HandlerMapping������ӿ����ڽ�����ӳ�䵽��Ӧ�Ĵ�������handler��������Ӧ�ó����������б���⵽��������ȷ������Ӧ�����ĸ�������������
HandlerAdapter������ӿڰ��� DispatcherHandler �����κ����͵Ĵ�������������Ҫ���ľ���ĵ��÷�ʽ����Ϊ��ͬ�Ĵ������ṩ�˵��ò��ԡ�
HandlerResultHandler������ӿڴ������������ú�Ľ�������������յ���Ӧ�������𽫴������Ľ��ת��Ϊ�ͻ��˿��Խ��յĸ�ʽ��
WebFilter��WebFilter �ӿڶ�����һ�����������Щ���������Զ��������Ӧ����Ԥ�����ͺ�����
ServerWebExchange��������װ�� HTTP �������Ӧ��������Ϣ����������ͷ�������塢URI�������ȡ�
ServerHttpRequest �� ServerHttpResponse����������ֱ�������������յ� HTTP ����ͷ��͵� HTTP ��Ӧ��
WebSession�����ڹ����ض��ͻ��˵ĻỰ��Ϣ��
Reactive Streams��WebFlux ���� Reactive Streams �淶��ʹ�÷�������ѹ������������������
Reactor �⣺��Ϊ Spring 5 �ķ�Ӧʽ��̻�����Reactor �ṩ�˷������ı��ģ�ͺ͹��ߣ����� Flux �� Mono �ȷ�Ӧʽ���͡�
WebClient������ Spring 5 ������ķ�������֧����Ӧʽ���� HTTP �ͻ��ˣ������������������ͨ�š�
Spring Data Reactive���ṩ����Ӧʽ���ݷ��ʵ�֧�֣����� Reactive Repositories��
Spring Security Reactive���ṩ����Ӧʽ��ȫ���ʿ��Ƶ�֧�֡�
HttpHandler����������ͼ���ķ�Ӧʽ HTTP ��������ͬ����Ϊ��ͬ����ʱ֮��Ĺ�ͬ������
ContextPathCompositeHandler�������ڲ�ͬ��������·����ע����Ӧ�ó���
��Щ�����ͬ������Ϊ������Ա�ṩ��һ��ǿ����������Ӧʽ Web Ӧ�ÿ���ƽ̨��ͨ����Щ����������߿��Թ������ܹ���Ч�����������������Ӧ�ó������������Щ�����V �罫һһ��ϸ���ܺ���Դ���ʵ�ֹ��̣������ֵ��dz������⡣
DispatcherHandler �� Spring WebFlux �ĺ���������������������� Spring MVC �е� DispatcherServlet�������𽫴���� HTTP ����ַ�����Ӧ�Ĵ�������handler���������������ӳ�䡢���úͽ�������������Ƕ� DispatcherHandler ���Դ��ʵ���߼��Ͳ������ϸ������
��ʼ������
ApplicationContextAware ʵ�֣�DispatcherHandler ʵ���� ApplicationContextAware �ӿڣ�����ζ�������Է��ʵ� Spring Ӧ���������е� Bean��
HandlerMapping��HandlerAdapter �� HandlerResultHandler �ij�ʼ����DispatcherHandler �ڳ�ʼ��ʱ����� Spring Ӧ�������������е� HandlerMapping��HandlerAdapter �� HandlerResultHandler ����ʼ�����ǡ�
protected void initStrategies(ApplicationContext context) {
// ... ʡ�Բ��ִ��� ...
this.handlerMappings = ...;
this.handlerAdapters = ...;
this.resultHandlers = ...;
}
����������
��ȡ HandlerMappings��DispatcherHandler ��ͨ�� handlerMappings �������ܹ�������ǰ����� HandlerMapping��
ӳ������ Handler��ʹ���ҵ��� HandlerMapping ������ӳ�䵽����Ĵ�������������һ�� @Controller ��������һ�� RouterFunction����
���� Handler��һ���ҵ���������DispatcherHandler ��ʹ���ʵ��� HandlerAdapter �����ô�������
�����������������ִ�н���ᱻ HandlerResultHandler ������������Ӧ��
�������handle
DispatcherHandler �ĺ��ķ����� handle���������������������̣�
public Mono handle(ServerWebExchange exchange) {
// ����Ƿ��ʼ���� handlerMappings
if (this.handlerMappings == null) {
return createNotFoundError();
}
// ʹ�� handlerMappings ������ handler
return Flux.fromIterable(this.handlerMappings)
.concatMap(mapping -> mapping.getHandler(exchange))
.next() // ��ȡ��һ�� handler
.switchIfEmpty(createNotFoundError()) // ���û���ҵ� handler�����ش���
.flatMap(handler -> invokeHandler(exchange, handler)) // ���� handler
.flatMap(result -> handleResult(exchange, result)); // �������
}
������
���������Ðͬ����
DispatcherHandler �����ʹ�����dz������Ժ����׵���չ�µ� HandlerMapping��HandlerAdapter �� HandlerResultHandler ��֧�ֲ�ͬ�Ĵ��������ͺͷ������͡�
���Ͼ��� DispatcherHandler �����Դ��ʵ���߼��Ͳ���ķ�����ͨ�����ַ�ʽ��Spring WebFlux �ܹ��Է������ķ�ʽ���� Web �������Ӧ�õ����ܺͿ������ԡ�
HandlerMapping �� Spring WebFlux �е�һ���ӿڣ��������˽�����ӳ�䵽��������handler�����߼���HandlerMapping ��ʵ���ฺ�������������͡�URL ģʽ����Ϣ��ȷ���ĸ�����Ĵ�����Ӧ�ô�����ǰ�����������Ƕ� HandlerMapping �����Դ��ʵ���߼��Ͳ������ϸ������
HandlerMapping �ӿڶ���
HandlerMapping �ӿڶ��������¹ؼ�������
public interface HandlerMapping {
Mono
��Ҫʵ����
Spring WebFlux �ṩ�˼��� HandlerMapping ��ʵ���࣬��Ҫ������
RequestMappingHandlerMapping����������ע���ӳ�䣬���� @RequestMapping��@GetMapping �ȡ�
RouterFunctionMapping���������� RouterFunction �ĺ���ʽ·�ɡ�
SimpleUrlHandlerMapping�������򵥵� URL �������ӳ�䡣
RequestMappingHandlerMapping Դ�����
RequestMappingHandlerMapping ����õ� HandlerMapping ʵ��֮һ������������һЩ�ؼ�ʵ���߼���
ע��ͽ������ڳ�ʼ��ʱ��RequestMappingHandlerMapping ��ɨ�����е� beans�����Ҵ��� @RequestMapping ע��ķ�������ע����Щ������Ϊ����Ĵ�������
ӳ�䴦����RequestMappingHandlerMapping ʹ�� Pattern �������洢��ƥ�� URL ģʽ��
getHandler ����ʵ�֣�
@Override
public Mono
ӳ��ƥ���߼�
ӳ��ƥ���߼�ͨ���漰���²��裺
·��ƥ�䣺��������·���Ƿ���ע��� URL ģʽƥ�䡣
���󷽷�ƥ�䣺��� URL ģʽƥ�䣬��һ���������ķ�����GET��POST �ȣ��Ƿ��봦����֧�ֵķ���ƥ�䡣
��������ƥ�䣺��������Ƿ��������������IJ�����
ͷ��Ϣƥ�䣺�������ͷ�Ƿ������ض���������
���ѺͲ���ý������ƥ�䣺�������� Accept ͷ�� Content-Type �Ƿ��봦����֧�ֵ�ý������ƥ�䡣
������
RequestMappingHandlerMapping ��ʵ����һЩ�����Ż���ʩ�����绺��ƥ��� URL ģʽ���Լ����ظ���ģʽƥ�������
С��һ��
HandlerMapping ����� Spring WebFlux �����������еĹؼ����֣������𽫽��������ӳ�䵽��ȷ�Ĵ�������ͨ��ʹ�ò�ͬ�� HandlerMapping ʵ�֣�Spring WebFlux ֧����������ӳ����ԣ�����Ӧ��ͬ��Ӧ�ó�����
HandlerAdapter �ӿ��� Spring WebFlux �а�����������Ҫ�Ľ�ɫ�����������ǽ� DispatcherHandler �ҵ��Ĵ�������handler�����䵽�����ִ���߼��ϡ�HandlerAdapter ʹ�� DispatcherHandler ������ľ���Ĵ��������ͣ�ֻ��Ҫͨ�� HandlerAdapter �����ô��������ɡ������Ƕ� HandlerAdapter �����Դ��ʵ���߼��Ͳ������ϸ������
HandlerAdapter �ӿڶ���
HandlerAdapter �ӿڶ��������¹ؼ�������
public interface HandlerAdapter {
boolean supports(Object handler);
Mono handle(ServerWebExchange exchange, Object handler, Object... args);
}
���󣬱�ʾ�첽�ĵ��ù��̡�
��Ҫʵ����
Spring WebFlux �ṩ�˼��� HandlerAdapter ��ʵ���࣬��Ҫ������
RequestMappingHandlerAdapter��֧�ֻ���ע��Ŀ���������������� @RequestMapping ע��ķ�����
HttpHandlerAdapter��֧�� HttpHandler �ӿڵĴ�������
ControllerEndpointHandlerAdapter��֧�� ControllerEndpoint �ӿڵĴ�������ͨ������ WebFlux ����ʽ��̡�
RouterFunctionHandlerAdapter��֧�� RouterFunction �ӿڣ����ں���ʽ·�ɡ�
RequestMappingHandlerAdapter Դ�����
RequestMappingHandlerAdapter ����õ� HandlerAdapter ʵ��֮һ������������һЩ�ؼ�ʵ���߼���
@Override
public boolean supports(Object handler) {
return (handler instanceof HandlerFunction) ||
(handler instanceof Controller) ||
AnnotationUtils.findAnnotation(handler.getClass(), RequestMapping.class) != null;
}
���ô�������handle �������ô�����������������ֵ��
@Override
public Mono handle(ServerWebExchange exchange, Object handler) {
// ���þ���Ĵ�����
return ((HandlerFunction) handler).handle(exchange);
}
���ô��������߼�
���ô��������߼�ͨ���漰���²��裺
�������������������еIJ�����������ת��Ϊ����������
���÷��������ô������ķ���������������IJ������ݸ�������
��������ֵ�����������ķ���ֵ������ת��Ϊ��Ӧ��
�첽������������������ص��� Mono �� Flux��HandlerAdapter ��Ҫ������Щ�첽�����
������
HandlerAdapter �����������ù����е��쳣�����쳣ת��Ϊ���ʵ���Ӧ��
С��һ��
HandlerAdapter ����� Spring WebFlux �����������еĹؼ����֣��������� DispatcherHandler �;���Ĵ�����ʵ�֡�ͨ��ʹ�ò�ͬ�� HandlerAdapter ʵ�֣�Spring WebFlux ֧���˶������͵Ĵ���������������ע��Ŀ�����������ʽ·���Լ� HttpHandler �ӿڵ�ʵ�֡������������˿�ܵ�����ԺͿ���չ�ԡ�
HandlerResultHandler ����� Spring WebFlux �и������� HandlerAdapter ���ô������󷵻صĽ����������Щ���ת��Ϊ�ͻ��˿��Խ��յ� HTTP ��Ӧ�������Ƕ� HandlerResultHandler �����Դ��ʵ���߼��Ͳ������ϸ������
HandlerResultHandler �ӿڶ���
HandlerResultHandler �ӿڶ��������¹ؼ�������
public interface HandlerResultHandler {
boolean supports(HandlerResult result);
Mono handleResult(ServerWebExchange exchange, HandlerResult result);
}
���󣬱�ʾ�첽�Ĵ������̡�
��Ҫʵ����
Spring WebFlux �ṩ�˼��� HandlerResultHandler ��ʵ���࣬��Ҫ������
ServerResponseResultHandler Դ�����
ServerResponseResultHandler �Ǵ��� ServerResponse ���ͽ���� HandlerResultHandler ʵ�֣�
@Override
public boolean supports(HandlerResult result) {
return result.getReturnValue() instanceof ServerResponse;
}
@Override
public Mono handleResult(ServerWebExchange exchange, HandlerResult result) {
ServerResponse response = (ServerResponse) result.getReturnValue();
return response.writeTo(exchange, result.isCommitted());
}
����������߼�
����������߼�ͨ���漰���²��裺
��ȡ����ֵ���� HandlerResult �л�ȡ�������ķ���ֵ��
������ͣ����ݷ���ֵ�����ͣ�ѡ����ʵĴ����߼���
������Ӧ��������ֵת��Ϊ HTTP ��Ӧ�����磬ServerResponse �Ѿ���������Ӧ��״̬�롢ͷ��Ϣ���塣
�첽�������������ֵ���첽�ģ��� Mono �� Flux��������Ҫ������Щ�첽�����
д����Ӧ�������ɵ���Ӧд�뵽 ServerWebExchange �С�
������
HandlerResultHandler ��������������������е��쳣�����쳣ת��Ϊ���ʵ���Ӧ��
С��һ��
HandlerResultHandler ����� Spring WebFlux �����������еĹؼ����֣������𽫴������ķ���ֵת��Ϊ HTTP ��Ӧ��ͨ��ʹ�ò�ͬ�� HandlerResultHandler ʵ�֣�Spring WebFlux ֧���˶��ַ���ֵ���ͣ����� ServerResponse��ResponseEntity �� ModelAndView�������������˿�ܵ�����ԺͿ���չ�ԣ������������Բ�ͬ�ķ�ʽ������Ӧ�����
HandlerResultHandler ��ʵ��ͨ����Ҫ������Ӧ���첽���ԣ�ȷ����ʹ���첽���������Ҳ����ȷ�����ɺͷ�����Ӧ�����⣬������Ҫ�� ServerWebExchange ����Ð�����Ա���ʺͲ����������Ӧ����������Ϣ��
WebFilter �ӿ��� Spring WebFlux ���������غʹ��� Web �������Ӧ������������������������󵽴����Ĵ�����֮ǰ��֮�󣬶��������Ӧ���ж���Ĵ�����������־��¼����ȫ�Լ�顢�������ȡ������Ƕ� WebFilter �����Դ��ʵ���߼��Ͳ������ϸ������
WebFilter �ӿڶ���
WebFilter �ӿڶ��������¹ؼ�������
public interface WebFilter {
Mono filter(ServerWebExchange exchange, WebFilterChain chain);
}
��������
�� Spring WebFlux �У�WebFilter ͨ���ᱻ��֯��һ������������ÿ�� WebFilter �����Ծ����Ǽ������������ǽ����󴫵ݸ����е���һ�� WebFilter��������ʽ����ģʽʹ�ù�������ִ��˳��dz���Ҫ��
��Ҫʵ����
Spring WebFlux �ṩ��һЩ���õ� WebFilter ʵ���࣬���磺
������������
��������ͨ����Ӧ�ó���������й���������ʹ�� WebFilter �ӿڵ�ʵ���ࣺ
@Configuration
public class WebFluxConfig {
@Bean
public WebFilter myCustomFilter() {
return (exchange, chain) -> {
// ��������Զ��������Ԥ����
return chain.filter(exchange).subscriberContext(ctx -> ctx.put("customKey", "customValue"));
};
}
}
WebFilter ��ʵ���߼�
ʵ�� WebFilter �ӿڵ� filter ����ͨ���漰���²��裺
Ԥ�������ڵ��� chain.filter(exchange) ֮ǰ���� ServerWebExchange �����κα�Ҫ��Ԥ�����������޸�����ͷ����ѯ�����ȡ�
��������ʹ�� WebFilterChain �� filter ���������󴫵ݸ����е���һ�� WebFilter����ͨ���᷵��һ�� Mono
����ʾ�첽�Ĺ��˹��̡�
�������� chain.filter(exchange) ��ɺ󣬶� ServerWebExchange �����κα�Ҫ�ĺ����������޸���Ӧͷ����Ӧ��ȡ�
�������������ڹ��˹����п��ܷ������쳣�����������׳��µĴ��󡢷����ض�����Ӧ�������������
�첽����
���� filter �������ص��� Mono
��WebFilter ��ʵ����Ҫ�����첽����������ζ���ڹ��˹����У����Է����첽����Ӧ��������������������Ĵ�����
С��һ��
WebFilter ����� Spring WebFlux ���������غʹ��� Web �������Ӧ��ǿ�󹤾ߡ�ͨ��ʵ�� WebFilter �ӿڲ��������������������߿������ض��������Ӧ����Ԥ�����ͺ������Լ�ʵ�ָ��ֺ��й�ע�㣬�簲ȫ�ԡ���־��¼��CORS �����ȡ�������������Ӧ�ó����ģ���ԺͿ�ά���ԣ�ͬʱ�����˷��������첽�����ԡ�
ServerWebExchange �� Spring WebFlux �е�һ���������������װ�� HTTP �������Ӧ����������Ϣ��Ϊ Web ��������Ӧ�ó���֮���ṩ��һ�������Ľӿڡ������Ƕ� ServerWebExchange �����Դ��ʵ���߼��Ͳ������ϸ������
ServerWebExchange �ӿڶ���
ServerWebExchange �ӿڶ����˶� HTTP �������Ӧ�ķ��ʺͲ�����
public interface ServerWebExchange {
ServerHttpRequest getRequest();
ServerHttpResponse getResponse();
void beforeCommit();
boolean isCommitted();
void setCommitted(boolean committed);
Context getContext();
}
��������
ServerWebExchange ͨ���������º������ԣ�
�������Ӧ�Ĵ���
ServerWebExchange ���������Ӧ�Ĵ����а����ź��Ľ�ɫ��
�����ȡ��ͨ�� getRequest() ������ȡ������󣬷�������ĸ�����Ϣ��
��Ӧ���죺ͨ�� getResponse() ������ȡ��Ӧ���󣬹�����Ӧ��״̬�롢ͷ��Ϣ����Ӧ�塣
�����Ĺ�����ʹ�� Context ����洢�ʹ����������Ӧ�����еĸ�����Ϣ��
�ύ������ͨ�� beforeCommit()��isCommitted() �� setCommitted() ����������Ӧ���ύ״̬��
������������ WebFilter ��ʵ���У�ServerWebExchange �����ڹ��������д��ݣ�ÿ�������������Է��ʺ��޸��������Ӧ��
�첽����
���� WebFlux ����Ӧʽ�ģ�ServerWebExchange ֧���첽������
С��һ��
ServerWebExchange �� Spring WebFlux �д��� HTTP �������Ӧ�ĺ�����������ṩ��һ��ͳһ�Ľӿ������ʺͲ����������Ӧ���ݣ�ͬʱ֧���첽�������Ĵ�����ʽ��ͨ�� ServerWebExchange�������߿����� Web ��������Ӧ�ó���֮����и�Ч�����ݽ�����״̬������ʵ�ָ����ܵ���Ӧʽ Web Ӧ�á�
ServerWebExchange ��ʵ��ͨ����Ҫ������Ӧʽ�ı��ģ�ͣ�ȷ���ڴ�������͹�����Ӧʱ���������¼�Ñ�����Ӷ�������� WebFlux ���������ơ����⣬�����ṩ�˷ḻ�������Ĺ������ܣ�ʹ���ڸ��ӵ������������У����Է���ش洢�ʹ��ݸ�����Ϣ��
ServerHttpRequest �� ServerHttpResponse �� Spring WebFlux �е��������Ľӿڣ����Ƿֱ��ʾ���������յ� HTTP ����ͷ��͵� HTTP ��Ӧ�������Ƕ������������Դ��ʵ���߼��Ͳ������ϸ������
ServerHttpRequest �ӿڶ���
ServerHttpRequest �ӿڶ����˶� HTTP ����ķ��ʣ�
public interface ServerHttpRequest {
URI getURI();
HttpMethod getMethod();
String getHeader(String headerName);
MultiValueMap getHeaders();
DataBufferFactory bufferFactory();
// ʡ����������...
}
ServerHttpResponse �ӿڶ���
ServerHttpResponse �ӿڶ����˶� HTTP ��Ӧ�Ĺ���ͷ��ͣ�
public interface ServerHttpResponse {
HttpStatusSeriesStatus.Series getStatusSeries();
void setStatusCode(HttpStatus statusCode);
String getHeader(String headerName);
MultiValueMap getHeaders();
void setComplete();
DataBufferFactory bufferFactory();
Mono writeWith(Publisher extends DataBuffer> body);
// ʡ����������...
}
extends DataBuffer> body)
��������Ӧ�塣
�������Ӧ�Ĵ���
ServerHttpRequest �� ServerHttpResponse �ڴ��� HTTP �������Ӧ�а����ź��Ľ�ɫ��
������Ϣ��ȡ��ͨ�� ServerHttpRequest �ķ�����ȡ����� URI��������ͷ��Ϣ�ȡ�
��Ӧ���죺ʹ�� ServerHttpResponse �ķ�������״̬�롢ͷ��Ϣ����������Ӧ�塣
���ݻ�������ͨ�� bufferFactory() ������ȡ DataBufferFactory�����ڴ����͹������ݻ�������
�첽���ͣ�ServerHttpResponse �� writeWith(Publisher
extends DataBuffer> body)
����֧���첽������Ӧ�塣
��ʽ������֧������ʽ�ķ�ʽ��ȡ�������д����Ӧ�塣
�첽������
���� WebFlux �ǻ�����Ӧʽ���ģ�͵ģ�ServerHttpRequest �� ServerHttpResponse ֧���첽�������IJ�����
��ʽ�첽��ȡ�ͷ��͡�
С��һ��
ServerHttpRequest �� ServerHttpResponse �� Spring WebFlux �д��� HTTP �������Ӧ�Ľӿڡ������ṩ�˷ḻ�ķ���������������Ϣ��������Ӧ����֧���첽�������IJ�����ͨ���������ӿڣ������߿��Թ��������ܡ���Ӧʽ�� Web Ӧ�ã���������ִ�Ӳ���������ܹ������ơ�
��ʵ��Ӧ���У�������ͨ������Ҫֱ��ʵ����Щ�ӿڣ�����ͨ������ṩ��ʵ�����������������Ӧ����Щʵ����ͨ�������ض�������ʱ�������� Netty�����ɣ����ṩ��Ч�� I/O ������
WebSession ����� Spring WebFlux �����ڱ�ʾ�͹��� Web �Ự��session�������ṩ��һ�ֻ������洢�ͼ������ض��û��Ự��ص����ݡ������Ƕ� WebSession �����Դ��ʵ���߼��Ͳ������ϸ������
WebSession �ӿڶ���
WebSession �ӿڶ����� Web �Ự�Ļ���������
public interface WebSession {
String getId();
Mono save();
void invalidate();
Map getAttributes();
T getAttribute(String name);
void setAttribute(String name, T value);
default Mono getAttributeOrDefault(String name, Supplier extends T> defaultValue);
// ʡ����������...
}
WebSession ��ʵ���߼�
�Ự������WebSession �����������������д�����ͨ���� ServerWebExchange ������
���Թ������Ự���Դ洢�� getAttributes() ���ص� Map �У������洢�ͼ����û��ض�����Ϣ��
�첽���棺save() �����첽����Ự���ģ�������漰������д��ײ�洢��
�ỰʧЧ��invalidate() ��������ʹ�Ự��Ч��ȷ���Ự���ݲ��ٿ��á�
�Ự ID ������ÿ�� WebSession ʵ������һ��Ψһ�� id�����ڱ�ʶ�ض����û��Ự��
Ĭ��ֵ��ȡ��getAttributeOrDefault() �����ṩ��һ�ֱ�ݵķ�ʽ����ȡ����ֵ��������Բ����ڣ��򷵻�Ĭ��ֵ��
�Ự�Ĵ洢�ͼ���
WebSession ��ʵ��ͨ����Ҫ�������·��棺
�Ự�Ĵ����Ͱ�
�������������У�WebSession ���Ա������Ͱ󶨵� ServerWebExchange��
ServerWebExchange exchange = ...;
Mono sessionMono = exchange.getSession();
sessionMono.flatMap(session -> {
// ʹ�ûỰ
return session.save();
});
С��һ��
WebSession ����� Spring WebFlux �����ڹ��� Web �Ự�Ľӿڡ����ṩ��һ�����ķ�ʽ���洢�ͼ������û��Ự��ص����ݣ�ͬʱ֧���첽�����Ͷ��ִ洢ѡ�ͨ�� WebSession�������߿�������ʵ���û��Ự���ٺ͹������������и��Ի��û������ Web Ӧ�á�
��ʵ��Ӧ���У������߿��Ը�����Ҫѡ��ͬ�ĻỰ�洢ʵ�֣�����ʹ�� Spring Session ��Ŀ�ṩ�Ķ��ִ洢������������� Redis��Hazelcast��JDBC �ȡ���Щʵ��ͨ���ᴦ���Ự�Ĵ��������桢ʧЧ���߼������� WebSession �ӿڽ��м��ɡ�
Reactive Streams ��һ���淶�����������첽�������Ľӿں���Ϊ���Ա��ڲ�ͬ�Ŀ�Ϳ��֮��ʵ�ֻ������ԡ�Spring WebFlux ï¿½ï¿½Îªï¿½ï¿½Ó¦Ê½ï¿½ï¿½Ìµï¿½Ò»ï¿½ï¿½ï¿½Ö£ï¿½ï¿½ï¿½Ñ Reactive Streams �淶�������Ƕ� Reactive Streams �����Դ��ʵ���߼��Ͳ������ϸ������
Reactive Streams ���Ľӿ�
Reactive Streams �淶���������¼������Ľӿڣ�
Publisher
�������ߣ���ʾ���Բ������ݵ�Դͷ��
Subscriber
�������ߣ���ʾ���ղ��������ݵ������ߡ�
Subscription
�����Ĺ�ϵ�����ڹ������ݵ�����ͷ��͡�
Processor
������������ Publisher �� Subscriber �Ľ���塣
Publisher �ӿ�
Publisher �ӿ��� Reactive Streams �ĺ��ģ�����������ν��������͸� Subscriber��
public interface Publisher
{
void subscribe(
Subscriber super T>
s);
}
subscribe(`Subscriber super T> s`)������ Subscriber ���� Publisher��
Subscriber �ӿ�
Subscriber �ӿڶ�������δ����� Publisher ���յ������ݣ�
public interface Subscriber {
void onSubscribe(Subscription s);
void onNext(T t);
void onError(Throwable t);
void onComplete();
}
Subscription �ӿ�
Subscription �ӿ����ڹ��� Subscriber �� Publisher ֮�����������
public interface Subscription {
void request(long n);
void cancel();
}
Processor �ӿ�
Processor �� Publisher �� Subscriber �Ľ���壬���Խ������ݲ������µ���������
public interface Processor extends Subscriber, Publisher {
// �̳��� Subscriber �� Publisher �ķ���
}
Դ��ʵ���߼�
����
С��һ��
Reactive Streams �淶�ṩ��һ���첽�������������ݴ���ģ�ͣ�Spring WebFlux ͨ��ʵ����Щ�ӿڣ�֧����Ӧʽ��̡�����ģ������ϵͳ����Ч�ش���������������������ܺͿ������ԡ������߿������� Reactive Streams �淶�ṩ�Ľӿںͻ��ƣ�������Ч�����Ե���ӦʽӦ�ó���
Reactor ��һ������ Reactive Streams �淶�Ŀ⣬���ڹ����첽������������ӦʽӦ�ó������� Spring WebFlux �ķ�Ӧʽ��̻����������Ƕ� Reactor �������Դ��ʵ���߼��Ͳ������ϸ������
Reactor �������
Reactor �ṩ�����º��������
Flux �� Mono ��ʵ���߼�
������������ͨ����̬�������� Flux.just(), Mono.just()�����캯������ Flux �� Mono ʵ����
��������Reactor �ṩ�˷ḻ�IJ����������������������� map��flatMap��filter �ȡ�
���Ļ��ƣ�ͨ�� subscribe() �������������������ṩ Subscriber ���������ݡ�
��������ʹ�� request() �����������ݵ�����������
�������ͣ�����ͨ�� onNext() �������͸������ߡ�
�������ɴ�����ͨ�� onError() �� onComplete() ���������������Ĵ��������¼���
Scheduler ��ʵ���߼�
���������������� Scheduler ʵ��������ʹ�� Schedulers.parallel() �������е�������
������ȣ�ʹ�� schedule() �����������񣬷��� Mono �� Flux��
�������ƣ�Scheduler ���Կ�������IJ���ִ�У��������Ʋ���������
�첽ִ�У������ڷ��������̳߳����첽ִ�С�
Դ��ʵ�ֲ���
��������Դ������ Flux �� Mono ʵ����Ϊ����Դ��
Ӧ�ò�������ʹ�ò�����������������ת�������˻���ϡ�
��������ʹ�� onErrorResume() �� doOnError() �Ȳ�������������
��ѹ������ʹ�� onBackpressureBuffer() �� onBackpressureDrop() �Ȳ�����������ѹ��
���ĺ����ѣ����� subscribe() �������������������ṩ Subscriber ���������ݡ�
��������ʹ�� Scheduler �����첽����
��Դ������ʹ�� dispose() �����ڲ�����Ҫʱ�ͷ���Դ��
С��һ��
Reactor ��ͨ�� Flux��Mono �� Scheduler ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½á¹©ï¿½ï¿½Ò»ï¿½ï¿½Ç¿ï¿½ï¿½Ä·ï¿½Ê½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ó¦Ê½Ó¦ï¿½Ã³ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ Reactive Streams �淶��֧���첽��������������������Reactor �IJ������ḻ����������ʵ�ָ��ӵ����ݴ����߼���ͬʱ�������ṩ�����IJ������ƺ͵��Ȼ��ƣ�����Ӧ��ͬ��Ӧ�ó�����
Reactor �������ѧ���ṩ����ʽ�����ݴ����������ÿ������ܹ���һ��ֱ�ۺ����ķ�ʽ������Ӧʽϵͳ��ͨ�� Reactor�������߿��Գ�������ִ�Ӳ���Ķ�����ԣ����Ӧ�ó�������ܺͿ������ԡ�
WebClient �� Spring WebFlux �����ڷ��� HTTP ����ķ�������Ӧʽ�ͻ��ˡ���������������ʽ�ķ�ʽ�������󲢴�����Ӧ�������Ƕ� WebClient �����Դ��ʵ���߼��Ͳ������ϸ������
WebClient �ӿڶ���
WebClient �ṩ�˷�������ķ�����
public interface WebClient {
default URI uri() {
return URI.create(this.baseUrl);
}
Mono getForObject(String url, Class responseType, Object... uriVariables);
Flux getForFlux(String url, Class elementType, Object... uriVariables);
// ���� HTTP ���������أ����� postForObject, putForObject ��
}
WebClient.Builder ������
WebClient ��ʵ����ͨ�� WebClient.Builder �����ģ�
public final class WebClient.Builder {
private final String baseUrl;
public Builder(String baseUrl) {
this.baseUrl = baseUrl;
}
public WebClient build() {
return new ExchangeStrategiesDefaultWebClient(this);
}
// ��������ѡ��������� ExchangeStrategies, ClientHttpRequestFactory ��
}
���󹹽��ͷ���
���� WebClient ʵ����ʹ�� WebClient.Builder ���������� WebClient ʵ����
��������ʹ�� WebClient �ķ�������������ͷ����ѯ������������ȡ�
�������󣺵��� HTTP ������Ӧ�ķ������� getForObject��postForObject������������
������Ӧ����Ӧ�� Mono �� Flux ����ʽ���أ����Խ�һ��������
Դ��ʵ�ֲ���
WebClient webClient = WebClient.builder().baseUrl("http://example.com").build();
��������ʹ�� WebClient �ķ�����ʽ��������
Mono personMono = webClient.get()
.uri("/person/{id}", id)
.retrieve()
.bodyToMono(Person.class);
�������󲢻�ȡ��Ӧ������ retrieve() ������ָ����Ӧ��ת���ķ�ʽ��
��Ӧ��ת����ʹ�� bodyToMono �� bodyToFlux �ȷ�������Ӧ��ת��Ϊָ�����͡�
��������ʹ�� onErrorResume �� onErrorMap �Ȳ������������ܷ����Ĵ���
���ĺ����ѣ�������Ӧ�� Mono �� Flux ���������ݡ�
�������첽����
WebClient ֧�ֲ������첽�����������Է������ķ�ʽ����������
С��һ��
WebClient �� Spring WebFlux ��һ��ǿ����������������ڹ�������������Ӧʽ HTTP �ͻ��ˡ�������������ʽ�ķ�ʽ�������󣬲�ͨ�� Reactive Streams �淶֧���첽���ݴ�����WebClient �����ʹ�����dz��ʺ�����ӦʽӦ�ó�����ʹ�ã����Գ�������ִ��첽��̵����ƣ����Ӧ�ó�������ܺͿ������ԡ�
�����߿������ɵ�ʹ�� WebClient ���ⲿ�������ͨ�ţ���ȡ���ݣ�������Ӧʽ�ķ�ʽ������Щ���ݡ�ͨ�� WebClient��Spring WebFlux Ӧ�ó�������޷�ؼ��ɵ��������Ӧʽϵͳ�С�
Spring Data Reactive �� Spring Data ��Ŀ��һ���֣����ṩ��һ�����ڷ�����Ӧʽ���ݴ洢�ij���������������ʽ����Ӧʽ�ķ�ʽ�������ݷ��ʺͲ�����֧���� MongoDB��Redis��R2DBC��Reactive Relational Database Connectivity������Ӧʽ���ݿ⡣�����Ƕ� Spring Data Reactive �����Դ��ʵ���߼��Ͳ������ϸ������
Spring Data Reactive ���ĸ���
Reactive Repository �ӿڶ���
public interface ReactiveCrudRepository extends ReactiveRepository {
Mono save(T entity);
Flux findAll();
Mono findById(ID id);
Mono deleteById(ID id);
// ��������...
}
��Ӧʽ���ݷ��ʲ���
����ʵ���ࣺ����һ��ʵ���࣬ʹ�� JPA ע������ݿ��ض���ע�����ֶΡ�
����ֿ�ӿڣ�����һ���̳��� ReactiveCrudRepository ���ض����ݿ�� Repository �ӿڡ�
public interface MyEntityRepository extends ReactiveCrudRepository {
// ���������Զ����ѯ����
}
��������Դ��������Ӧʽ����Դ�Ϳͻ��ˣ��������� MongoDB �� ReactiveMongoDatabase��
ʹ�òֿ⣺�ڷ����ע�벢ʹ�òֿ�ӿڽ������ݲ�����
������ѯ��ʹ�òֿ�ӿ��ṩ�ķ������Զ����ѯ����������ѯ��
�첽������������ѯ�����ʹ�� Mono �� Flux ���첽���ԡ�
Դ��ʵ���߼�
ʵ��Ͳֿⶨ�壺��������ʵ��Ͳֿ�ӿڡ�
Spring Ӧ�������ģ�Spring Ӧ��������ɨ��ֿ�ӿڲ���������ʵ�֡�
ִ�в�ѯ�������òֿ�ӿڵķ���ʱ����������������ת��Ϊ���ݿ������
�����װ����ѯ�����װ�� Mono �� Flux �з��ء�
���������������ܷ������쳣��������ת��Ϊ���ʵ���Ӧ��
��Ӧʽ�����ƣ�ʹ�� Reactive Streams �淶������������
��Ӧʽ���ݿ����ʾ��
@Service
public class MyEntityService {
private final MyEntityRepository repository;
@Autowired
public MyEntityService(MyEntityRepository repository) {
this.repository = repository;
}
public Mono addMyEntity(MyEntity entity) {
return repository.save(entity);
}
public Flux getAllMyEntities() {
return repository.findAll();
}
}
С��һ��
Spring Data Reactive ͨ���ṩ��Ӧʽ�ֿ�ӿڣ�������Ӧʽ���ݷ��ʵ�ʵ�֡��������� Reactive Streams �淶�������Է������ķ�ʽ�������ݿ�����������Ӧ�ó�������ܺͿ������ԡ������߿������ɵض���ֿ�ӿڣ���ʹ�� Spring �ṩ�� CRUD �������Զ����ѯ�����������ݲ�����
Spring Data Reactive �����������������ִ���Ӧʽ���ģ�ͺͿ�ܣ��� WebFlux���޷켯�ɣ�Ϊ������ӦʽӦ�ó����ṩ��ǿ������ݷ���������ͨ��ʹ�� Spring Data Reactive�������߿��Թ�����Ч�����Ե�Ӧ�ó���ͬʱ���ִ���ļ���ԺͿ�ά���ԡ�
Spring Security Reactive �� Spring Security ����Ӧʽ��չ����Ϊ��ӦʽӦ�ó����ṩ�˰�ȫ����֤֧�֡������Ƕ� Spring Security Reactive �����Դ��ʵ���߼��Ͳ������ϸ������
Spring Security Reactive ���ĸ���
ServerSecurityContextRepository �ӿڶ���
public interface ServerSecurityContextRepository {
Mono save(ServerSecurityContext context);
Mono load();
void invalidate();
}
ServerHttpSecurity ����
public class ServerHttpSecurity {
public ServerHttpSecurity(ReactiveAuthenticationManager authentication) {
// ...
}
public SecurityWebFilterChain build() {
// ...
}
public ServerHttpSecurity authorizeExchange(Consumer configurer) {
// ...
}
// �������÷��������� cors, csrf, formLogin, httpBasic ��
}
��Ӧʽ��֤����Ȩ����
������֤������������������ ReactiveAuthenticationManager��
�����û����񣺴��������� ReactiveUserDetailsService��
���� ServerHttpSecurity��ʹ�� ServerHttpSecurity ������ȫ���ԡ�
���ð�ȫ�����Ĵ洢������ ServerSecurityContextRepository��
ע�� WebFilter���� SecurityWebFilterChain ע�ᵽ Web ���������С�
������֤����Ȩ���������������У�Spring Security Reactive �������󲢴�����֤����Ȩ��
Դ��ʵ���߼�
��ʼ������Ӧ�ó�������ʱ��Spring Security Reactive ��ʼ����ȫ���á�
�������أ�SecurityWebFilterChain �������󲢸������õİ�ȫ���Խ��д�����
��֤��ʹ�� ReactiveAuthenticationManager �����û���֤��
��Ȩ������ ServerHttpSecurity ���õ���Ȩ����ʹ�� ReactiveAccessDecisionManager ���з��ʿ��ơ�
��ȫ�����ģ�ʹ�� ServerSecurityContextRepository ����ÿ������İ�ȫ�����ġ�
�쳣������������ȫ��ص��쳣������֤ʧ�ܻ���ʾܾ���
��Ӧ��������֤����Ȩ�Ľ����������Ӧ�����ظ��ͻ��ˡ�
С��һ��
Spring Security Reactive Ϊ��ӦʽӦ�ó����ṩ��ȫ��İ�ȫ֧�֡������� Spring Security �ĺ��ĸ����ͨ����Ӧʽ���ģ���ṩ���첽���������İ�ȫ����������ͨ�� ServerHttpSecurity �����ã������߿������ض�����֤����Ȩ���ԣ������㲻ͬӦ�ó���İ�ȫ����
Spring Security Reactive ������������� Spring WebFlux �޷켯�ɣ�Ϊ��Ӧʽ Web Ӧ�ó����ṩǿ��İ�ȫ���ϡ�ͨ��ʹ�� Spring Security Reactive�������߿��Թ�����ȫ���ɿ�������ά������ӦʽӦ�ó���
HttpHandler ����� Spring WebFlux ����һ�����ڴ��� HTTP ����Ľӿڣ�������Ӧʽ���ģ������Ͳ�ε� HTTP ��������Լ��HttpHandler ��Ϊһ����ͬ�Ľӿڣ�������ͬ������ʱ����ͨ����ͬ��ʵ�������� HTTP ���������Ƕ� HttpHandler �����Դ��ʵ���߼��Ͳ������ϸ������
HttpHandler �ӿڶ���
HttpHandler �ӿڶ�����һ�� handle ���������ڴ�������� HTTP ���󲢷���һ����Ӧ��
public interface HttpHandler {
Mono handle(ServerHttpRequest request, ServerHttpResponse response);
}
handle(ServerHttpRequest request, ServerHttpResponse response)���������������󲢹�����Ӧ��
����ְ��
HttpHandler �ĺ���ְ�������
���󣬱�ʾ�첽����Ӧ�������̡�
ʵ�ֲ���
���� HttpHandler ʵ����ʵ�� HttpHandler �ӿڻ�ʹ�����е�ʵ�֡�
���������� handle �����б�д�߼��Դ�����������·�ɡ���֤��ҵ�����ȡ�
������Ӧ����������Ĵ������������Ӧ������״̬�롢��Ӧͷ����Ӧ�塣
���� Mono
������һ�� Mono
����ʾ��Ӧ�Ѿ����ͻ򽫱����͡�
���������� handle �����д������ܷ������쳣��ȷ�����DZ��ʵ���ת��Ϊ��Ӧ��
ʾ��ʵ��
������һ���򵥵� HttpHandler ʵ��ʾ����������һ���̶�����Ӧ��
public class SimpleHttpHandler implements HttpHandler {
@Override
public Mono handle(ServerHttpRequest request, ServerHttpResponse response) {
String body = "Hello, World!";
response.getHeaders().add("Content-Type", "text/plain");
return response.writeWith(Flux.just(DataBufferUtils.wrap(body)));
}
}
С��һ��
HttpHandler ����� Spring WebFlux �����ڴ��� HTTP ����Ļ����ӿڡ����ṩ��һ���򵥶����ķ�ʽ������ HTTP ����͹�����Ӧ��ͨ��ʵ�� HttpHandler �ӿڣ������߿��Կ����������������̣��������������ҵ���߼���������Ӧ������
HttpHandler ��ʵ�ֿ��������� Spring WebFlux ������� DispatcherHandler��HandlerMapping��HandlerAdapter �ȣ����ʹ�ã��Թ���һ����������Ӧʽ Web Ӧ�ó������ֵͲ�εĽӿ�Ϊ��Ҫ�߶ȶ��Ƶ� Web Ӧ�ó����ṩ��ǿ�������ԡ�
ContextPathCompositeHandler �� Spring WebFlux �е�һ���������������ͬһ�������Ͻ����Ӧ�ó���ӳ�䵽��ͬ��������·����context paths�������������ڴ�ͳ�� Servlet ������Ϊÿ�� Web Ӧ�ó������ò�ͬ�� URL ·����
�����Ƕ� ContextPathCompositeHandler �����Դ��ʵ���߼��Ͳ������ϸ������
ContextPathCompositeHandler �ӿڶ���
ContextPathCompositeHandler ʵ���ϲ���һ���ӿڣ����� HandlerMapping �ӿڵ�һ��ʵ�֣�������˶�� Handler ����ÿ�����󶼹���һ��������·����
��Ҫ����
������·��ӳ��
ContextPathCompositeHandler ά����һ��ӳ�䣬��ÿ��������·��ӳ�䵽һ�� Handler��
private final Map contextPaths = new ConcurrentHashMap<>();
����Ӧ�ó���
Ӧ�ó�������ڳ�ʼ��ʱͨ�� ContextPathCompositeHandler �� addHandler �������ӵ�ӳ���У�
public void addHandler(String contextPath, HttpHandler handler) {
this.contextPaths.put(contextPath, handler);
// �����������ʽģʽ��ƥ������ע���������·��
updatePattern();
}
��������
ContextPathCompositeHandler ͨ�� getHandler ������ȷ������Ӧ�����ĸ� Handler ������
@Override
public Mono
�������ʽģʽ
ContextPathCompositeHandler ʹ���������ʽ��ƥ������·����
private void updatePattern() {
// ����ƥ������ע��������·�����������ʽ
String regex = contextPaths.keySet().stream()
.map(this::toRegex)
.collect(Collectors.joining("|", "^(", ")$"));
this.compiledPattern = Pattern.compile(regex);
}
������
���û���ҵ�ƥ���������·����ContextPathCompositeHandler �ᴴ��һ����ʾ "Not Found" �Ĵ���������
private Mono createNotFoundError(ServerWebExchange exchange) {
return Mono.just(new HandlerAdapter() {
@Override
public boolean supports(Object handler) {
return true;
}
@Override
public Mono handle(ServerWebExchange exchange, Object handler) {
return ServerResponse.notFound().build().writeTo(exchange);
}
});
}
С��һ��
ContextPathCompositeHandler ����� Spring WebFlux �����ڽ����Ӧ�ó���ӳ�䵽��ͬ������·���� HandlerMapping ʵ�֡���ͨ��ά��һ��������·���� HttpHandler ��ӳ�䣬����ÿ��Ӧ�ó��������Լ�������·����ͨ���������ʽƥ������·������ʹ�� HandlerAdapter ������͵�����Ӧ�Ĵ�������
�������ģʽʹ���ڵ���������ʵ���в���͹������ WebFlux Ӧ�ó����ü򵥺͸�Ч��ÿ��Ӧ�ó��򶼿������Լ���������·������ ContextPathCompositeHandler ��������·�ɵ���ȷ��Ӧ�ó���������
������Spring WebFlux ��ܺ��������ȫ�������ˣ�ϣ�����԰�����ȫ����������� WebFlux��Ô������ע�����簮��̡�����ҳ��ɲ鿴V��ÿ����µ�Ô���������ݣ�������һ��ɳ���
ʹ��Blender���ɳ���ģ��
�Ķ�ȫ����������ERA5�����ط���
�Ķ�Xpath���������﷨
�Ķ�����ѧϰ�������繹�����£�
�Ķ���ΪMateƷ��ʢ�䣺HarmonyOS NEXT�ӳ�����Ϸ���ܵõ�����ͷ�
�Ķ�ʵ�ֶ��󼯺���DataTable���໥ת��
�Ķ�Ӳ�̵Ļ���֪ʶ��ѡ��ָ��
�Ķ�������й��ƶ��ı�ͼ��ײ�
�Ķ�����NEXTԪ�����������ѿ����ϼ���Ʒ
�Ķ��ᳲ���С������������Ƽ��رշ���
�Ķ������ArcMap�����н���դ��ͼ���ز�������
�Ķ��㷨�����ݽṹ 1 - ģ��
�Ķ���Ѷ�����߿ͷ���Ӫ��ϵͳ����
�Ķ���Ѷ��Ƶҹ��ģʽ���ý̳�
�Ķ����ں���NEXT��Ѫ���Ŵ���������������
�Ķ�5. Spring Cloud OpenFeign ����ʽ WebService �ͻ��˵ij���ϸʹ��
�Ķ�Java����ģʽ����̬�����Ͷ�̬�����ĶԱȷ���
�Ķ�Win11�ʼDZ����Զ�����Ӧ�õ���ɫ����ʾ����
�Ķ�˼�� V1.5.6 ��׿��
��ս�귨 V7.5.0 ��׿��
У��������������׵������� V1.0 ��׿��
��˸֮�� V1.9.7 ��׿��
������Ե����� v1.0.4 ��׿��
������֮ŠV5.2.3 ��׿��
��������������Դ V1.0 ��׿��
���֮Ϣ V1.0 ��׿��
��ħ������������䣩 V1.0 ��׿��
���ں�������ϵ�����������������վ�����������������Ƽ�����
Ƶ�� ����Ƶ��������ר������������׿�������app����
�Ƽ� ��Ô���������°��������ܿ������ز���
���� ����ɫ������������ ���������ս������������
ɨ��ά�����������ֻ��汾��
ɨ��ά����������΢�Ź��ںţ�
��վ�������������������ϴ��������ַ���İ�Ȩ���뷢�ʼ�[email protected]
��ICP��2022002427��-10 �湫��������43070202000427��© 2013~2025 haote.com ������