当前位置: 首页 > news >正文

廊坊微信网站建设搬瓦工ss加wordpress

廊坊微信网站建设,搬瓦工ss加wordpress,动态图片素材网站,视频直播app源码6. 使用 Spring Boot进行开发#xff08;Developing with Spring Boot#xff09; 本节详细介绍了如何使用Spring Boot。它涵盖考虑构建系统、自动配置以及如何运行应用程序等主题。我们还介绍一些 Spring Boot 最新做法。虽然 Spring Boot 没有什么特别之处#xff08;它只…6. 使用 Spring Boot进行开发Developing with Spring Boot 本节详细介绍了如何使用Spring Boot。它涵盖考虑构建系统、自动配置以及如何运行应用程序等主题。我们还介绍一些 Spring Boot 最新做法。虽然 Spring Boot 没有什么特别之处它只是你使用的一个库它会有一些建议当您遵循这些建议可以使您的开发过程更容易一些。 如果您从 Spring Boot 开始在进入本章节之前你应该阅读 入门指南 。 6.1 构建系统Build Systems 强烈建议您选择一个 依赖管理 来构建项目而且可以使用发布到 “Maven Central” 库的组件。我们建议您选择 Maven 或 Gradle。你也可以让 Spring Boot 和其它构建系统例如Ant配合使用但是它们的支持并不完善。 6.1.1 依赖管理Dependency Management Spring Boot 的每个版本都会提供其支持的依赖项列表。实际上你不需要提供构建配置中依赖项的版本因为Spring Boot 会为您管理这些依赖项。当您升级 Spring Boot 本身时这些依赖项也会统一升级。 ::: tip 提示 如果需要您仍然可以指定依赖版本并覆盖 Spring Boot 的设置版本。 ::: 列表中包含了所有的 Spring 模块以及第三方库的详细列表。该列表以标准清单spring-boot-dependencies的形式提供可以与 Maven 和 Gradle 一起使用。 ::: warning 警告 Spring Boot 的每个版本都与 Spring Framework 的集成版本息息相关。我们强烈建议你不要指定它的版本。 ::: 6.1.2 Maven 要了解如何将 Spring Boot 与 Maven 结合使用请参阅 Spring Boot 的 Maven 插件文档 参考资料 HTML 和 PDFAPI 6.1.3 Gradle 要了解如何将 Spring Boot 与 Gradle 结合使用请参阅 Spring Boot 的 Gradle 插件文档 参考资料HTML 和 PDFAPI 6.1.4 Ant 使用 Apache AntIvy 可以构建 Spring Boot 项目。此外“AntLib” 模块 spring-boot-antlib 可以帮助 Ant 创建可执行jar。 如果要声明依赖关系 ivy.xml 文件应与下方示例类似 ivy-module version2.0info organisationorg.springframework.boot modulespring-boot-sample-ant/configurationsconf namecompile descriptioneverything needed to compile this module/conf nameruntime extendscompile descriptioneverything needed to run this module//configurationsdependenciesdependency orgorg.springframework.boot namespring-boot-starterrev${spring-boot.version} confcompile//dependencies /ivy-modulebuild.xml 文件应与下方示例类似 projectxmlns:ivyantlib:org.apache.ivy.antxmlns:spring-bootantlib:org.springframework.boot.antnamemyapp defaultbuildproperty namespring-boot.version value2.7.18-SNAPSHOT/target nameresolve description-- retrieve dependencies with ivyivy:retrieve patternlib/[conf]/[artifact]-[type]-[revision].[ext]//targettarget nameclasspaths dependsresolvepath idcompile.classpathfileset dirlib/compile includes*.jar//path/targettarget nameinit dependsclasspathsmkdir dirbuild/classes//targettarget namecompile dependsinit descriptioncompilejavac srcdirsrc/main/java destdirbuild/classes classpathrefcompile.classpath//targettarget namebuild dependscompilespring-boot:exejar destfilebuild/myapp.jar classesbuild/classesspring-boot:libfileset dirlib/runtime//spring-boot:lib/spring-boot:exejar/target /project::: tip 提示 如果不想使用 spring-boot-antlib 模块请参阅 Build an Executable Archive From Ant without Using spring-boot-antlib 。 ::: 6.1.5 Starters 场景启动器是一组依赖关系的描述您可以将其包含在应用程序中。你可以获得所需的全部 Spring 以及相关技术的一站式服务而无需搜索示例代码和复制粘贴依赖描述符。例如如果您开始使用 Spring 和 JPA 进行数据库访问请在项目中包含 spring-boot-starter-data-jpa 依赖。 场景启动器包含大量的依赖项这些依赖项可以让项目快速启动和运行,并提供一套一致的、受支持的依赖项传递。 ::: tip What is in a name 所有官方场景启动器都遵循类型的命名模式 spring-boot-starter-*其中 * 为特定类型的应用程序。这种命名结构的目的是需要查找场景启动器时提供帮助。许多集成开发环境中的 Maven 都可以让您按名称搜索依赖项。例如如果安装了相应的 Eclipse 或 Spring 插件就可以在 POM 编辑器中键入 ctrl-space 键然后键入“spring-boot-starter”查看完整列表。 在 “创建自己的场景启动器” 部分所述第三方启动器不应该以spring-boot开头因为spring-boot是 Spring Boot 官方库的专属开通。相反第三方启动器通常以项目名称开通例如名为 thirdpartyproject 的第三方启动器通常会命名为thirdpartyproject-spring-boot-starter。 ::: 以下场景启动器是 Spring Boot 官方提供的都属于 org.springframework.boot 组 表 1. Spring Boot 应用程序启动器 NameDescriptionspring-boot-starter核心启动器包括自动配置、日志记录和 YAMLspring-boot-starter-activemq集成 Apache ActiveMQ 的 JMS messaging 启动器spring-boot-starter-amqp集成 Spring AMQP 和 Rabbit MQ 的启动器spring-boot-starter-aop集成 Spring AOP 和 AspectJ 进行面向切面编程的启动器spring-boot-starter-artemis集成 Apache Artemis 的 JMS messaging 启动器spring-boot-starter-batch集成 Spring Batch 的启动器spring-boot-starter-cache集成 Spring Framework 缓存支持的启动器spring-boot-starter-data-cassandra集成 Cassandra 分布式数据库和 Spring Data Cassandra 的启动器spring-boot-starter-data-cassandra-reactive集成 Cassandra 分布式数据库和 Spring Data Cassandra Reactive 的启动器spring-boot-starter-data-couchbase集成面向文档的 Couchbase 数据库和 Spring Data Couchbase 的启动器spring-boot-starter-data-couchbase-reactive集成面向文档的 Couchbase 数据库和 Spring Data Couchbase Reactive 的启动器spring-boot-starter-data-elasticsearch集成 Elasticsearch 搜索、分析引擎和 Spring Data Elasticsearch 的启动器spring-boot-starter-data-jdbc集成 Spring Data JDBC 的启动器spring-boot-starter-data-jpa集成 Spring Data JPA 和 Hibernate 的启动器spring-boot-starter-data-ldap集成 Spring Data LDAP 的启动器spring-boot-starter-data-mongodb集成面向文档的 MongoDB 数据库和 Spring Data MongoDB 的启动器spring-boot-starter-data-mongodb-reactive集成面向文档的 MongoDB 数据库和 Spring Data MongoDB Reactive 的启动器spring-boot-starter-data-neo4j集成 Neo4j 图形数据库和 Spring Data Neo4j 的启动器spring-boot-starter-data-r2dbc集成 Spring Data R2DBC 的启动器spring-boot-starter-data-redis集成 Redis 存储、Spring Data Redis 和 Lettuce 客户端的启动器spring-boot-starter-data-redis-reactive集成 Redis 存储、Spring Data Redis reactive 和 Lettuce 客户端的启动器spring-boot-starter-data-rest使用 Spring Data REST 和 Spring MVC 通过 REST 访问 Spring Data存储库的启动器spring-boot-starter-freemarker使用 FreeMarker 视图构建 MVC 网络应用程序的启动器spring-boot-starter-graphql使用 Spring GraphQL 构建 GraphQL 应用程序的启动器spring-boot-starter-groovy-templates使用 Groovy 模板视图构建 MVC 网络应用程序的启动器spring-boot-starter-hateoas使用 Spring MVC 和 Spring HATEOAS 构建基于超媒体的 RESTful 网络应用程序的启动器spring-boot-starter-integration集成 Spring Integration 的启动器spring-boot-starter-jdbc集成 HikariCP 连接池的JDBC启动器spring-boot-starter-jersey使用 JAX-RS 和 Jersey 构建 RESTful 网络应用程序的启动器。可以代替 spring-boot-starter-webspring-boot-starter-jooq使用 jOOQ 通过JDBC 访问 SQL 数据库的启动器。可以代替 spring-boot-starter-data-jpa 或 spring-boot-starter-jdbcspring-boot-starter-json用于读写 json 的启动器spring-boot-starter-jta-atomikos使用 Atomikos 进行 JTA 事务的启动器spring-boot-starter-mail使用 Java Mail 和 Spring Framework 电子邮件支持发送的启动器spring-boot-starter-mustache使用 Mustache 视图构建网络应用程序的启动器spring-boot-starter-oauth2-client使用 Spring Security 的 OAuth2/OpenID 连接客户端功能的启动器spring-boot-starter-oauth2-resource-server使用 Spring Security 的 OAuth2 资源服务功能的启动器spring-boot-starter-quartz集成 Quartz scheduler 的启动器spring-boot-starter-rsocket用于构建 RSocket 客户端和服务器的启动器spring-boot-starter-security集成 Spring Security 的启动器spring-boot-starter-test使用 JUnit Jupiter、Hamcrest 和 Mockito 等库测试 Spring Boot 应用程序的启动器spring-boot-starter-thymeleaf使用 Thymeleaf 视图构建 MVC 应用程序的启动器spring-boot-starter-validation使用 Hibernate 验证器进行 Java Bean 验证的启动器spring-boot-starter-web使用 Spring MVC 构建Web包括 RESTful应用程序的启动器。使用 Tomcat 作为默认嵌入式容器spring-boot-starter-web-services集成 Spring Web Services 的启动器spring-boot-starter-webflux使用 Spring Framework 的 Reactive Web 支持构建 WebFlux 应用程序的启动器spring-boot-starter-websocket使用 Spring Framework 的 WebSocket 支持构建WebSocket启动器 除应用程序启动器外还可使用以下启动器添加 production ready 功能 表 2. Spring Boot 生产环境启动器 NameDescriptionspring-boot-starter-actuator使用 Spring Boot 的 Actuator 的启动器它提供production ready功能帮助您监控和管理应用程序 最后Spring Boot 还包括一些用于排除或交换特定技术方向的启动器 表 3. Spring Boot 技术启动器 NameDescriptionspring-boot-starter-jetty使用 Jetty 作为嵌入式 servlet 容器的启动器。可以替代 spring-boot-starter-tomcatspring-boot-starter-log4j2使用 Log4j2 进行日志记录的启动器。可以替代 spring-boot-starter-loggingspring-boot-starter-logging使用 Logback 进行日志记录的启动器。默认的日志启动器spring-boot-starter-reactor-netty使用 Reactor Netty 作为嵌入式响应式 HTTP 服务器的启动器spring-boot-starter-tomcat使用 Tomcat 作为嵌入式 servlet 容器的启动器。使用默认 servlet 容器启动器 spring-boot-starter-webspring-boot-starter-undertow使用 Undertow 作为嵌入式 servlet 容器的启动器。可以替代 spring-boot-starter-tomcat 要深入了解技术交互方向的知识请参阅r swapping web server 和 logging system。 ::: tip 提示 有关其他社区贡献的启动器列表请参阅 GitHub 上的spring-boot-starters模块的 README 文件 。 ::: 6.2 构建你的代码Structuring Your Code Spring Boot 不需要任何特定的代码结构。然而也有一些最佳实现是很有帮助的。 6.2.1 使用默认包Using the “default” Package 当一个类不包含 package 声明。它通常被认为在一个“默认包”中。一般不建议使用 “默认包” 应该避免使用。它会给使用 ComponentScan, ConfigurationPropertiesScan, EntityScan或 SpringBootApplication 注解的 Spring Boot 应用程序带来很多问题因为每个 jar 中的每个类都会被读取。 ::: tip 提示 我们建议您遵循 Java 推荐的软件包命名约定并使用相反的域名例如com.example.project。 ::: 6.2.2 定位主程序类Locating the Main Application Class 我们通常建议将主程序类放到根包中。 SpringBootApplication 注解 会放在主类上它隐式地为某些项目定义了一个基础的 “search package” 。例如如果你正在编写一个 JPA 应用程序那么使用 SpringBootApplication 注解的类所在的包将会搜索 Entity 。使用根包还可以让组件只应用到你的项目。 ::: tip 提示 如果你不使用 SpringBootApplication你应该使用 EnableAutoConfiguration 和 ComponentScan 注解来代替它。 ::: 下面列出了一个典型项目的布局 com- example- myapplication- MyApplication.java|- customer| - Customer.java| - CustomerController.java| - CustomerService.java| - CustomerRepository.java|- order- Order.java- OrderController.java- OrderService.java- OrderRepository.javaMyApplication.java 文件定义了 main 方法以及 SpringBootApplication如下所示 SpringBootApplication public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}}6.3 配置类Configuration Classes Spring Boot 偏好基于 Java 的配置。虽然可以将. SpringApplication 和 XML 结合使用但是我们通常建议您将一个 Configuration 类作为主要来源。通常定义的 main 方法的类适合作为主要的 Configuration。 ::: tip 提示 在互联网上发布了很多使用XML配置的Spring配置示例如果可能请尽量使用基于Java的等效配置。搜索 Enable* 注解是一个很多方法。 ::: 6.3.1 导入其它配置类Importing Additional Configuration Classes 你不需要把全部的 Configuration 放在一个类中。 Import 注解可以用于导入其它配置类。或者您可以使用 ComponentScan 主动扫描注入全部的Spring组件包括 Configuration 。 6.3.2 导入XML配置Importing XML Configuration 如果您一定要使用基于XML的配置我们建议您从 Configuration 类开始。然后您可以使用 ImportResource 注解来加载XML配置文件。 6.4 自动配置Auto-configuration Spring Boot 自动配置会尝试根据您添加的jar依赖关系自动配置您的 Spring 应用程序。例如如果 HSQLDB 在类路径上而您没有手动配置任何数据库连接nean则 Spring Boot 会自动配置内存数据库。 你需要在其中一个 Configuration 类中添加EnableAutoConfiguration 或 SpringBootApplication 注解从而添加自动配置功能 ::: tip 提示 你只能添加一个 SpringBootApplication 或 EnableAutoConfiguration 注解。我们通常建议你只在主要的 Configuration 添加其中一个组件。 ::: 6.4.1 逐步取代自动配置Gradually Replacing Auto-configuration 自动配置是非侵入性的。在任何时候你都可以开始定义自己的配置用来取代自动配置的特定部分。例如如果您添加了自己的 DataSource bean默认嵌入式数据库不在进行支持。 个你需要了解当前应用的自动配置及其原因请使用 --debug 开关启动应用程序。这样做可以为选定的核心日志记录器启用debug日志并将报告记录到控制台。 6.4.2 禁用特定的自动配置类Disabling Specific Auto-configuration Classes 如果你发现当前应用中您不需要的特定自动配置类你可以使用 SpringBootApplication 的exclude属性来禁用它们如下所示 SpringBootApplication(exclude { DataSourceAutoConfiguration.class }) public class MyApplication {}如果类不在classpath上可以使用注解的 excludeName 属性来指定全限定类名。如果你更倾向于使用 EnableAutoConfiguration 而不是 SpringBootApplication也可以使用exclude 和 excludeName最后你可以使用 spring.autoconfigure.exclude 属性来控制需要排除的自动配置类列表。 ::: tip 提示 您可以在注解级别的和使用属性来定义排除项。 ::: ::: tip 提示 尽管自动配置类是 public但是该类唯一被认为公共API的部分是类名该名称可用于禁用自动配置。这些类的实际内容比如嵌套配置类或bean方法仅供内部使用我们不建议直接使用这些。 ::: 6.4.3 自动配置包路径Auto-configuration Packages 自动配置包路径是各种自动配置功能扫描实体和Spring Data repositories默认查找的包路径。 EnableAutoConfiguration 注解或者直接通过SpringBootApplication来决定默认的自动配置包路径。可以使用AutoConfigurationPackage注解配置其它软件包路径。 6.5 Spring Beans 和依赖注入Spring Beans and Dependency Injection 你可以自由使用任何标准的 Spring Framework 技术来定义您的 bean 及其注入的依赖项。我们通常建议使用构造器注入的方式来进行依赖注入并使用 ComponentScan 来查找Bean。 如果你按照上面的建议将主程序类放到顶级包中修改代码架构你就可以添加 ComponentScan 无需任何参数或者使用 SpringBootApplication 包含前者。所有的应用程序组件Component, Service, Repository, Controller等都会自动注入成 Spring Bean。 下面的示例显示了一个使用构造器注入获取所需 RiskAssessor Bean 的 Service Bean Service public class MyAccountService implements AccountService {private final RiskAssessor riskAssessor;public MyAccountService(RiskAssessor riskAssessor) {this.riskAssessor riskAssessor;}// ...}如果一个Bean有多个构造函数则需要用 Autowired来标记您希望Spring使用的构造函数 Service public class MyAccountService implements AccountService {private final RiskAssessor riskAssessor;private final PrintStream out;Autowiredpublic MyAccountService(RiskAssessor riskAssessor) {this.riskAssessor riskAssessor;this.out System.out;}public MyAccountService(RiskAssessor riskAssessor, PrintStream out) {this.riskAssessor riskAssessor;this.out out;}// ...}::: tip 提示 请注意使用构造器注入可以将 riskAssessor 字段标记为 final 字段表示以后不能更改。 ::: 6.6 使用SpringBootApplication注解Using the SpringBootApplication Annotation 许多 Spring Boot 开发人员都希望自己的应用程序能够使用自动配置、组件扫描并能在 application class定义额外的配置。只需要使用 SpringBootApplication 注解就可以启用这三个功能即 EnableAutoConfiguration启用 Spring Boot 的自动配置机制ComponentScan在应用程序所在包路径上启动 Component 扫描 (参阅 the best practices)SpringBootConfiguration启用在上下文中注册额外的 Bean 或导入额外的配置类。她是Spring标准 Configuration 的替代品有助于集成测试红的 configuration detection 。 // Same as SpringBootConfiguration EnableAutoConfiguration ComponentScan SpringBootApplication public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}}::: tip 提示 SpringBootApplication 提供了别名来自定义 EnableAutoConfiguration 和 ComponentScan 的属性。 ::: ::: tip 提示 这些功能都不是强制性的你可以选择用它所启用的任何功能来替代这个单一注解。例如您可能不想在应用程序中使用组件扫描或配置属性扫描 SpringBootConfiguration(proxyBeanMethods false) EnableAutoConfiguration Import({ SomeConfiguration.class, AnotherConfiguration.class }) public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}}在上述示例中 MyApplication 和其它 Spring Boot 应用程序一样只是 Component-annotated 类和 ConfigurationProperties-annotated 类不会被自动扫描到而用户定义Bean的会被显式导入 (参阅 Import)。 ::: 6.7 运行应用程序Running Your Application 将应用程序打包成jar并使用嵌入式HTTP服务器是最大优势之一您可以像运行其它服务器一样运行应用程序。调试Spring Boot应用程序也很容易。您不需要任何特殊的IDE插件或扩展。 ::: tip 备注 本章节仅涉及打包成jar文件。如果您选择将应用程序打包成war文件吗请参阅服务器和IDE文档。 ::: 6.7.1 使用IDE运行Running From an IDE 您可以将 Spring Boot 应用程序作为一个 Java 应用程序在IDE中运行。然而您首先需要导入您的项目。导入步骤因IDE和构建系统而异。大多数 IDE 可以直接导入 Maven 项目。例如Eclipse 用户可以 File 菜单中选择 Import… → Existing Maven Projects 。 如果无法直接将项目导入 IDE则可以使用build插件生成IDE基础开发架构。Maven 包含很多用于 Eclipse 和 IDEA 的插件。 Gradle 为 various IDEs 也提供了插件。 ::: tip 提示 如果无意中运行了Web应用程序两次就会看到 “Port already in use” 错误。Spring 工具用户可以使用 重新启动Relaunch按钮而不是运行Run按钮以确保关闭任何现有实例。 ::: 6.7.2 作为打包程序运行Running as a Packaged Application 如果您使用 Spring Boot Maven 或 Gradle 插件创建可执行jar你可以使用 java -jar运行应用程序如下例所示 $ java -jar target/myapplication-0.0.1-SNAPSHOT.jar也可以在启用远程调试支持的情况下运行打包应用程序。这样做可以将调试器附加到打包的应用程序上如下例所示 $ java -Xdebug -Xrunjdwp:servery,transportdt_socket,address8000,suspendn \-jar target/myapplication-0.0.1-SNAPSHOT.jar6.7.3 使用Maven插件Using the Maven Plugin Spring Boot Maven 插件包含 run 命令可以用于快速编译和运行您的应用程序。应用程序以 exploded 形式运行就像在 IDE 中一样。下面示例展示了运行SpringBoot应用程序的命令 $ mvn spring-boot:run您可以需要使用 MAVEN_OPTS 操作系统环境变量如下所示 $ export MAVEN_OPTS-Xmx1024m6.7.4 使用Gradle插件Using the Gradle Plugin Spring Boot Gradle 插件包括 bootRun 任务可以以1 exploded 的形式运行您的应用程序。每当您应用 org.springframework.boot 和 java 插件时都会添加 bootRun 任务如下所示 $ gradle bootRun您可以需要使用 JAVA_OPTS 操作系统环境变量如下所示 $ export JAVA_OPTS-Xmx1024m6.7.5 热插拔Hot Swapping 由于 Spring Boot 应用程序只是普通的 Java 应用程序因此JVM 热插拔可以开箱即用。 JVM 热插拔在某种程度上受限于它可以替换的字节码。要获得更完整的解决方案可以使用 JRebel 。 spring-boot-devtools 模块也支持快速重启应用程序。详情参阅 Hot swapping “How-to” 。 6.8 Developer Tools Spring Boot 包含一套额外的工具可以让应用程序开发体验更加愉快。spring-boot-devtools 模块可以包含在任何项目中以便提供额外的开发功能。如果要包含 devtools 支持请将模块依赖添加到您的构建中如下所示 Maven dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdoptionaltrue/optional/dependency /dependenciesGradle configurations {developmentOnlyruntimeClasspath {extendsFrom developmentOnly} } dependencies {developmentOnly(org.springframework.boot:spring-boot-devtools) }::: tip 注意事项 Devtools 可能会导致类加载问题尤其是在多模块项目中。 Diagnosing Classloading Issues 解释了如何诊断和解决这些问题。 ::: ::: tip 提示 运行打包之后的应用程序是会自动禁用devtools。 如果您的应用程序是使用 java -jar 启动或者使用一个特定的类加载器启动那么它将被视为“production application”。您可以使用 spring.devtools.restart.enabled 属性来控制是否启用 devtools。 如果要启用而不考虑类加载器请设置 -Dspring.devtools.restart.enabledtrue 。在生产环境运行devtools 会带来安全风险. 如果要禁用 devtools请排除依赖关系或设置 -Dspring.devtools.restart.enabledfalse 。 ::: ::: tip 提示 在 Maven 中将依赖关系标记为可选或在Gradle 中使用 developmentOnly 配置如上图所示可以防止devtools 被应用到项目的其它模块中。 ::: ::: tip 提示 重新打包的归档文件默认不包括 devtools 。如果需要使用 某些远程 devtools 功能则需要包含它。当使用 Maven 插件时将 excludeDevtools 属性设置为 false。当使用 Gradle 插件时配置依赖的类路径包含 developmentOnly 配置. buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfiguration!--确保项目打包是将Devtools包含进去--excludeDevtoolsfalse/excludeDevtools/configuration/plugin/plugins /build::: 6.8.1 诊断类加载问题Diagnosing Classloading Issues 正如 重启 vs 重载 部分所述重启功能是通过使用两个类加载器实现的对于大多数应用程序这种方法效果良好。然而又是会导致类加载问题特别是在多模块项目中。 判断类加载问题是否由devtools 和两个类加载器可以尝试禁用重启. 如果问题得到解决请 customize the restart classloader 使其包含整个项目。 6.8.2 Propert默认值Property Defaults Spring Boot 支持一些库使用缓存来提高性能。例如模板引擎 缓存已编译的模板以避免重复解析模板文件。此外Spring MVC 还可以在提供静态资源时为响应添加HTTP缓存响应头。 虽然缓存在生产中非常有益但在开发过程中却可能适得其反让你无法看到刚刚在应用程序中做出的更改。因此spring-boot-devtools 默认禁用缓存选项。 缓存选项通常由 application.properties 文件来进行配置的。例如Thymeleaf 提供了 spring.thymeleaf.cache 属性。无需手动配置这些属性 spring-boot-devtools 模块会提供开发时合理的配置 下表列出了应用的所有属性 NameDefault Valueserver.error.include-binding-errorsalwaysserver.error.include-messagealwaysserver.error.include-stacktracealwaysserver.servlet.jsp.init-parameters.developmenttrueserver.servlet.session.persistenttruespring.freemarker.cachefalsespring.graphql.graphiql.enabledtruespring.groovy.template.cachefalsespring.h2.console.enabledtruespring.mustache.servlet.cachefalsespring.mvc.log-resolved-exceptiontruespring.reactor.netty.shutdown-quiet-period0sspring.template.provider.cachefalsespring.thymeleaf.cachefalsespring.web.resources.cache.period0spring.web.resources.chain.cachefalse ::: tip 备注 如果您不希望应用默认配置则可以在application.properties中将 spring.devtools.add-properties 设置为 false 。 ::: 在开发 Spring MVC 和 Spring WebFlux 应用程序时您需要更多有关 Web 请求的信息因此开发工具建议您为 web logging group启用 DEBUG 日志。这将为您提供有关传入请求、处理程序、响应结果和其他详细信息。如果希望记录所有请求的详细信息包括潜在的敏感信息您可以打开 spring.mvc.log-request-details 或 spring.codec.log-request-details 配置属性. 6.8.3 自动重启Automatic Restart 只要类路径上的文件发生改变使用 spring-boot-devtools 的应用程序就会自动重启。在IDE中这是一个非常有用的功能因为它为代码修改提供了非常快速的反馈体验。默认情况下类路径指向的目录中所有文件都会受到控制以防发生变化。请注意对于某些资源如静态资源和视图模板不需要重新启动应用程序。 ::: tip 触发重启 由于 DevTools 监控类路径上的资源因此触发重启的唯一方式就是更新类路径上的资源。无论你使用的是 IDE还是构build插件修改后的文件都必须重新编译才能触发重启更新类路径的方式取决于所使用的工具 在Eclipse中保存修改后的文件会更新类路径资源并触发重启。在IntelliJ IDEA中构建项目(Build → Build Project) 具体相同效果。如果使用build插件运行Maven插件的 mvn compile 命令或Gradle插件的 gradle build 命令会触发重启。 ::: ::: tip 备注 如果使用build插件Maven 或 Gradle进行重启则必须将 forking 设置为 enabled。如果禁用 forking因为devtools 需要一个独立的应用程序类加载器可以使用所以重启功能将无法使用。 ::: ::: tip 提示 自动重启和LiveReload一起使用时效果非常好详情参阅 LiveReload 部分 。如果使用 JRebel自动重启功能将会被禁用以支持动态类重新加载功能。其它devtools 功能例如LiveReload 和属性覆盖仍然可以使用。 ::: ::: tip 备注 DevTools 依赖于应用程序上下文的shutdown hook 在重启的时候关闭它。如果禁用了shutdown hook (SpringApplication.setRegisterShutdownHook(false))它将无法正常使用。 ::: ::: tip 备注 DevTools 需要自定义ApplicationContext所使用的的 ResourceLoader 。如果您的应用程序已经提供了一个他将会被包装。不支持直接覆盖 ApplicationContext 上的 getResource 方法。 ::: ::: tip 注意事项 使用 AspectJ weaving时不支持自动重启。 ::: ::: tip 重启 vs 重载 Spring Boot 提供的重启技术是通过使用两个类加载器来实现的。不会更改的类例如来自第三方jar的类会被加载到 base classloader。您正在开发的类将会被加载到 restart classloader 中当应用程序重启时restart classloader 将会被丢弃然后创建一个新的。这种方法意味着应用程序重启的速度比 “cold starts” 要快的多因为 base classloader 在重启之前已经是可用且已加载。 如果你发现重启对于你的应用程序来说不够快或者你遇到类加载问题你可以考虑重载技术比如 JRebel 。这些技术的原理是在加载类时对其进行重写使其更易于重载。 ::: 记录状态评估中的变化Logging Changes in Condition Evaluation 默认情况下每次重新启动应用程序时都会记录一份状态评估的报告。该报告会显示应用程序自动配置的更改情况如添加或删除bean和配置属性 要禁用状态评估记录请设置以下属性 spring:devtools:restart:log-condition-evaluation-delta: false排除资源Excluding Resources 某些资源在更改时不一定需要触发重启。例如Thymeleaf 模板就可以直接修改。默认情况下修改 /META-INF/maven, /META-INF/resources, /resources, /static, /public, 或 /templates路径下的资源不会触发重启但是会重发 live reload。如果排除这些目录可以使用 spring.devtools.restart.exclude 属性。例如只排除 /static 和 /public 目录可以如下所示 spring:devtools:restart:exclude: static/**,public/**::: tip 提示 如果要保留这些默认值并添加其它排除项请使用 spring.devtools.restart.additional-exclude 属性代替。 ::: 监控其它路径Watching Additional Paths 当修改不在类路径上的文件时您可能希望应用程序重启或重载。为此可以使用 spring.devtools.restart.additional-paths 属性配置其它路径以便监视修改。您可以使用 the spring.devtools.restart.exclude 属性如上所诉 来控制其它路径上的修改是否会触发重启和live reload. 禁用重启Disabling Restart 如果不想使用重启功能您可以使用 spring.devtools.restart.enabled 属性来禁用它。多数情况下可以在 application.properties 文件配置该属性这样做仍会初始化restart classloader但不会监控文件的更改。 如果您需要完全禁用重启功能例如因为它无法和某些特定库一起使用则需要在调用 SpringApplication.run(…)之前将 系统 属性 spring.devtools.restart.enabled设置为 false 如下所示 SpringBootApplication public class MyApplication {public static void main(String[] args) {System.setProperty(spring.devtools.restart.enabled, false);SpringApplication.run(MyApplication.class, args);}}使用触发器文件Using a Trigger File 如果您使用的IDE会持续编译已修改的文件但是您更希望只在特定时间触发重启。为此你可以使用“触发器文件”这是一个特殊文件当需要实际触发重启时必须对其进行修改。 ::: tip 备注 修改文件只会触发检查只有在Devtools 检测到必须执行某些操作时才会重启。 ::: 要使用触发器文件请将 spring.devtools.restart.trigger-file 属性设置为触发器文件的路径。触发器文件必须在类路径上。 例如如果您有一个结构如下的项目 src - main- resources- .reloadtrigger那么您的 trigger-file 属性如下所示 spring:devtools:restart:trigger-file: .reloadtrigger现在只有更新 src/main/resources/.reloadtrigger 时才会重启。 ::: tip 提示 您可能希望将 spring.devtools.restart.trigger-file 设置成 全局设置这样所有项目的行为方式都是一样的。 ::: 有些 IDE 具有不需要手动修改触发器文件的功能。 Spring Tools for Eclipse 和 IntelliJ IDEA (Ultimate Edition) 都支持这种功能你可以在控制台使用 “reload” 按钮只要您的 trigger-file 命名为 .reloadtrigger。对于 IntelliJ IDEA您可以按照 文档中的说明进行使用。 自定义重启类加载器Customizing the Restart Classloader 正如 重启 vs 重载 部分所诉重启功能是通过两个类加载器来实现的。如果它导致了问题你可以需要自定义类加载器需要加载哪些内容。 默认情况下IDE中任何打开的项目都会使用 “restart” classloader而 .jar 文件会使用“base” classloader。使用 mvn spring-boot:run 或 gradle bootRun 时也是如此包含 SpringBootApplication 的项目使用 “restart” classloader加载而其它项目则使用 “base” classloader 加载。 你可以通过创建 META-INF/spring-devtools.properties 文件来指定Spring Boot使用不同的类加载器加载项目的部分内容。spring-devtools.properties 文件可以包含以 restart.exclude 和 restart.include为前缀的属性。include 属性配置的文件应该放到 “restart” classloader 中而 exclude 属性配置的文件应该放到 “base” classloader。该属性值是一个 regex 格式应用在类路径上如下所示 restart:exclude:companycommonlibs: /mycorp-common-[\\w\\d-\\.]\\.jarinclude:projectcommon: /mycorp-myproj-[\\w\\d-\\.]\\.jar::: tip 备注 所有属性key都必须是唯一的。只要是 restart.include. 或 restart.exclude. 为前缀的属性都要被加载。 ::: ::: tip 提示 所有类路径中的 META-INF/spring-devtools.properties 都会被加载。你可以在项目中打包文件也可以在项目使用的库中打包文件。 ::: 已知限制Known Limitations 对于使用标准 ObjectInputStream 进行反序列化的对象重启功能不起作用。如果您需要反序列化数据可能需要将 Spring 的 ConfigurableObjectInputStream 和 Thread.currentThread().getContextClassLoader() 结合使用。 遗憾的是一些第三方库在进行反序列化时没有考虑上下文类加载器。如果发现此类问题需要向原作者申请修复。 6.8.4 LiveReload spring-boot-devtools 模块包含一个嵌入式 LiveReload 服务器可以用于在资源发生变化是触发浏览器刷新。LiveReload 浏览器扩展可以免费用于 Chrome, Firefox 和 Safari。您可以在所用浏览器的市场或商店中搜索 ‘LiveReload’ 找到这些扩展。 如果不想在应用程序运行时启动 LiveReload 服务器可以将 spring.devtools.livereload.enabled 属性设置为 false。 ::: tip 备注 一次只能运行一个 LiveReload 服务器。启动应用程序前请确保没有其他 LiveReload 服务器在运行。如果从集成开发环境启动多个应用程序只有第一个支持 LiveReload。 ::: ::: warning 警告 需要在更改文件时触发 LiveReload必须启用 自动重启 。 ::: 6.8.5 全局配置Global Settings 在$HOME/.config/spring-boot 目录中添加以下任何文件即可配置全局devtools设置 spring-boot-devtools.propertiesspring-boot-devtools.yamlspring-boot-devtools.yml 添加到这些文件中的任何属性都适用于机器上使用 devtools 的所有 Spring Boot 应用程序。例如要将重启配置为使用 触发器文件你可以在 spring-boot-devtools 文件中添加以下属性 spring:devtools:restart:trigger-file: .reloadtrigger默认情况下$HOME 是用户的主目录。要自定义该位置请设置环境变量 SPRING_DEVTOOLS_HOME 或系统属性 spring.devtools.home 。 ::: tip 备注 如果在 $HOME/.config/spring-boot 中找不到 devtools 配置文件则会搜索 $HOME 目录中是否存在 .spring-boot-devtools.properties 文件。这样您就可以使用不支持$HOME/.config/spring-boot位置的旧版 Spring Boot 应用程序共享 devtools 全局配置。 ::: ::: tip 备注 devtools properties/yaml 文件不支持Profiles。.spring-boot-devtools.properties 中激活的任何profiles 都不会影响 特定 profile 的配置文件 的加载。YAML 和 Properties 类型文件的特定 Profile 文件名例如 spring-boot-devtools-profile.properties和 spring.config.activate.on-profile 文件均不支持。 ::: 配置文件系统监视器Configuring File System Watcher FileSystemWatcher 的工作原理是以一定时间间隔轮询观察类的修改然后等待预定义的静默期以确保不再有修改。由于 Spring Boot 完全依赖 IDE 来编译文件并将其复制到 Spring Boot 可以读取到的位置因此您可能会发现当 devtools 重启应用程序是有时某些修改不会被反映出来。如果您经常遇见此类问题请尝试将 spring.devtools.restart.poll-interval 和 spring.devtools.restart.quiet-period 属性参数设置为您需要的值 spring:devtools:restart:poll-interval: 2squiet-period: 1s现在每2秒钟就会轮询一次观察受监控的类路径目录是否有变化并保持1秒钟的静默期以确保没有其他类变化。 6.8.6 远程应用程序Remote Applications Spring Boot 开发工具不但可以本地开发。您还可以在运行远程应用程序时使用多项功能。远程支持是可选因为它可能存在安全风险。只有在受信任的网络上运行或者使用SSL确保安全时才能启用远程支持。如果这两个选项都不可用则不应该使用 DevTools 的远程支持功能。绝对不应在生产部署中启用该功能。 要启用它需要确保重新打包的压缩包中包含 devtools如下所示 buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationexcludeDevtoolsfalse/excludeDevtools/configuration/plugin/plugins /build然后需要设置 spring.devtools.remote.secret 属性。就像设置重要的密码或密码一样该值应是唯一且为强密码以防被猜测或暴力破解。 远程 devtools 支持由两部分组成一个接受连接的服务端端点和在IDE运行的客户端程序。服务端组件会在设置了 spring.devtools.remote.secret 属性后自动启用。客户端组件必须手动启动。 ::: tip 备注 Spring WebFlux 应用程序不支持远程 devtools。 ::: 运行远程客户端程序Running the Remote Client Application 远程客户端程序可以在IDE中运行。运行 org.springframework.boot.devtools.RemoteSpringApplication 时需要与所连接的远程项目使用相同的类路径。该应用程序的唯一必要参数是它所连接的远程URL。 例如如果您使用 Eclipse 或 Spring Tools并且有一个名为 my-app 的项目已部署到 Cloud Foundry您将执行以下操作 从Run菜单中选择 Run Configurations… 。创建一个新的 Java Application “启动配置”。浏览 my-app 项目。使用 org.springframework.boot.devtools.RemoteSpringApplication 作为主类。将 https://myapp.cfapps.io 添加到 Program arguments 或者任何远程URL。 正在远程的远程客户端可能如下所示 . ____ _ __ _ _/\\ / ____ __ _ _(_)_ __ __ _ ___ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | | _ \___ _ __ ___| |_ ___ \ \ \ \\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) \/ _ \ _/ -_) ) ) ) ) |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /|_||___//_/_/_/:: Spring Boot Remote :: (v2.7.18-SNAPSHOT)2023-11-22 15:38:10.397 INFO 916 --- [ main] o.s.b.devtools.RemoteSpringApplication : Starting RemoteSpringApplication v2.7.18-SNAPSHOT using Java 1.8.0_392 on myhost with PID 916 (/Users/myuser/.m2/repository/org/springframework/boot/spring-boot-devtools/2.7.18-SNAPSHOT/spring-boot-devtools-2.7.18-SNAPSHOT.jar started by myuser in /opt/apps/) 2023-11-22 15:38:10.401 INFO 916 --- [ main] o.s.b.devtools.RemoteSpringApplication : No active profile set, falling back to 1 default profile: default 2023-11-22 15:38:10.702 INFO 916 --- [ main] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 2023-11-22 15:38:10.724 INFO 916 --- [ main] o.s.b.devtools.RemoteSpringApplication : Started RemoteSpringApplication in 0.736 seconds (JVM running for 1.14)::: tip 备注 因为远程客户端与真正的应用程序使用相同的类路径所有它可以直接读取应用程序属性。这就是读取 spring.devtools.remote.secret 属性并将其传递给服务器进行身份验证的方式。 ::: ::: tip 提示 始终建议使用 https:// 作为连接协议以便加密通信信息并且密码无法被截获。 ::: ::: tip 提示 如果需要使用代理访问远程应用程序请配置 spring.devtools.remote.proxy.host 和 spring.devtools.remote.proxy.port 属性。 ::: 远程升级Remote Update 远程客户端会以与本地重启相同的方式监控应用程序类路径的变化。任何更新的资源都会被推送到远程应用程序并且如果需要会触发重启。如果您迭代的功能使用的是本地没有的与服务这将会非常有用。通常远程更新和重启比完全重新构建和部署要快得多。 在速度较慢的开发环境中可能会出现静默期不够的情况这时类中的更改可能会被分批进行。第一批更改上传后服务器将重新启动。由于服务器正在重启下一批更改无法发送到应用程序。 这种情况通常会在 RemoteSpringApplication 日志中出现警告提示无法上传某些类并随之重试。但它也可能导致应用程序代码不一致以及在上传第一批更改后无法重启。如果经常出现此类问题请尝试将 spring.devtools.restart.poll-interval 和 spring.devtools.restart.quiet-period 属性参数设置为您需要的值。请参阅 配置文件系统监视器 来配置这些属性。 ::: tip 备注 只有在远程客户端运行时文件才会受到监控。如果在启动远程客户端之前更改文件则不会将其推送到远程服务器。 ::: 6.9 打包应用程序Packaging Your Application for Production 可执行 jar 可用于生产部署。由于它们是独立的因此也非常适合基于云的部署。 对于其它的 “production ready” 功能例如运行状况审计和度量标准REST或JMX端点请考虑添加 spring-boot-actuator。 详情参阅 Production-ready Features。 6.10 接下来要阅读的内容What to Read Next 您现在应该了解如何使用Spring Boot和一些您应该遵循的最佳实践。现在您可以继续深入了解特定的 Spring Boot 功能 也可以跳到前面阅读Spring Boot的 “production ready” 部分。
文章转载自:
http://www.morning.kybyf.cn.gov.cn.kybyf.cn
http://www.morning.qfrmy.cn.gov.cn.qfrmy.cn
http://www.morning.gmplp.cn.gov.cn.gmplp.cn
http://www.morning.tfzjl.cn.gov.cn.tfzjl.cn
http://www.morning.ldpjm.cn.gov.cn.ldpjm.cn
http://www.morning.pngph.cn.gov.cn.pngph.cn
http://www.morning.cnfxr.cn.gov.cn.cnfxr.cn
http://www.morning.ckhpg.cn.gov.cn.ckhpg.cn
http://www.morning.tqdqc.cn.gov.cn.tqdqc.cn
http://www.morning.dzyxr.cn.gov.cn.dzyxr.cn
http://www.morning.mwzt.cn.gov.cn.mwzt.cn
http://www.morning.dnjwm.cn.gov.cn.dnjwm.cn
http://www.morning.yjmns.cn.gov.cn.yjmns.cn
http://www.morning.zdqsc.cn.gov.cn.zdqsc.cn
http://www.morning.pmdlk.cn.gov.cn.pmdlk.cn
http://www.morning.nytgk.cn.gov.cn.nytgk.cn
http://www.morning.rlrxh.cn.gov.cn.rlrxh.cn
http://www.morning.tsycr.cn.gov.cn.tsycr.cn
http://www.morning.hclqy.cn.gov.cn.hclqy.cn
http://www.morning.symgk.cn.gov.cn.symgk.cn
http://www.morning.zrkp.cn.gov.cn.zrkp.cn
http://www.morning.tbhlc.cn.gov.cn.tbhlc.cn
http://www.morning.zmpqh.cn.gov.cn.zmpqh.cn
http://www.morning.wnqfz.cn.gov.cn.wnqfz.cn
http://www.morning.dwncg.cn.gov.cn.dwncg.cn
http://www.morning.hdzty.cn.gov.cn.hdzty.cn
http://www.morning.dsmwy.cn.gov.cn.dsmwy.cn
http://www.morning.qpfmh.cn.gov.cn.qpfmh.cn
http://www.morning.fwnqq.cn.gov.cn.fwnqq.cn
http://www.morning.ndngj.cn.gov.cn.ndngj.cn
http://www.morning.lzqnj.cn.gov.cn.lzqnj.cn
http://www.morning.pqqzd.cn.gov.cn.pqqzd.cn
http://www.morning.tnjz.cn.gov.cn.tnjz.cn
http://www.morning.hdtcj.cn.gov.cn.hdtcj.cn
http://www.morning.xtqld.cn.gov.cn.xtqld.cn
http://www.morning.yhpq.cn.gov.cn.yhpq.cn
http://www.morning.jqsyp.cn.gov.cn.jqsyp.cn
http://www.morning.rwzqn.cn.gov.cn.rwzqn.cn
http://www.morning.ffmx.cn.gov.cn.ffmx.cn
http://www.morning.kqbzy.cn.gov.cn.kqbzy.cn
http://www.morning.gjlst.cn.gov.cn.gjlst.cn
http://www.morning.ndcjq.cn.gov.cn.ndcjq.cn
http://www.morning.nxbkw.cn.gov.cn.nxbkw.cn
http://www.morning.fmdvbsa.cn.gov.cn.fmdvbsa.cn
http://www.morning.pkmw.cn.gov.cn.pkmw.cn
http://www.morning.lqlc.cn.gov.cn.lqlc.cn
http://www.morning.ljhnn.cn.gov.cn.ljhnn.cn
http://www.morning.nxpqw.cn.gov.cn.nxpqw.cn
http://www.morning.pxlpt.cn.gov.cn.pxlpt.cn
http://www.morning.rbnnq.cn.gov.cn.rbnnq.cn
http://www.morning.qnywy.cn.gov.cn.qnywy.cn
http://www.morning.kmkpm.cn.gov.cn.kmkpm.cn
http://www.morning.jjxnp.cn.gov.cn.jjxnp.cn
http://www.morning.ggnjq.cn.gov.cn.ggnjq.cn
http://www.morning.znnsk.cn.gov.cn.znnsk.cn
http://www.morning.kqpq.cn.gov.cn.kqpq.cn
http://www.morning.frtb.cn.gov.cn.frtb.cn
http://www.morning.gtwtk.cn.gov.cn.gtwtk.cn
http://www.morning.burpgr.cn.gov.cn.burpgr.cn
http://www.morning.beeice.com.gov.cn.beeice.com
http://www.morning.bdypl.cn.gov.cn.bdypl.cn
http://www.morning.aswev.com.gov.cn.aswev.com
http://www.morning.rnngz.cn.gov.cn.rnngz.cn
http://www.morning.frmmp.cn.gov.cn.frmmp.cn
http://www.morning.ztnmc.cn.gov.cn.ztnmc.cn
http://www.morning.dybth.cn.gov.cn.dybth.cn
http://www.morning.dqpd.cn.gov.cn.dqpd.cn
http://www.morning.tfgkq.cn.gov.cn.tfgkq.cn
http://www.morning.mywnk.cn.gov.cn.mywnk.cn
http://www.morning.crtgd.cn.gov.cn.crtgd.cn
http://www.morning.ntnml.cn.gov.cn.ntnml.cn
http://www.morning.cctgww.cn.gov.cn.cctgww.cn
http://www.morning.zqkms.cn.gov.cn.zqkms.cn
http://www.morning.fxwkl.cn.gov.cn.fxwkl.cn
http://www.morning.jqmmf.cn.gov.cn.jqmmf.cn
http://www.morning.sxwfx.cn.gov.cn.sxwfx.cn
http://www.morning.lynb.cn.gov.cn.lynb.cn
http://www.morning.lxhrq.cn.gov.cn.lxhrq.cn
http://www.morning.bndkf.cn.gov.cn.bndkf.cn
http://www.morning.brjq.cn.gov.cn.brjq.cn
http://www.tj-hxxt.cn/news/267910.html

