springbootAI 2.2.6__tar.gz → 2.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {springbootai-2.2.6 → springbootai-2.3.1}/CHANGELOG.md +49 -0
- {springbootai-2.2.6/springbootAI.egg-info → springbootai-2.3.1}/PKG-INFO +49 -12
- {springbootai-2.2.6 → springbootai-2.3.1}/README.md +17 -8
- {springbootai-2.2.6 → springbootai-2.3.1}/pyproject.toml +42 -4
- {springbootai-2.2.6 → springbootai-2.3.1}/requirements-ai.txt +1 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/__init__.py +2 -2
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/annotations/__init__.py +43 -2
- springbootai-2.3.1/spring/annotations/batch.py +101 -0
- springbootai-2.3.1/spring/annotations/data.py +67 -0
- springbootai-2.3.1/spring/annotations/enterprise.py +223 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/annotations/messaging.py +83 -1
- springbootai-2.3.1/spring/annotations/security.py +115 -0
- springbootai-2.3.1/spring/batch/__init__.py +545 -0
- springbootai-2.3.1/spring/cli/__init__.py +19 -0
- springbootai-2.3.1/spring/cli/main.py +339 -0
- springbootai-2.3.1/spring/cli/scaffold.py +1351 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/cloud/__init__.py +19 -0
- springbootai-2.3.1/spring/cloud/bus.py +356 -0
- springbootai-2.3.1/spring/cloud/config_center.py +393 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/config/config_loader.py +318 -106
- springbootai-2.3.1/spring/config/spring-configuration-metadata.json +56 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/context/application_context.py +237 -27
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/context/bean_factory.py +178 -27
- springbootai-2.3.1/spring/core/graceful_shutdown.py +336 -0
- springbootai-2.3.1/spring/data/rest.py +259 -0
- springbootai-2.3.1/spring/devtools.py +153 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langgraph/autoconfig.py +1 -1
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/logging/loguru_logger.py +16 -2
- springbootai-2.3.1/spring/main.py +838 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/mcp/server.py +1 -1
- springbootai-2.3.1/spring/messaging/kafka.py +275 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/migration.py +271 -20
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/mybatis_integration.py +5 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/configuration.py +186 -74
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/pool/connection_pool.py +88 -18
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/version.py +2 -2
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/security/jwt_utils.py +5 -2
- springbootai-2.3.1/spring/security/oauth2.py +354 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/security/replay_protection.py +22 -5
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/utils/banner.py +3 -3
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/utils/redis_client.py +29 -9
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/web/actuator.py +89 -1
- springbootai-2.3.1/spring/web/csrf.py +273 -0
- springbootai-2.3.1/spring/web/hateoas.py +367 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/web/health.py +36 -20
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/web/web_context.py +132 -25
- {springbootai-2.2.6 → springbootai-2.3.1/springbootAI.egg-info}/PKG-INFO +49 -12
- {springbootai-2.2.6 → springbootai-2.3.1}/springbootAI.egg-info/SOURCES.txt +34 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/springbootAI.egg-info/entry_points.txt +1 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/springbootAI.egg-info/requires.txt +35 -3
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_actuator_prometheus_admin.py +1 -1
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_ai_comprehensive.py +3 -5
- springbootai-2.3.1/tests/test_batch.py +311 -0
- springbootai-2.3.1/tests/test_bus.py +242 -0
- springbootai-2.3.1/tests/test_cli.py +181 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_compositional_annotations.py +5 -12
- springbootai-2.3.1/tests/test_config_center.py +303 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_config_fixes_185.py +129 -0
- springbootai-2.3.1/tests/test_csrf.py +269 -0
- springbootai-2.3.1/tests/test_data_rest.py +221 -0
- springbootai-2.3.1/tests/test_devtools.py +353 -0
- springbootai-2.3.1/tests/test_hateoas.py +260 -0
- springbootai-2.3.1/tests/test_kafka.py +754 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_langchain_comprehensive.py +0 -1
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_langchain_ext.py +6 -1
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_langgraph_comprehensive.py +1 -3
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_langgraph_module.py +1 -1
- springbootai-2.3.1/tests/test_metadata.py +114 -0
- springbootai-2.3.1/tests/test_migration.py +740 -0
- springbootai-2.3.1/tests/test_new_annotations.py +454 -0
- springbootai-2.3.1/tests/test_oauth2.py +394 -0
- springbootai-2.3.1/tests/test_pymybatis_configuration_hardening.py +129 -0
- springbootai-2.3.1/tests/test_scaffold_hardening.py +295 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_seata_durable_store.py +4 -2
- springbootai-2.3.1/tests/test_starter.py +113 -0
- springbootai-2.3.1/tests/test_startup_lifecycle.py +628 -0
- springbootai-2.2.6/spring/core/graceful_shutdown.py +0 -196
- springbootai-2.2.6/spring/main.py +0 -474
- {springbootai-2.2.6 → springbootai-2.3.1}/LICENSE +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/MANIFEST.in +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/SECURITY.md +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/requirements-langgraph.txt +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/requirements-mcp.txt +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/requirements.txt +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/setup.cfg +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/setup.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/ai/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/ai/advisors.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/ai/annotations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/ai/autoconfig.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/ai/core.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/ai/etl.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/ai/memory.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/ai/observability.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/ai/providers.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/ai/resilience.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/ai/tools.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/ai/vectorstore.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/annotations/cache.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/annotations/cloud.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/annotations/conditional.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/annotations/core.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/annotations/langchain.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/annotations/langgraph.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/aop/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/aop/aspect.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/aop/cloud_aop.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/aop/comprehensive_aop.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/aop/method_interceptor.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/aop/proxy_factory.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/cloud/discovery.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/cloud/feign.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/cloud/gateway.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/cloud/load_balancer.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/cloud/seata.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/cloud/seata_at_proxy.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/cloud/seata_bridge.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/cloud/sentinel.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/cloud/tracer.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/cloud/transaction_store.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/config/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/config/binding.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/context/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/context/bean_definition.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/context/registry.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/context/scanner.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/core/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/core/typing_utils.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/csv/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/csv/annotations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/csv/converters.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/csv/easy_csv.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/csv/exceptions.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/csv/reader.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/csv/writer.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/data/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/data/page.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/data/repository.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/data/specification.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/datasource/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/datasource/annotations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/datasource/context.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/datasource/dynamic.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/event/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/event/publisher.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/excel/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/excel/annotations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/excel/converters.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/excel/easy_excel.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/excel/exceptions.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/excel/reader.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/excel/style.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/excel/writer.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/i18n/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/i18n/accessor.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/i18n/auto_config.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/i18n/holder.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/i18n/locale.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/i18n/locale_resolver.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/i18n/message_source.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/i18n/middleware.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/i18n/properties.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/i18n/sources.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/adapters.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/agents/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/agents/services.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/annotations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/autoconfig.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/callbacks/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/callbacks/handlers.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/chains/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/chains/services.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/core.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/indexes/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/indexes/index.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/loaders/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/loaders/loaders.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/memory/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/memory/memory.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/parsers/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/parsers/parsers.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/partners.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/prompts/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/prompts/templates.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/retrievers/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/retrievers/retrievers.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/tools/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/tools/tools.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/utilities/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/utilities/utils.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/vectorstores/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langchain/vectorstores/stores.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langgraph/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langgraph/annotation_runtime.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langgraph/annotations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langgraph/checkpoint.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langgraph/config.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/langgraph/runtime.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/logging/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/mcp/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/mcp/annotation_runtime.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/mcp/annotations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/mcp/autoconfig.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/mcp/client.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/mcp/config.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/messaging/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/messaging/rabbitmq.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/monitoring/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/monitoring/prometheus.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/database.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/ddl_auto.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/annotations/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/annotations/annotations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/cache/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/cache/cache.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/cache/redis_cache.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/circuit_breaker/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/circuit_breaker/circuit_breaker.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/core/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/core/sql_session.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/core/sql_session_factory.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/dialect/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/dialect/dialect.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/dynamic_sql/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/dynamic_sql/dynamic_sql.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/interceptor/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/interceptor/interceptor.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/mapper/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/mapper/mapper.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/metrics/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/metrics/metrics.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/pool/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/security/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/security/access_control.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/security/password_encoder.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/security/sensitive_data_masker.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/security/sql_injection_detector.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/transaction/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/transaction/transaction.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/type_handler/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/type_handler/type_handler.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/xml_parser/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/orm/pymybatis/xml_parser/xml_parser.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/retry/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/retry/recovery.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/retry/retry_annotations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/retry/retry_decorator.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/scheduling/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/scheduling/scheduler.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/security/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/security/secret_manager.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/security/security_aop.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/security/security_context.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/test/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/test/slicing.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/tracing/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/tracing/skywalking.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/tx/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/tx/events.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/tx/synchronization.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/utils/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/utils/bean_utils.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/utils/logger.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/validation/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/validation/aop.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/validation/constraints.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/validation/exceptions.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/validation/validator.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/web/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/web/exception_handler.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/web/interceptor.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/web/result.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/web/swagger.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/websocket/__init__.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/websocket/annotations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/websocket/broker.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/websocket/exceptions.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/websocket/handler.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/websocket/router.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/spring/websocket/session.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/springbootAI.egg-info/dependency_links.txt +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/springbootAI.egg-info/top_level.txt +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/sql/seata_undo_log.sql +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_actuator.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_ai_declarative_annotations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_ai_module.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_annotation_combinations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_annotations_contract.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_aop_annotations_full.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_audit_time.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_bean_utils.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_cache_annotations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_cloud_embedded_full.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_component_init_error.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_conditional_annotations.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_config_binding.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_connection_resilience.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_core_annotations_full.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_csv_module.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_data_repository.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_datasource_routing.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_ddl_auto.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_declarative_aop_post_authorize_recover.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_di_config_event_full.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_excel_module.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_i18n_module.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_jpa_version_transient.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_langchain_module.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_logging_config.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_mcp_module.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_new_features.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_orm_pymybatis_full.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_production_readiness.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_pymybatis_contract.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_seata_at_proxy.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_seata_bridge.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_security.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_security_full.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_security_hardening.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_select_page.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_swagger_module.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_test_slicing.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_transactional_events.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_validation_module.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_web_annotations_full.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_web_root_mapping.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_web_static_files.py +0 -0
- {springbootai-2.2.6 → springbootai-2.3.1}/tests/test_websocket_module.py +0 -0
|
@@ -1,5 +1,54 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.3.0] - 2026-08-15
|
|
4
|
+
|
|
5
|
+
### 新增
|
|
6
|
+
|
|
7
|
+
- **企业级注解驱动**:新增 10 个注解,将 16 项企业级功能改造为注解驱动模式。标记在 `@SpringBootApplication` 主类上即可启用,注解参数优先于配置文件。
|
|
8
|
+
- `@EnableOAuth2` — 启用 OAuth2 资源服务器(支持 HS256/RS256、issuer/audience/scope 校验)
|
|
9
|
+
- `@EnableCsrf` — 启用 CSRF 防护(Double Submit Cookie 模式)
|
|
10
|
+
- `@EnableDevTools` — 启用开发环境热重载(文件变更自动重启)
|
|
11
|
+
- `@EnableConfigServer` — 启用 Spring Cloud Config 配置中心客户端
|
|
12
|
+
- `@EnableBus` — 启用 Spring Cloud Bus 事件总线
|
|
13
|
+
- `@EnableBatchProcessing` — 启用 Spring Batch 批处理
|
|
14
|
+
- `@EnableDataRest` — 启用 Spring Data REST(自动暴露 Repository 为 CRUD API)
|
|
15
|
+
- `@BatchJob` / `@BatchStep` — 标记批处理作业和步骤
|
|
16
|
+
- `@RepositoryRestResource` — 标记 Repository 为 REST 资源
|
|
17
|
+
- **OAuth2 资源服务器**:新增 `spring/security/oauth2.py`,支持 JWT Access Token 验证,HS256 对称密钥和 RS256 公钥(JWKS)两种算法。
|
|
18
|
+
- **CSRF 防护**:新增 `spring/web/csrf.py`,实现 Double Submit Cookie 模式中间件。
|
|
19
|
+
- **Kafka 支持**:新增 `spring/messaging/kafka.py`,提供 `KafkaClient`(生产者+消费者管理)和 `@KafkaListener`/`KafkaTemplate` 注解。
|
|
20
|
+
- **DevTools 热重载**:新增 `spring/devtools.py`,提供 `FileWatcher`(轮询文件变更)和 `RestartTrigger`(静默期防抖)。
|
|
21
|
+
- **数据库迁移完善**:新增 Undo 回滚迁移(U{version}__{desc}.sql)、迁移锁(MySQL/PostgreSQL/SQLite)、变量替换(${var})、validate 校验方法。
|
|
22
|
+
- **Actuator /heapdump 端点**:返回 tracemalloc 内存分配快照 + GC 统计(JSON 格式),对齐 Spring Boot /actuator/heapdump。
|
|
23
|
+
- **配置元数据**:新增 `spring/config/spring-configuration-metadata.json`,IDE 可读取提供配置自动补全。
|
|
24
|
+
- **项目脚手架**:新增 `spring/cli/scaffold.py`,支持 `springbootai init` 命令创建新项目。
|
|
25
|
+
- **Spring CLI**:新增 `spring/cli/main.py`,提供 `springbootai` 统一命令入口(version/info/list/init/run/docs)。
|
|
26
|
+
- **Starter 机制**:pyproject.toml 新增 `web`/`cloud`/`all` 组合 Starter extras。
|
|
27
|
+
- **Spring Cloud Config**:新增 `spring/cloud/config_center.py`,支持 HTTP 和本地文件后端。
|
|
28
|
+
- **Spring Cloud Bus**:新增 `spring/cloud/bus.py`,支持进程内和 MQ 后端事件总线。
|
|
29
|
+
- **Spring Batch**:新增 `spring/batch/`,支持 Job/Step/Reader/Processor/Writer 组件。
|
|
30
|
+
- **Spring Data REST**:新增 `spring/data/rest.py`,自动生成 Repository CRUD REST 端点。
|
|
31
|
+
- **Spring HATEOAS**:新增 `spring/web/hateoas.py`,包含 Link/EntityModel/CollectionModel/PagedModel。
|
|
32
|
+
- **Sphinx API 文档**:新增 `docs/conf.py` 和 `docs/index.rst`。
|
|
33
|
+
|
|
34
|
+
### 测试
|
|
35
|
+
|
|
36
|
+
- 新增 7 个测试文件,共 198 个测试用例:
|
|
37
|
+
- `test_kafka.py`(75)、`test_migration.py`(44)、`test_oauth2.py`(21)、`test_csrf.py`(19)、`test_devtools.py`(16)、`test_starter.py`(13)、`test_metadata.py`(10)
|
|
38
|
+
- 新增 `test_new_annotations.py`(37 个注解测试)
|
|
39
|
+
- 完整测试套件 **2821 passed, 11 skipped, 0 failed**
|
|
40
|
+
|
|
41
|
+
### 文档
|
|
42
|
+
|
|
43
|
+
- 新增 `doc/ENTERPRISE_ANNOTATIONS.md` — 10 个企业级注解完整教程
|
|
44
|
+
- 新增 `doc/MIGRATION_MODULE.md` — 数据库迁移模块文档(10 章节)
|
|
45
|
+
- 新增 `doc/STARTER_MODULE.md` — Starter 机制文档(8 章节)
|
|
46
|
+
- 新增 `doc/CLI_MODULE.md` — CLI 和脚手架文档(10 章节)
|
|
47
|
+
- `doc/MESSAGING_MODULE.md` 追加 Kafka 章节
|
|
48
|
+
- `doc/WEB_MODULE.md` 追加 HATEOAS 章节
|
|
49
|
+
- `doc/CONFIG_BINDING_MODULE.md` 追加配置元数据章节
|
|
50
|
+
- 35 个文件版本号从 2.2.6 更新到 2.3.0
|
|
51
|
+
|
|
3
52
|
## [2.2.6] - 2026-08-15
|
|
4
53
|
|
|
5
54
|
### 新增
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: springbootAI
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.1
|
|
4
4
|
Summary: Spring-style Python framework with Web, ORM, Cloud and AI integrations
|
|
5
5
|
Author-email: YuConggen <1516933915@qq.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -45,6 +45,8 @@ Provides-Extra: redis
|
|
|
45
45
|
Requires-Dist: redis==8.1.0; extra == "redis"
|
|
46
46
|
Provides-Extra: rabbitmq
|
|
47
47
|
Requires-Dist: pika==1.4.4; extra == "rabbitmq"
|
|
48
|
+
Provides-Extra: kafka
|
|
49
|
+
Requires-Dist: kafka-python==2.0.2; extra == "kafka"
|
|
48
50
|
Provides-Extra: nacos
|
|
49
51
|
Requires-Dist: nacos-sdk-python==2.0.11; extra == "nacos"
|
|
50
52
|
Provides-Extra: prometheus
|
|
@@ -61,7 +63,7 @@ Requires-Dist: langchain-core==1.5.4; extra == "ai"
|
|
|
61
63
|
Requires-Dist: langchain-classic==1.0.8; extra == "ai"
|
|
62
64
|
Requires-Dist: langchain-text-splitters==1.1.2; extra == "ai"
|
|
63
65
|
Requires-Dist: langchain-community==0.4.2; extra == "ai"
|
|
64
|
-
Requires-Dist: numpy==2.
|
|
66
|
+
Requires-Dist: numpy==2.3.0; extra == "ai"
|
|
65
67
|
Requires-Dist: pydantic==2.13.4; extra == "ai"
|
|
66
68
|
Provides-Extra: langchain
|
|
67
69
|
Requires-Dist: langchain-openai==1.4.2; extra == "langchain"
|
|
@@ -69,7 +71,7 @@ Requires-Dist: langchain-core==1.5.4; extra == "langchain"
|
|
|
69
71
|
Requires-Dist: langchain-classic==1.0.8; extra == "langchain"
|
|
70
72
|
Requires-Dist: langchain-text-splitters==1.1.2; extra == "langchain"
|
|
71
73
|
Requires-Dist: langchain-community==0.4.2; extra == "langchain"
|
|
72
|
-
Requires-Dist: numpy==2.
|
|
74
|
+
Requires-Dist: numpy==2.3.0; extra == "langchain"
|
|
73
75
|
Requires-Dist: pydantic==2.13.4; extra == "langchain"
|
|
74
76
|
Requires-Dist: faiss-cpu<2,>=1.7.4; extra == "langchain"
|
|
75
77
|
Requires-Dist: pypdf<6,>=4.0.0; extra == "langchain"
|
|
@@ -89,6 +91,32 @@ Requires-Dist: langgraph==1.2.9; extra == "langgraph"
|
|
|
89
91
|
Requires-Dist: langgraph-checkpoint-sqlite==3.1.1; extra == "langgraph"
|
|
90
92
|
Provides-Extra: mcp
|
|
91
93
|
Requires-Dist: mcp==2.0.0; extra == "mcp"
|
|
94
|
+
Provides-Extra: web
|
|
95
|
+
Requires-Dist: fastapi==0.115.6; extra == "web"
|
|
96
|
+
Requires-Dist: uvicorn==0.34.0; extra == "web"
|
|
97
|
+
Requires-Dist: pydantic==2.13.4; extra == "web"
|
|
98
|
+
Requires-Dist: python-multipart==0.0.20; extra == "web"
|
|
99
|
+
Provides-Extra: cloud
|
|
100
|
+
Requires-Dist: springbootAI[web]; extra == "cloud"
|
|
101
|
+
Requires-Dist: springbootAI[redis]; extra == "cloud"
|
|
102
|
+
Requires-Dist: springbootAI[rabbitmq]; extra == "cloud"
|
|
103
|
+
Requires-Dist: springbootAI[kafka]; extra == "cloud"
|
|
104
|
+
Requires-Dist: httpx==0.28.1; extra == "cloud"
|
|
105
|
+
Provides-Extra: all
|
|
106
|
+
Requires-Dist: springbootAI[web]; extra == "all"
|
|
107
|
+
Requires-Dist: springbootAI[mysql]; extra == "all"
|
|
108
|
+
Requires-Dist: springbootAI[redis]; extra == "all"
|
|
109
|
+
Requires-Dist: springbootAI[rabbitmq]; extra == "all"
|
|
110
|
+
Requires-Dist: springbootAI[kafka]; extra == "all"
|
|
111
|
+
Requires-Dist: springbootAI[prometheus]; extra == "all"
|
|
112
|
+
Requires-Dist: springbootAI[logging]; extra == "all"
|
|
113
|
+
Requires-Dist: springbootAI[excel]; extra == "all"
|
|
114
|
+
Requires-Dist: springbootAI[ai]; extra == "all"
|
|
115
|
+
Requires-Dist: springbootAI[langchain]; extra == "all"
|
|
116
|
+
Requires-Dist: springbootAI[langgraph]; extra == "all"
|
|
117
|
+
Requires-Dist: springbootAI[mcp]; extra == "all"
|
|
118
|
+
Requires-Dist: httpx==0.28.1; extra == "all"
|
|
119
|
+
Requires-Dist: psutil==6.1.1; extra == "all"
|
|
92
120
|
Provides-Extra: dev
|
|
93
121
|
Requires-Dist: pytest==9.1.1; extra == "dev"
|
|
94
122
|
Requires-Dist: pytest-cov==7.1.0; extra == "dev"
|
|
@@ -113,7 +141,7 @@ Requires-Dist: langchain-core==1.5.4; extra == "full"
|
|
|
113
141
|
Requires-Dist: langchain-classic==1.0.8; extra == "full"
|
|
114
142
|
Requires-Dist: langchain-text-splitters==1.1.2; extra == "full"
|
|
115
143
|
Requires-Dist: langchain-community==0.4.2; extra == "full"
|
|
116
|
-
Requires-Dist: numpy==2.
|
|
144
|
+
Requires-Dist: numpy==2.3.0; extra == "full"
|
|
117
145
|
Requires-Dist: pydantic==2.13.4; extra == "full"
|
|
118
146
|
Requires-Dist: faiss-cpu<2,>=1.7.4; extra == "full"
|
|
119
147
|
Requires-Dist: pypdf<6,>=4.0.0; extra == "full"
|
|
@@ -132,7 +160,7 @@ Requires-Dist: langgraph-checkpoint-sqlite==3.1.1; extra == "full"
|
|
|
132
160
|
Requires-Dist: mcp==2.0.0; extra == "full"
|
|
133
161
|
Dynamic: license-file
|
|
134
162
|
|
|
135
|
-
|
|
163
|
+
# SpringBootAI
|
|
136
164
|
|
|
137
165
|
<p align="center">
|
|
138
166
|
<img src="doc/images/hero-banner.png" alt="SpringBootAI 功能总览" width="100%" />
|
|
@@ -155,7 +183,7 @@ SpringBootAI 是一个采用 Spring 风格注解和分层结构的 Python 应用
|
|
|
155
183
|
| AI 与编排 | 模型调用、Tools、RAG、Chain、状态图、MCP client/server | LangChain / LangGraph / 官方 MCP SDK |
|
|
156
184
|
| 生产治理 | 健康检查、Prometheus、限流熔断、追踪、Swagger | prometheus-client / OpenTelemetry / OpenAPI |
|
|
157
185
|
|
|
158
|
-
当前版本是 `2.
|
|
186
|
+
当前版本是 `2.3.0`;支持 Python 3.10、3.11 和 3.12,许可证为 MIT。项目仍标记为 Beta。用于公网高并发、合规敏感或支付/订单/库存等核心系统前,必须完成目标数据库、流量模型、故障恢复和安全基线验证。内嵌 Gateway 适合内部路由,不替代公网 Nginx/Kong/WAF;Seata `distributed` 对接官方 TC + TCC 回调;`at` 模式通过 ORM 拦截器自动生成 undo_log 实现自动回滚。
|
|
159
187
|
|
|
160
188
|
[新手指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md) | [全部文档](https://github.com/YUCONGGEN/springbootAI/tree/master/doc) | [变更日志](https://github.com/YUCONGGEN/springbootAI/blob/master/CHANGELOG.md) | [安全报告](https://github.com/YUCONGGEN/springbootAI/blob/master/SECURITY.md) | [发布检查](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/RELEASE_CHECKLIST.md)
|
|
161
189
|
|
|
@@ -249,8 +277,11 @@ curl http://127.0.0.1:8080/api/hello/Alice
|
|
|
249
277
|
| 模块 | 文档 | 安装方式 | 一句话说明 |
|
|
250
278
|
|------|------|----------|-----------|
|
|
251
279
|
| ✅ 新手入门 | [BEGINNER_GUIDE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md) | 随核心包 | 从零安装、创建项目、运行接口、打开 Swagger |
|
|
280
|
+
| ✅ Web MVC | [WEB_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/WEB_MODULE.md) | 随核心包 | `@RestController` / 路由映射 / 参数绑定 / 跨域 / 全局异常处理 |
|
|
252
281
|
| ✅ 常用注解模块 | [ANNOTATION_MODULES.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ANNOTATION_MODULES.md) | 随核心包 | Bean Validation / 条件装配 / 缓存增强 / CSV / `@Version` / `@Transient` |
|
|
282
|
+
| ✅ Bean 生命周期与增强 | [LIFECYCLE_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LIFECYCLE_MODULE.md) | 随核心包 | `@PostConstruct` / `@Slf4j` / `@Primary` / `@Profile` / `@AuditLog` / `@FeatureToggle` |
|
|
253
283
|
| ✅ AOP / 后置鉴权 / 重试恢复 | [AOP_SECURITY_RETRY.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AOP_SECURITY_RETRY.md) | 随核心包 | `@Aspect` 通知 / `@PostAuthorize` / `@Recover`,含小白示例与常见错误 |
|
|
284
|
+
| ✅ 并发与弹性 | [CONCURRENCY_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CONCURRENCY_MODULE.md) | 随核心包 | `@Async` / `@Scheduled` / `@RateLimit` / `@CircuitBreaker` / `@Idempotent` / `@Lock` |
|
|
254
285
|
| 📦 AI(对接大模型) | [AI_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AI_MODULE.md) | `pip install springbootAI[ai]` | ChatClient / Advisor / Tools / RAG / Function Calling / 多厂商适配 |
|
|
255
286
|
| 📦 LangChain | [LANGCHAIN_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGCHAIN_MODULE.md) | `pip install springbootAI[langchain]` | Chains / Agents / Memory / Retrievers / VectorStores / 30+ 提供商 |
|
|
256
287
|
| 📦 LangGraph | [LANGGRAPH_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGGRAPH_MODULE.md) | `pip install springbootAI[langgraph]` | 状态图 / 条件路由 / 人工中断 / 注解式工作流 |
|
|
@@ -258,6 +289,7 @@ curl http://127.0.0.1:8080/api/hello/Alice
|
|
|
258
289
|
| ✅ 内嵌 PyMyBatis ORM | [ORM_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ORM_MODULE.md) | 随核心包 | Mapper 注解 / XML Mapper / 分页 / SQL 安全 / DDL 自动建表 / Repository 分页查询 |
|
|
259
290
|
| ✅ JPA 实体与仓库 | [JPA_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/JPA_MODULE.md) | 随核心包 | `@Entity` + `@Table` / 字段自动推断 / `@CreateTime` / Repository / DataJpaTest |
|
|
260
291
|
| ✅ Cloud 微服务 | [CLOUD_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CLOUD_MODULE.md) | 随核心包 | 服务注册发现 / 配置刷新 / Feign / Sentinel / Gateway / 分布式事务 |
|
|
292
|
+
| 📦 消息队列 | [MESSAGING_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MESSAGING_MODULE.md) | `pip install springbootAI[rabbitmq]` | `@RabbitListener` / `RabbitTemplate` RabbitMQ 消息收发 |
|
|
261
293
|
| 📦 Excel 读写 | [EXCEL_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/EXCEL_MODULE.md) | `pip install springbootAI[excel]` | `@ExcelProperty` / `@ExcelIgnore` 注解驱动读写 |
|
|
262
294
|
| 📦 CSV 读写 | [CSV_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CSV_MODULE.md) | `pip install springbootAI[csv]` | `@CsvProperty` / `@CsvIgnore` 注解驱动读写 |
|
|
263
295
|
| ✅ Swagger 文档 | [SWAGGER_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/SWAGGER_MODULE.md) | 随核心包 | `@Tag` / `@Operation` 注解驱动 API 文档 |
|
|
@@ -270,6 +302,10 @@ curl http://127.0.0.1:8080/api/hello/Alice
|
|
|
270
302
|
| ✅ ⑥ 测试切片 | [TEST_SLICE_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/TEST_SLICE_MODULE.md) | 随核心包 | 只测试你关心的部分 |
|
|
271
303
|
| ✅ ⑦ i18n | [I18N_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/I18N_MODULE.md) | 随核心包 | 中英文自动切换 |
|
|
272
304
|
| ✅ ⑧ WebSocket | [WEBSOCKET_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/WEBSOCKET_MODULE.md) | 随核心包 | 像微信一样实时通信 |
|
|
305
|
+
| ✅ 企业级注解驱动 | [ENTERPRISE_ANNOTATIONS.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ENTERPRISE_ANNOTATIONS.md) | 随核心包 | `@EnableOAuth2`/`@EnableCsrf`/`@EnableDevTools`/`@EnableBatchProcessing` 等10个注解 |
|
|
306
|
+
| ✅ 数据库迁移 | [MIGRATION_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MIGRATION_MODULE.md) | 随核心包 | Flyway风格版本化迁移/Undo回滚/迁移锁/变量替换 |
|
|
307
|
+
| ✅ Starter机制 | [STARTER_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/STARTER_MODULE.md) | 随核心包 | `pip install springbootAI[web/cloud/all]` 组合依赖 |
|
|
308
|
+
| ✅ CLI与脚手架 | [CLI_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CLI_MODULE.md) | 随核心包 | `springbootai init/run/docs` 命令行工具 |
|
|
273
309
|
| — AI 与 LangChain 测试 | [AI_LANGCHAIN_TEST_GUIDE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AI_LANGCHAIN_TEST_GUIDE.md) | — | AI 与 LangChain 测试说明 |
|
|
274
310
|
| — 测试报告 | [TEST_REPORT.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/TEST_REPORT.md) | — | 全量测试用例与覆盖范围 |
|
|
275
311
|
|
|
@@ -280,10 +316,11 @@ curl http://127.0.0.1:8080/api/hello/Alice
|
|
|
280
316
|
### 🎯 新手推荐阅读顺序
|
|
281
317
|
|
|
282
318
|
1. 先按 [新手入门指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md) 跑通 `/api/hello/{name}`。
|
|
283
|
-
2. 阅读本页第 4、6、7 章,理解配置、依赖注入和 Controller。
|
|
319
|
+
2. 阅读本页第 4、6、7 章,理解配置、依赖注入和 Controller;深入学习 Web 注解看 [WEB_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/WEB_MODULE.md)。
|
|
284
320
|
3. 做数据库 CRUD 时阅读 [ORM_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ORM_MODULE.md)。
|
|
285
321
|
4. 需要输入校验、缓存或条件开关时阅读 [ANNOTATION_MODULES.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ANNOTATION_MODULES.md)。
|
|
286
|
-
5.
|
|
322
|
+
5. 需要异步、定时任务、限流、熔断时阅读 [CONCURRENCY_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CONCURRENCY_MODULE.md)。
|
|
323
|
+
6. 最后再按业务需要选择安全、Cloud、消息队列、AI、LangChain、Excel、WebSocket 等文档。
|
|
287
324
|
|
|
288
325
|
---
|
|
289
326
|
|
|
@@ -326,10 +363,10 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
326
363
|
|
|
327
364
|
| 组件 | 当前版本 |
|
|
328
365
|
|------|----------|
|
|
329
|
-
| `spring` 框架 API | 2.
|
|
330
|
-
| `spring.orm.pymybatis` | 2.
|
|
331
|
-
| `spring.ai` AI 模块 | 2.
|
|
332
|
-
| `spring.langchain` LangChain 模块 | 2.
|
|
366
|
+
| `spring` 框架 API | 2.3.0 |
|
|
367
|
+
| `spring.orm.pymybatis` | 2.3.0 |
|
|
368
|
+
| `spring.ai` AI 模块 | 2.3.0 |
|
|
369
|
+
| `spring.langchain` LangChain 模块 | 2.3.0 |
|
|
333
370
|
| Python | 3.10+ |
|
|
334
371
|
|
|
335
372
|
### 1.4 适合什么场景
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
# SpringBootAI
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
4
|
<img src="doc/images/hero-banner.png" alt="SpringBootAI 功能总览" width="100%" />
|
|
@@ -21,7 +21,7 @@ SpringBootAI 是一个采用 Spring 风格注解和分层结构的 Python 应用
|
|
|
21
21
|
| AI 与编排 | 模型调用、Tools、RAG、Chain、状态图、MCP client/server | LangChain / LangGraph / 官方 MCP SDK |
|
|
22
22
|
| 生产治理 | 健康检查、Prometheus、限流熔断、追踪、Swagger | prometheus-client / OpenTelemetry / OpenAPI |
|
|
23
23
|
|
|
24
|
-
当前版本是 `2.
|
|
24
|
+
当前版本是 `2.3.0`;支持 Python 3.10、3.11 和 3.12,许可证为 MIT。项目仍标记为 Beta。用于公网高并发、合规敏感或支付/订单/库存等核心系统前,必须完成目标数据库、流量模型、故障恢复和安全基线验证。内嵌 Gateway 适合内部路由,不替代公网 Nginx/Kong/WAF;Seata `distributed` 对接官方 TC + TCC 回调;`at` 模式通过 ORM 拦截器自动生成 undo_log 实现自动回滚。
|
|
25
25
|
|
|
26
26
|
[新手指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md) | [全部文档](https://github.com/YUCONGGEN/springbootAI/tree/master/doc) | [变更日志](https://github.com/YUCONGGEN/springbootAI/blob/master/CHANGELOG.md) | [安全报告](https://github.com/YUCONGGEN/springbootAI/blob/master/SECURITY.md) | [发布检查](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/RELEASE_CHECKLIST.md)
|
|
27
27
|
|
|
@@ -115,8 +115,11 @@ curl http://127.0.0.1:8080/api/hello/Alice
|
|
|
115
115
|
| 模块 | 文档 | 安装方式 | 一句话说明 |
|
|
116
116
|
|------|------|----------|-----------|
|
|
117
117
|
| ✅ 新手入门 | [BEGINNER_GUIDE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md) | 随核心包 | 从零安装、创建项目、运行接口、打开 Swagger |
|
|
118
|
+
| ✅ Web MVC | [WEB_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/WEB_MODULE.md) | 随核心包 | `@RestController` / 路由映射 / 参数绑定 / 跨域 / 全局异常处理 |
|
|
118
119
|
| ✅ 常用注解模块 | [ANNOTATION_MODULES.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ANNOTATION_MODULES.md) | 随核心包 | Bean Validation / 条件装配 / 缓存增强 / CSV / `@Version` / `@Transient` |
|
|
120
|
+
| ✅ Bean 生命周期与增强 | [LIFECYCLE_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LIFECYCLE_MODULE.md) | 随核心包 | `@PostConstruct` / `@Slf4j` / `@Primary` / `@Profile` / `@AuditLog` / `@FeatureToggle` |
|
|
119
121
|
| ✅ AOP / 后置鉴权 / 重试恢复 | [AOP_SECURITY_RETRY.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AOP_SECURITY_RETRY.md) | 随核心包 | `@Aspect` 通知 / `@PostAuthorize` / `@Recover`,含小白示例与常见错误 |
|
|
122
|
+
| ✅ 并发与弹性 | [CONCURRENCY_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CONCURRENCY_MODULE.md) | 随核心包 | `@Async` / `@Scheduled` / `@RateLimit` / `@CircuitBreaker` / `@Idempotent` / `@Lock` |
|
|
120
123
|
| 📦 AI(对接大模型) | [AI_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AI_MODULE.md) | `pip install springbootAI[ai]` | ChatClient / Advisor / Tools / RAG / Function Calling / 多厂商适配 |
|
|
121
124
|
| 📦 LangChain | [LANGCHAIN_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGCHAIN_MODULE.md) | `pip install springbootAI[langchain]` | Chains / Agents / Memory / Retrievers / VectorStores / 30+ 提供商 |
|
|
122
125
|
| 📦 LangGraph | [LANGGRAPH_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGGRAPH_MODULE.md) | `pip install springbootAI[langgraph]` | 状态图 / 条件路由 / 人工中断 / 注解式工作流 |
|
|
@@ -124,6 +127,7 @@ curl http://127.0.0.1:8080/api/hello/Alice
|
|
|
124
127
|
| ✅ 内嵌 PyMyBatis ORM | [ORM_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ORM_MODULE.md) | 随核心包 | Mapper 注解 / XML Mapper / 分页 / SQL 安全 / DDL 自动建表 / Repository 分页查询 |
|
|
125
128
|
| ✅ JPA 实体与仓库 | [JPA_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/JPA_MODULE.md) | 随核心包 | `@Entity` + `@Table` / 字段自动推断 / `@CreateTime` / Repository / DataJpaTest |
|
|
126
129
|
| ✅ Cloud 微服务 | [CLOUD_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CLOUD_MODULE.md) | 随核心包 | 服务注册发现 / 配置刷新 / Feign / Sentinel / Gateway / 分布式事务 |
|
|
130
|
+
| 📦 消息队列 | [MESSAGING_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MESSAGING_MODULE.md) | `pip install springbootAI[rabbitmq]` | `@RabbitListener` / `RabbitTemplate` RabbitMQ 消息收发 |
|
|
127
131
|
| 📦 Excel 读写 | [EXCEL_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/EXCEL_MODULE.md) | `pip install springbootAI[excel]` | `@ExcelProperty` / `@ExcelIgnore` 注解驱动读写 |
|
|
128
132
|
| 📦 CSV 读写 | [CSV_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CSV_MODULE.md) | `pip install springbootAI[csv]` | `@CsvProperty` / `@CsvIgnore` 注解驱动读写 |
|
|
129
133
|
| ✅ Swagger 文档 | [SWAGGER_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/SWAGGER_MODULE.md) | 随核心包 | `@Tag` / `@Operation` 注解驱动 API 文档 |
|
|
@@ -136,6 +140,10 @@ curl http://127.0.0.1:8080/api/hello/Alice
|
|
|
136
140
|
| ✅ ⑥ 测试切片 | [TEST_SLICE_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/TEST_SLICE_MODULE.md) | 随核心包 | 只测试你关心的部分 |
|
|
137
141
|
| ✅ ⑦ i18n | [I18N_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/I18N_MODULE.md) | 随核心包 | 中英文自动切换 |
|
|
138
142
|
| ✅ ⑧ WebSocket | [WEBSOCKET_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/WEBSOCKET_MODULE.md) | 随核心包 | 像微信一样实时通信 |
|
|
143
|
+
| ✅ 企业级注解驱动 | [ENTERPRISE_ANNOTATIONS.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ENTERPRISE_ANNOTATIONS.md) | 随核心包 | `@EnableOAuth2`/`@EnableCsrf`/`@EnableDevTools`/`@EnableBatchProcessing` 等10个注解 |
|
|
144
|
+
| ✅ 数据库迁移 | [MIGRATION_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MIGRATION_MODULE.md) | 随核心包 | Flyway风格版本化迁移/Undo回滚/迁移锁/变量替换 |
|
|
145
|
+
| ✅ Starter机制 | [STARTER_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/STARTER_MODULE.md) | 随核心包 | `pip install springbootAI[web/cloud/all]` 组合依赖 |
|
|
146
|
+
| ✅ CLI与脚手架 | [CLI_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CLI_MODULE.md) | 随核心包 | `springbootai init/run/docs` 命令行工具 |
|
|
139
147
|
| — AI 与 LangChain 测试 | [AI_LANGCHAIN_TEST_GUIDE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AI_LANGCHAIN_TEST_GUIDE.md) | — | AI 与 LangChain 测试说明 |
|
|
140
148
|
| — 测试报告 | [TEST_REPORT.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/TEST_REPORT.md) | — | 全量测试用例与覆盖范围 |
|
|
141
149
|
|
|
@@ -146,10 +154,11 @@ curl http://127.0.0.1:8080/api/hello/Alice
|
|
|
146
154
|
### 🎯 新手推荐阅读顺序
|
|
147
155
|
|
|
148
156
|
1. 先按 [新手入门指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md) 跑通 `/api/hello/{name}`。
|
|
149
|
-
2. 阅读本页第 4、6、7 章,理解配置、依赖注入和 Controller。
|
|
157
|
+
2. 阅读本页第 4、6、7 章,理解配置、依赖注入和 Controller;深入学习 Web 注解看 [WEB_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/WEB_MODULE.md)。
|
|
150
158
|
3. 做数据库 CRUD 时阅读 [ORM_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ORM_MODULE.md)。
|
|
151
159
|
4. 需要输入校验、缓存或条件开关时阅读 [ANNOTATION_MODULES.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ANNOTATION_MODULES.md)。
|
|
152
|
-
5.
|
|
160
|
+
5. 需要异步、定时任务、限流、熔断时阅读 [CONCURRENCY_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CONCURRENCY_MODULE.md)。
|
|
161
|
+
6. 最后再按业务需要选择安全、Cloud、消息队列、AI、LangChain、Excel、WebSocket 等文档。
|
|
153
162
|
|
|
154
163
|
---
|
|
155
164
|
|
|
@@ -192,10 +201,10 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
192
201
|
|
|
193
202
|
| 组件 | 当前版本 |
|
|
194
203
|
|------|----------|
|
|
195
|
-
| `spring` 框架 API | 2.
|
|
196
|
-
| `spring.orm.pymybatis` | 2.
|
|
197
|
-
| `spring.ai` AI 模块 | 2.
|
|
198
|
-
| `spring.langchain` LangChain 模块 | 2.
|
|
204
|
+
| `spring` 框架 API | 2.3.0 |
|
|
205
|
+
| `spring.orm.pymybatis` | 2.3.0 |
|
|
206
|
+
| `spring.ai` AI 模块 | 2.3.0 |
|
|
207
|
+
| `spring.langchain` LangChain 模块 | 2.3.0 |
|
|
199
208
|
| Python | 3.10+ |
|
|
200
209
|
|
|
201
210
|
### 1.4 适合什么场景
|
|
@@ -12,7 +12,7 @@ build-backend = "setuptools.build_meta"
|
|
|
12
12
|
[project]
|
|
13
13
|
# 发行名 springbootAI(PyPI 包名,pip install springbootAI);导入包名仍为 spring
|
|
14
14
|
name = "springbootAI"
|
|
15
|
-
version = "2.
|
|
15
|
+
version = "2.3.1"
|
|
16
16
|
description = "Spring-style Python framework with Web, ORM, Cloud and AI integrations"
|
|
17
17
|
readme = "README.md"
|
|
18
18
|
license = "MIT"
|
|
@@ -71,6 +71,7 @@ redis = ["redis==8.1.0"]
|
|
|
71
71
|
# 消息队列 - 类似 Spring Boot Starter AMQP
|
|
72
72
|
# ========================================
|
|
73
73
|
rabbitmq = ["pika==1.4.4"]
|
|
74
|
+
kafka = ["kafka-python==2.0.2"]
|
|
74
75
|
|
|
75
76
|
# ========================================
|
|
76
77
|
# 服务发现 - 类似 Spring Cloud Alibaba Nacos
|
|
@@ -106,7 +107,7 @@ ai = [
|
|
|
106
107
|
"langchain-classic==1.0.8",
|
|
107
108
|
"langchain-text-splitters==1.1.2",
|
|
108
109
|
"langchain-community==0.4.2",
|
|
109
|
-
"numpy==2.
|
|
110
|
+
"numpy==2.3.0",
|
|
110
111
|
"pydantic==2.13.4",
|
|
111
112
|
]
|
|
112
113
|
|
|
@@ -122,7 +123,7 @@ langchain = [
|
|
|
122
123
|
"langchain-classic==1.0.8",
|
|
123
124
|
"langchain-text-splitters==1.1.2",
|
|
124
125
|
"langchain-community==0.4.2",
|
|
125
|
-
"numpy==2.
|
|
126
|
+
"numpy==2.3.0",
|
|
126
127
|
"pydantic==2.13.4",
|
|
127
128
|
# 默认装上的向量库/文档/工具依赖(安全:全部锁定已知安全版本)
|
|
128
129
|
"faiss-cpu>=1.7.4,<2",
|
|
@@ -158,6 +159,40 @@ mcp = [
|
|
|
158
159
|
"mcp==2.0.0",
|
|
159
160
|
]
|
|
160
161
|
|
|
162
|
+
# ========================================
|
|
163
|
+
# 组合 Starter - 类似 Spring Boot Starter Web/Cloud/All
|
|
164
|
+
# 安装:pip install springbootAI[web] / springbootAI[cloud] / springbootAI[all]
|
|
165
|
+
# ========================================
|
|
166
|
+
web = [
|
|
167
|
+
"fastapi==0.115.6",
|
|
168
|
+
"uvicorn==0.34.0",
|
|
169
|
+
"pydantic==2.13.4",
|
|
170
|
+
"python-multipart==0.0.20",
|
|
171
|
+
]
|
|
172
|
+
cloud = [
|
|
173
|
+
"springbootAI[web]",
|
|
174
|
+
"springbootAI[redis]",
|
|
175
|
+
"springbootAI[rabbitmq]",
|
|
176
|
+
"springbootAI[kafka]",
|
|
177
|
+
"httpx==0.28.1",
|
|
178
|
+
]
|
|
179
|
+
all = [
|
|
180
|
+
"springbootAI[web]",
|
|
181
|
+
"springbootAI[mysql]",
|
|
182
|
+
"springbootAI[redis]",
|
|
183
|
+
"springbootAI[rabbitmq]",
|
|
184
|
+
"springbootAI[kafka]",
|
|
185
|
+
"springbootAI[prometheus]",
|
|
186
|
+
"springbootAI[logging]",
|
|
187
|
+
"springbootAI[excel]",
|
|
188
|
+
"springbootAI[ai]",
|
|
189
|
+
"springbootAI[langchain]",
|
|
190
|
+
"springbootAI[langgraph]",
|
|
191
|
+
"springbootAI[mcp]",
|
|
192
|
+
"httpx==0.28.1",
|
|
193
|
+
"psutil==6.1.1",
|
|
194
|
+
]
|
|
195
|
+
|
|
161
196
|
# ========================================
|
|
162
197
|
# 开发依赖
|
|
163
198
|
# ========================================
|
|
@@ -196,7 +231,7 @@ full = [
|
|
|
196
231
|
"langchain-classic==1.0.8",
|
|
197
232
|
"langchain-text-splitters==1.1.2",
|
|
198
233
|
"langchain-community==0.4.2",
|
|
199
|
-
"numpy==2.
|
|
234
|
+
"numpy==2.3.0",
|
|
200
235
|
"pydantic==2.13.4",
|
|
201
236
|
# LangChain 模块增强(对齐 springbootAI[langchain])
|
|
202
237
|
"faiss-cpu>=1.7.4,<2",
|
|
@@ -253,6 +288,9 @@ Issues = "https://github.com/YUCONGGEN/springbootAI/issues"
|
|
|
253
288
|
|
|
254
289
|
[project.scripts]
|
|
255
290
|
springbootai = "spring.main:run_cli"
|
|
291
|
+
# 项目脚手架工具(类似 Spring Initializr),初始化符合 SpringBootAI 风格的新项目
|
|
292
|
+
# 用法:springbootai-init my-project --modules web,orm
|
|
293
|
+
springbootai-init = "spring.cli.scaffold:main"
|
|
256
294
|
|
|
257
295
|
[tool.setuptools.packages.find]
|
|
258
296
|
include = ["spring*"]
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
from .annotations import *
|
|
2
2
|
from .context import *
|
|
3
3
|
from .web import *
|
|
4
4
|
from .config import *
|
|
5
5
|
from .utils import *
|
|
6
6
|
from .main import create_app, run, SpringApplication, run_cli
|
|
7
7
|
|
|
8
|
-
__version__ = "2.
|
|
8
|
+
__version__ = "2.3.1"
|
|
9
9
|
__author__ = "yuconggen"
|
|
10
10
|
__license__ = "MIT"
|
|
11
11
|
|
|
@@ -98,16 +98,22 @@ from .conditional import (
|
|
|
98
98
|
ConditionalOnClass,
|
|
99
99
|
)
|
|
100
100
|
|
|
101
|
-
#
|
|
101
|
+
# 可选导入:消息队列注解(RabbitMQ 需要 pika,Kafka 需要 kafka-python)
|
|
102
102
|
try:
|
|
103
103
|
from .messaging import (
|
|
104
104
|
RabbitListener,
|
|
105
105
|
RabbitTemplate,
|
|
106
|
+
KafkaListener,
|
|
107
|
+
KafkaTemplate,
|
|
108
|
+
kafka_template,
|
|
106
109
|
)
|
|
107
110
|
except ImportError:
|
|
108
|
-
#
|
|
111
|
+
# 依赖未安装,这些注解不可用
|
|
109
112
|
RabbitListener = None
|
|
110
113
|
RabbitTemplate = None
|
|
114
|
+
KafkaListener = None
|
|
115
|
+
KafkaTemplate = None
|
|
116
|
+
kafka_template = None
|
|
111
117
|
|
|
112
118
|
# Optional MCP annotations are dependency-safe until MCP is enabled.
|
|
113
119
|
from spring.mcp.annotations import (
|
|
@@ -121,6 +127,24 @@ from spring.mcp.annotations import (
|
|
|
121
127
|
from .langchain import LangChainCall, LangChainClient
|
|
122
128
|
from .langgraph import GraphEdge, GraphInvoke, GraphNode, GraphRoute, LangGraph
|
|
123
129
|
|
|
130
|
+
# 安全启用型注解(@EnableOAuth2 / @EnableCsrf)
|
|
131
|
+
from .security import EnableOAuth2, EnableCsrf
|
|
132
|
+
|
|
133
|
+
# 企业级启用型注解(@EnableDevTools / @EnableConfigServer / @EnableBus / @EnableBatchProcessing / @EnableDataRest)
|
|
134
|
+
from .enterprise import (
|
|
135
|
+
EnableDevTools,
|
|
136
|
+
EnableConfigServer,
|
|
137
|
+
EnableBus,
|
|
138
|
+
EnableBatchProcessing,
|
|
139
|
+
EnableDataRest,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
# 批处理注解(@BatchJob / @BatchStep)
|
|
143
|
+
from .batch import BatchJob, BatchStep
|
|
144
|
+
|
|
145
|
+
# 数据 REST 注解(@RepositoryRestResource)
|
|
146
|
+
from .data import RepositoryRestResource
|
|
147
|
+
|
|
124
148
|
__all__ = [
|
|
125
149
|
"SpringBootApplication",
|
|
126
150
|
"ComponentScan",
|
|
@@ -215,6 +239,9 @@ __all__ = [
|
|
|
215
239
|
# 消息队列注解
|
|
216
240
|
"RabbitListener",
|
|
217
241
|
"RabbitTemplate",
|
|
242
|
+
"KafkaListener",
|
|
243
|
+
"KafkaTemplate",
|
|
244
|
+
"kafka_template",
|
|
218
245
|
# Model Context Protocol
|
|
219
246
|
"MCPCall",
|
|
220
247
|
"MCPClient",
|
|
@@ -231,4 +258,18 @@ __all__ = [
|
|
|
231
258
|
"GraphNode",
|
|
232
259
|
"GraphRoute",
|
|
233
260
|
"LangGraph",
|
|
261
|
+
# 安全启用型注解
|
|
262
|
+
"EnableOAuth2",
|
|
263
|
+
"EnableCsrf",
|
|
264
|
+
# 企业级启用型注解
|
|
265
|
+
"EnableDevTools",
|
|
266
|
+
"EnableConfigServer",
|
|
267
|
+
"EnableBus",
|
|
268
|
+
"EnableBatchProcessing",
|
|
269
|
+
"EnableDataRest",
|
|
270
|
+
# 批处理注解
|
|
271
|
+
"BatchJob",
|
|
272
|
+
"BatchStep",
|
|
273
|
+
# 数据 REST 注解
|
|
274
|
+
"RepositoryRestResource",
|
|
234
275
|
]
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""
|
|
2
|
+
批处理注解
|
|
3
|
+
|
|
4
|
+
提供 Spring Batch 风格的注解驱动批处理作业定义。
|
|
5
|
+
|
|
6
|
+
使用示例::
|
|
7
|
+
|
|
8
|
+
@BatchJob(name="importUsers")
|
|
9
|
+
class ImportUserJob:
|
|
10
|
+
@BatchStep(name="readCsv", chunk_size=100)
|
|
11
|
+
def read_csv_step(self):
|
|
12
|
+
reader = CsvItemReader("users.csv")
|
|
13
|
+
processor = FunctionItemProcessor(lambda x: x)
|
|
14
|
+
writer = CsvItemWriter("output.csv")
|
|
15
|
+
return Step("readCsv", reader, processor, writer, chunk_size=100)
|
|
16
|
+
|
|
17
|
+
对齐 Java Spring Batch:
|
|
18
|
+
- Java 通过 @Job 和 @Step 注解定义批处理作业
|
|
19
|
+
- Python 版本提供 @BatchJob 和 @BatchStep 注解标记作业和步骤
|
|
20
|
+
"""
|
|
21
|
+
from typing import Optional
|
|
22
|
+
|
|
23
|
+
from .core import SpringAnnotation
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class BatchJob(SpringAnnotation):
|
|
27
|
+
"""标记一个类为批处理作业
|
|
28
|
+
|
|
29
|
+
标记了此注解的类会被 BatchJobRegistry 注册,
|
|
30
|
+
可通过 JobLauncher 执行或通过 @EnableBatchProcessing(auto_run=True) 自动执行。
|
|
31
|
+
|
|
32
|
+
Attributes:
|
|
33
|
+
name: 作业名称(必须唯一)
|
|
34
|
+
description: 作业描述(可选)
|
|
35
|
+
restartable: 是否允许重启失败的作业(默认 True)
|
|
36
|
+
|
|
37
|
+
使用示例::
|
|
38
|
+
|
|
39
|
+
@BatchJob(name="importUsers", description="导入用户数据")
|
|
40
|
+
class ImportUserJob:
|
|
41
|
+
def execute(self, job_launcher):
|
|
42
|
+
# 定义并执行步骤
|
|
43
|
+
pass
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
_annotation_type = "batch_job"
|
|
47
|
+
|
|
48
|
+
def __init__(
|
|
49
|
+
self,
|
|
50
|
+
name: str,
|
|
51
|
+
description: str = '',
|
|
52
|
+
restartable: bool = True,
|
|
53
|
+
):
|
|
54
|
+
super().__init__(
|
|
55
|
+
name=name,
|
|
56
|
+
description=description,
|
|
57
|
+
restartable=restartable,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class BatchStep(SpringAnnotation):
|
|
62
|
+
"""标记一个方法为批处理步骤
|
|
63
|
+
|
|
64
|
+
标记了此注解的方法应返回一个 Step 对象或 Step 配置。
|
|
65
|
+
|
|
66
|
+
Attributes:
|
|
67
|
+
name: 步骤名称
|
|
68
|
+
chunk_size: 分块大小(默认 10)
|
|
69
|
+
retry_limit: 最大重试次数(默认 0,不重试)
|
|
70
|
+
skip_limit: 最大跳过次数(默认 0,不跳过)
|
|
71
|
+
|
|
72
|
+
使用示例::
|
|
73
|
+
|
|
74
|
+
@BatchJob(name="dataPipeline")
|
|
75
|
+
class DataPipelineJob:
|
|
76
|
+
@BatchStep(name="extract", chunk_size=500)
|
|
77
|
+
def extract_step(self):
|
|
78
|
+
reader = CsvItemReader("input.csv")
|
|
79
|
+
writer = ListItemWriter()
|
|
80
|
+
return Step("extract", reader, None, writer, chunk_size=500)
|
|
81
|
+
|
|
82
|
+
@BatchStep(name="transform", chunk_size=100, retry_limit=3)
|
|
83
|
+
def transform_step(self):
|
|
84
|
+
...
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
_annotation_type = "batch_step"
|
|
88
|
+
|
|
89
|
+
def __init__(
|
|
90
|
+
self,
|
|
91
|
+
name: str,
|
|
92
|
+
chunk_size: int = 10,
|
|
93
|
+
retry_limit: int = 0,
|
|
94
|
+
skip_limit: int = 0,
|
|
95
|
+
):
|
|
96
|
+
super().__init__(
|
|
97
|
+
name=name,
|
|
98
|
+
chunk_size=chunk_size,
|
|
99
|
+
retry_limit=retry_limit,
|
|
100
|
+
skip_limit=skip_limit,
|
|
101
|
+
)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""
|
|
2
|
+
数据 REST 注解
|
|
3
|
+
|
|
4
|
+
提供 Spring Data REST 风格的注解,将 Repository 自动暴露为 REST API。
|
|
5
|
+
|
|
6
|
+
使用示例::
|
|
7
|
+
|
|
8
|
+
@RepositoryRestResource(path="users")
|
|
9
|
+
class UserRepository(PagingAndSortingRepository):
|
|
10
|
+
entity_class = User
|
|
11
|
+
# ... CRUD 方法已由基类提供
|
|
12
|
+
|
|
13
|
+
# 应用启动时自动注册以下端点:
|
|
14
|
+
# GET /api/users 列表(分页+排序)
|
|
15
|
+
# GET /api/users/{id} 详情
|
|
16
|
+
# POST /api/users 创建
|
|
17
|
+
# PUT /api/users/{id} 更新
|
|
18
|
+
# DELETE /api/users/{id} 删除
|
|
19
|
+
|
|
20
|
+
对齐 Java Spring Data REST:
|
|
21
|
+
- Java 通过 @RepositoryRestResource 注解标记 Repository
|
|
22
|
+
- Python 版本提供同名注解,配合 @EnableDataRest 使用
|
|
23
|
+
"""
|
|
24
|
+
from typing import Optional, Type
|
|
25
|
+
|
|
26
|
+
from .core import SpringAnnotation
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class RepositoryRestResource(SpringAnnotation):
|
|
30
|
+
"""标记 Repository 为可暴露的 REST 资源
|
|
31
|
+
|
|
32
|
+
标记了此注解的 Repository 类会在应用启动时
|
|
33
|
+
自动注册 CRUD REST 端点。
|
|
34
|
+
|
|
35
|
+
Attributes:
|
|
36
|
+
path: REST 路径(如 'users' → /api/users)
|
|
37
|
+
entity_class: 实体类(必须指定,用于创建实例和文档)
|
|
38
|
+
id_type: ID 字段类型(默认 int)
|
|
39
|
+
exported: 是否暴露为 REST(默认 True,设为 False 可临时禁用)
|
|
40
|
+
|
|
41
|
+
使用示例::
|
|
42
|
+
|
|
43
|
+
@RepositoryRestResource(path="users", entity_class=User)
|
|
44
|
+
class UserRestController:
|
|
45
|
+
def find_all(self, pageable):
|
|
46
|
+
...
|
|
47
|
+
|
|
48
|
+
@RepositoryRestResource(path="orders", entity_class=Order, exported=False)
|
|
49
|
+
class OrderRepository: # exported=False 时不注册 REST 端点
|
|
50
|
+
...
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
_annotation_type = "repository_rest"
|
|
54
|
+
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
path: str,
|
|
58
|
+
entity_class: Optional[Type] = None,
|
|
59
|
+
id_type: type = int,
|
|
60
|
+
exported: bool = True,
|
|
61
|
+
):
|
|
62
|
+
super().__init__(
|
|
63
|
+
path=path,
|
|
64
|
+
entity_class=entity_class,
|
|
65
|
+
id_type=id_type,
|
|
66
|
+
exported=exported,
|
|
67
|
+
)
|