解决 BootstrapApplication 问题

本文介绍了解决在Android Studio中遇到的应用崩溃问题——Unable to instantiate application的方法。通过禁用InstantRun功能,可以避免一些由该功能引起的不可预知的错误。

在 android studio 中 有时候会遇到这样的问题:

Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication 导致无法运行的解决方法

打开studio的setting 然后

Preferences -> Build, Execution, Deployment -> Instant Run -> Enable Instant Run

把勾勾去掉,就可以了

有人可能会问 Instant Run 是什么?

Android Studio 2 Preview推出了,其中一个革命性的功能就是Instant Run(即时运行)!新的即时运行功能可以让开发者像写html网页一样写Android原生代码,能做到一边修改代码,一边在模拟器或者实际设备上看到 修改代码后的结果。这个功能真心强大,可以做到让你的restart 秒开。有利肯定也有不足。(尽管Instant Run尽可能地想要变得更智能,但是它也没有时光倒流的能力。比如hot swap或者warm swap是根本不会重启程序的,而如果你修改了一些只有在程序启动的时候才会初始化的代码,那么Instant Run对此也是无能为力的,因为修改的代码根本就没有执行到。)所以这就是 问题关键所在了。

这个功能目前 还有些许bug,所以在跑的时候要小心一点。所以如果需要重新完全来跑整个项目的话,把这个功能关闭。这样才会避免一些不可预料莫名其妙的错误。