相关文章:

  • 做礼品建什么网站wordpress 标题长度 省略号
  • 2008服务器做网站做企鹅号的视频素材网站
  • 周口网站建设多少钱做的新网站到首页又下去了
  • 集团网站制作方案ppt做网站程序看什么书
  • 手机网站被禁止访问怎么设置打开宁波网站建设流程有哪些
  • 苏州企业网站制作报价国内wordpress大神
  • 网站搜索算法缅甸新闻最新消息
  • 网站排名推广自己怎么做网络推广营销工具
  • 成都建设网站那家好做的好的h游戏下载网站
  • 网站销售如何做业绩互联网营销怎么赚钱
  • 长沙专业外贸建站公司白云营销型网站建设
  • 网站投稿源码西宁网站制作哪家好
  • 嘉兴做网站美工的工作深圳专业做网站的公司哪家好
  • 网站建设了解海南有线微信公众号
  • 家居设计网站模板win2008做的网站打不开
  • 成都网站建设价格网站和网店区别
  • 如何给网站配色自己做简单网站
  • 上海微网站公司做交网站
  • 网站模板 收费网站权重划分
  • 惠州做网站的ppt制作方法
  • 查看网站开发网站建设项目说明书
  • 项目网站有哪些软件项目管理案例教程第四版答案
  • 遵义网站制作和推广跑流量的网站
  • 专业自适应网站建设极速建站东莞制作公司网站的公司
  • 网站推广方式案例做物流网站的多少钱
  • 凡客建站网宜昌网站建设开发费用
  • 汕头企业模板建站男科免费咨询
  • wordpress如何仿站网站建设职业主要做什么
  • 新手建什么网站赚钱企业网站优化包括哪三个方面
  • 网站规划与网页设计总结昆明制作企业网站