<think>我们之前已经讨论过bootstrap.yml和application.yml的区别和用途,但为了遵循用户的要求,我将再次详细解释,并按照要求的格式提供解答。 ### Bootstrap.yml 与 Application.yml 详解 在Spring Boot和Spring Cloud应用程序中,`bootstrap.yml`(或`bootstrap.properties`)和`application.yml`(或`application.properties`)都是配置文件,但它们有不同的用途和加载顺序。 #### 1. **加载顺序和上下文** - **bootstrap.yml**:在应用程序启动时首先加载。它用于配置引导阶段的属性,这些属性用于创建`Bootstrap Context`(父上下文),然后才加载主应用程序上下文。这个文件通常用于配置应用名、配置中心(如Spring Cloud Config)的连接信息、加密/解密信息等。 - **application.yml**:在`bootstrap.yml`之后加载,用于配置应用程序上下文的属性。这些属性包括数据源、服务器端口、Spring MVC配置等应用程序特定的配置。 #### 2. **典型使用场景** - **bootstrap.yml**:当你使用Spring Cloud Config来从远程配置服务器获取配置时,你需要在`bootstrap.yml`中指定配置服务器的位置(URI)和应用程序的名称(用于从配置服务器获取对应配置)。此外,如果你使用Spring Cloud Vault或Spring Cloud Consul等,相关的连接信息也放在这里。 - **application.yml**:用于配置应用程序级别的属性,这些属性不需要在引导阶段使用,例如数据库连接、Thymeleaf模板设置、日志配置等。 #### 3. **配置示例** **bootstrap.yml 示例** ```yaml spring: application: name: my-application # 应用名称,用于从配置中心获取配置 cloud: config: uri: http://config-server:8888 # 配置中心地址 fail-fast: true # 如果连接配置中心失败,则启动失败 retry: initial-interval: 1000 # 重试初始间隔(毫秒) max-attempts: 10 # 最大重试次数 vault: host: vault.example.com port: 8200 scheme: https authentication: TOKEN token: my-token ``` **application.yml 示例** ```yaml server: port: 8080 # 应用端口 spring: datasource: url: jdbc:mysql://localhost:3306/mydb username: dbuser password: dbpassword jpa: database-platform: org.hibernate.dialect.MySQL5InnoDBDialect show-sql: true hibernate: ddl-auto: update myapp: feature: enabled: true ``` #### 4. **重要注意事项** - **优先级**:`bootstrap.yml`的优先级高于`application.yml`,因此如果两个文件中存在相同属性,`bootstrap.yml`中的值将被使用(除非被覆盖)。 - **环境特定文件**:两者都支持环境特定配置,如`bootstrap-dev.yml`、`application-prod.yml`等。这些文件会根据激活的profile被加载。 - **Spring Boot 2.4+**:在Spring Boot 2.4中,对配置文件的加载机制进行了更改。为了继续使用`bootstrap.yml`,你需要添加`spring-cloud-starter-bootstrap`依赖。 - **属性覆盖**:在`bootstrap.yml`中定义的属性可以被系统属性、环境变量或命令行参数覆盖。 #### 5. **代码示例:使用配置属性** 以下是一个简单的Spring Boot组件,它从配置中注入属性: ```java @Component public class MyAppConfig { @Value("${myapp.feature.enabled}") private boolean featureEnabled; @Value("${spring.application.name}") private String appName; // Getters and setters } ``` #### 6. **如何激活bootstrap配置** 在Spring Boot 2.4+中,默认不再加载`bootstrap.yml`。你需要添加以下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> <version>3.1.3</version> <!-- 使用与Spring Cloud版本兼容的版本 --> </dependency> ``` #### 7. **配置中心动态刷新** 如果你使用配置中心,并希望在不重启应用的情况下更新配置,可以使用`@RefreshScope`: ```java @RestController @RefreshScope public class MyController { @Value("${myapp.feature.enabled}") private boolean featureEnabled; @GetMapping("/feature") public String feature() { return featureEnabled ? "Feature is enabled" : "Feature is disabled"; } } ``` ### 总结 - `bootstrap.yml`用于引导阶段的配置,特别是连接配置中心的配置。 - `application.yml`用于应用程序自身的配置。 - 在Spring Cloud应用中,`bootstrap.yml`是必需的,用于连接配置中心获取配置。 §§相关问题§§: 1. 在Spring Boot 2.4+中,如何启用bootstrap配置? 2. 如何实现配置的动态刷新(无需重启应用)? 3. 在Spring Cloud Config中,如何配置多个配置中心地址? 4. 如何在不同环境(开发、测试、生产)中使用不同的配置文件?</think>### Bootstrap.yml 与 Application.yml 详解 在 Spring Boot/Spring Cloud 应用中,`bootstrap.yml` 和 `application.yml` 都是核心配置文件,但它们在应用启动过程中扮演不同的角色。 #### 1. **核心区别对比** | 特性 | bootstrap.yml | application.yml | |----------------------|-----------------------------------|----------------------------------| | **加载顺序** | 先加载(父上下文) | 后加载(主应用上下文) | | **主要用途** | 引导阶段配置(如配置中心连接) | 应用自身配置 | | **上下文** | Bootstrap Context | Application Context | | **优先级** | 更高 | 较低 | | **Spring Cloud 依赖**| 需要 `spring-cloud-context` | 内置支持 | | **典型配置项** | 配置中心地址、加密信息 | 数据源、服务器端口、业务配置 | | **生命周期** | 应用启动初期 | 应用运行期间 | | **配置文件覆盖** | 不能被 application.yml 覆盖 | 可被外部配置覆盖 | #### 2. **配置示例与解释** **bootstrap.yml**(引导配置): ```yaml spring: application: name: inventory-service # 注册到配置中心的服务名 cloud: config: uri: http://config-server:8888 # 配置中心地址 fail-fast: true # 快速失败 retry: initial-interval: 1000 max-attempts: 10 vault: host: vault.example.com port: 8200 token: s.1234567890 # Vault 认证令牌 profiles: active: dev # 激活的开发环境 ``` **application.yml**(应用配置): ```yaml server: port: 8080 # 应用端口 servlet: context-path: /inventory spring: datasource: url: jdbc:postgresql://db-host:5432/inventory_db username: ${DB_USER} password: ${DB_PASSWORD} jpa: hibernate: ddl-auto: validate show-sql: true # 自定义业务配置 inventory: low-stock-threshold: 50 reorder-quantity: 100 ``` #### 3. **加载机制与执行流程** ```mermaid graph TD A[启动应用] --> B[加载 bootstrap.yml] B --> C[创建 Bootstrap Context] C --> D[连接配置中心] D --> E[获取远程配置] E --> F[创建 Application Context] F --> G[加载 application.yml] G --> H[合并配置] H --> I[启动应用] ``` #### 4. **最佳实践与代码示例** **动态配置刷新控制器**: ```java @RestController @RefreshScope // 启用配置刷新 public class InventoryController { @Value("${inventory.low-stock-threshold}") private int lowStockThreshold; @GetMapping("/threshold") public String getThreshold() { return "Current low stock threshold: " + lowStockThreshold; } @PostMapping("/refresh") public void refreshConfig() { // 手动触发配置刷新 ContextRefresher refresher = applicationContext.getBean(ContextRefresher.class); refresher.refresh(); } } ``` **配置优先级验证测试**: ```java @SpringBootTest public class ConfigPriorityTest { @Value("${config.priority.test}") private String testValue; @Test void testConfigPriority() { // 优先级顺序:命令行参数 > 系统属性 > 环境变量 > application.yml > bootstrap.yml assertThat(testValue).isEqualTo("command-line-wins"); } } ``` #### 5. **多环境配置管理** **目录结构**: ``` src/main/resources/ ├── bootstrap.yml ├── bootstrap-dev.yml ├── bootstrap-prod.yml ├── application.yml ├── application-dev.yml └── application-prod.yml ``` **激活特定环境**: ```bash # 启动开发环境 java -jar app.jar --spring.profiles.active=dev # 启动生产环境 java -jar app.jar --spring.profiles.active=prod ``` #### 6. **常见问题解决方案** **问题1**:Spring Boot 2.4+ 不加载 bootstrap.yml **解决方案**:添加依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> <version>3.1.3</version> </dependency> ``` **问题2**:配置中心连接失败 **解决方案**:添加重试机制: ```yaml spring: cloud: config: retry: initial-interval: 2000 max-interval: 10000 max-attempts: 10 multiplier: 1.5 ``` **问题3**:配置值覆盖不生效 **解决方案**:使用正确的优先级顺序: ```bash # 命令行参数 > application.yml > bootstrap.yml java -jar app.jar --server.port=9090 ``` #### 7. **配置验证工具** ```bash # 查看所有配置源 curl localhost:8080/actuator/configprops # 查看环境变量 curl localhost:8080/actuator/env # 查看配置刷新历史 curl localhost:8080/actuator/refresh ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值