application详解

本文详细解析了Android应用配置文件中的关键属性,如android:allowBackup、android:icon、android:label、android:theme及android:name等,并介绍了如何利用Application类进行数据传递。

首先去详解application标签,这个标签中的属性有很多,但大部分,我们仅仅只使用几个标签,那么有哪几个标签呢?
android:allowBackup
android:icon
android:label
android:theme
android:name

android:allowBackup它表示是否允许应用程序参与备份。如果将该属性设置为false,则即使备份整个系统,也不会执行这个应用程序的备份操作。而整个系统备份能导致所有应用程序数据通过ADB来保存。 该属性必须是一个布尔值,或为true,或为false。默认值为true。看起来,我们很少去关注它,很多时候去忽视它,但是,因为它,会造成很大的漏洞。因为可以通过ADB命令来获取保存的数据。当我们有一些敏感的数据时,特别是涉及到支付等数据的时候,别人可以通过漏洞就获取到数据了。
这里收集了几个链接可以参考:
http://www.freebuf.com/articles/terminal/60778.html

**那么就需要将其设置为false,但有时候,设置为false后,会与第三方控件产生冲突(大多数第三方控件都选择默认值true),此时需要在application标签中添加
tools:replace=”android:allowBackup”就解决错误问题了**

android:icon在设置手机上的图标
android:label设置手机上的应用程序的标题
android:theme设置应用程序的风格,该设置一般情况下设置为如下:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

android:name设置我们重新定义的Application的名字,Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类。通常我们是不需要指定一个Application的,系统会自动帮我们创建,如果需要创建自己的Application,那也很简单!创建一个类继承Application并在AndroidManifest.xml文件中的application标签中进行注册(只需要给application标签增加name属性,并添加自己的 Application的名字即可)。如下:

在ApplicationManifest.xml文件中配置自定义的Application
<application
        android:name="CustomApplication">
</application>
public class App extends Application{

    private static Context mContext;

    public static Context getContext() {
        return mContext;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        this.mContext = getApplicationContext();
    }
}

这样就定义了自己的Application,Application不仅仅是获取Context,在我们在启动Activity之前就获取到了数据库或者文件中的数据,这个时候,就需要在Application去获取数据,并供Activity调用。

这几个标签是我们经常要用到的。下面的地址有其他相关标签的解释。
http://blog.youkuaiyun.com/small_love/article/details/6534956

接下来做一些Application中的应用

Application数据传递
  一般保存全局数据,同时可以当做数据传递的中间键。Activity与Activity数据传递,传一些Bundle,字符串,需要传对象的时候,需要将对象序列化,现在就可以将一些数据放入Application中,Application中维持一个HashMap,在下一个页面需要时,根据key值取出Value值。
  然一个我写的例子。

public class App extends Application{

    private static HashMap<String,Object> storageData;

    @Override
    public void onCreate() {
        super.onCreate();


        storageData = new HashMap<>();
    }

    /**
     * 存储数据
     * @param key
     * @param value
     */
    public static void putStorageData(String key,Object value){
        storageData.put(key,value);
    }

    /**
     * 取出数据
     * @param key
     * @return
     */
    public static Object getStorageData(String key){
        return storageData.get(key);
    }

    /**
     * 移除数据
     * @param key
     */
    public static void removeStorageData(String key){
        storageData.remove(key);
    }
}

有两个Activity,ActivityA和ActivityB,activity有一个按钮,点击跳转到ActivityB,这个时候,我们将要传递的数据放入Application的storageData中,并将key值传递到ActivityB中,activityB进行获取显示。

public class AMainActivity extends AppCompatActivity{

    private Button nextBT;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);

        nextBT = (Button) findViewById(R.id.next_bt);
        nextBT.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                App.putStorageData("key","success");
                Intent intent = new Intent(AMainActivity.this,BMainActivity.class);
                intent.putExtra("message","key");
                startActivity(intent);
            }
        });
    }
}
public class BMainActivity extends AppCompatActivity{

    private TextView messageTV;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);

        String key = getIntent().getStringExtra("message");

        messageTV = (TextView) findViewById(R.id.message_tv);
        String message = (String) App.getStorageData(key);
        messageTV.setText(message);
        App.removeStorageData(key);//移除数据
    }
}
<think>我们正在讨论SpringBoot中的@SpringBootApplication注解。根据提供的多个引用,这个注解是SpringBoot的核心注解,它简化了配置过程。现在,我将详细解释这个注解的功能、使用场景以及官方文档的相关信息,并参考上述引用内容。首先,@SpringBootApplication注解是一个组合注解,它整合了三个重要注解:-@SpringBootConfiguration:表明该类是一个配置类,用于定义Bean。-@EnableAutoConfiguration:启用SpringBoot的自动配置机制。-@ComponentScan:启动组件扫描,自动发现和注册组件。根据引用[1]、[2]、[3]和[4],我们可以详细说明每个部分:1.**@SpringBootConfiguration**:它是Spring标准注解@Configuration的替代,表示该类为配置类。在SpringBoot应用中,通常将@SpringBootApplication标注的类作为主配置类。2.**@EnableAutoConfiguration**:这是SpringBoot自动配置的核心。它利用Spring的SpringFactoriesLoader机制加载META-INF/spring.factories文件中定义的自动配置类(引用[4])。这些自动配置类会根据类路径中的依赖自动配置Spring应用,例如当类路径中有H2数据库时,自动配置内存数据库。3.**@ComponentScan**:它会扫描当前包及其子包下的@Component、@Service、@Repository、@Controller等注解的类,并将它们注册为SpringBean。**使用场景**:-用于主启动类:在SpringBoot应用的入口类(包含main方法的类)上使用,这是标准做法(引用[3])。-简化配置:无需编写大量XML或Java配置,因为自动配置和组件扫描已经涵盖大部分常见配置。**官方文档**:SpringBoot官方文档(例如:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/)中详细说明了@SpringBootApplication注解的作用。文档指出,它通常用于主类,并且该注解的三个特性都可以独立使用,但在大多数场景下,使用@SpringBootApplication是最方便的。**示例代码**:在SpringBoot应用中,一个典型的启动类如下:```java@SpringBootApplicationpublicclassMyApplication{publicstaticvoidmain(String[]args){SpringApplication.run(MyApplication.class,args);}}```在这个例子中,@SpringBootApplication标注在MyApplication类上,该类作为应用的入口。**其他相关说明**:-自动配置原理:根据引用[4],自动配置是通过SpringFactoriesLoader加载spring.factories文件中定义的自动配置类实现的,这些配置类在启动过程中被处理(在refresh方法中执行)。-测试中的应用:引用[5]提到@SpringBootTest用于集成测试,它也可以基于@SpringBootApplication的配置进行测试环境的初始化。最后,根据系统级指令,我将在下面生成相关问题:</think> ### Spring Boot `@SpringBootApplication` 注解详解 #### 一、核心功能 `@SpringBootApplication` 是 Spring Boot 的核心注解,通过组合三个关键注解实现功能整合: 1. **`@SpringBootConfiguration`** 标记当前类为配置类(继承自 `@Configuration`),用于定义 Spring Bean。 ```java @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface SpringBootConfiguration {} ``` 2. **`@EnableAutoConfiguration`** 启用 Spring Boot 的自动装配机制: - 通过 `SpringFactoriesLoader` 加载 `META-INF/spring.factories` 文件[^4] - 按需加载配置类(如添加 `spring-boot-starter-web` 时自动配置 Tomcat) - 自动条件装配(通过 `@Conditional` 系列注解实现) 3. **`@ComponentScan`** 自动扫描当前包及其子包下的组件(`@Component`, `@Service`, `@Controller` 等)。 #### 二、使用场景 1. **主启动类** 必须标注在包含 `main()` 方法的入口类上: ```java @SpringBootApplication // 核心注解 public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); // 启动Spring容器 } } ``` 2. **简化配置** - 替代传统 Spring 项目的 `@Configuration + @ComponentScan + @Import` - 自动根据依赖启动对应模块(如 Redis、JPA 等) 3. **自定义扩展** ```java @SpringBootApplication( scanBasePackages = "com.example", // 自定义扫描路径 exclude = {DataSourceAutoConfiguration.class} // 排除特定自动配置 ) ``` #### 三、官方文档关键说明 1. **配置优先级** 自动配置在用户自定义 Bean 之后加载[^3],可通过以下方式覆盖: - 自定义 `@Bean` 定义 - 使用 `application.properties` 配置 2. **启动流程** ```mermaid graph TD A[启动 main()] --> B[@SpringBootApplication] B --> C[扫描包内组件] B --> D[加载自动配置] D --> E[读取spring.factories] E --> F[条件装配Bean] ``` 3. **配置继承关系** `@SpringBootApplication` 的元注解层级: ``` └─@SpringBootApplication ├─@SpringBootConfiguration ├─@EnableAutoConfiguration │ └─@AutoConfigurationPackage └─@ComponentScan ``` #### 四、最佳实践 1. **推荐位置** 始终放在根包路径的启动类上[^3],确保扫描范围正确覆盖 2. **调试技巧** 添加 `-Ddebug=true` 启动参数查看自动配置报告: ``` Positive matches: // 已启用的自动配置 WebMvcAutoConfiguration matched Negative matches: // 未启用的自动配置 DataSourceAutoConfiguration: Condition @ConditionalOnClass did not find class 'javax.sql.DataSource' ``` 3. **与测试注解联动** 集成测试时 `@SpringBootTest` 会继承其配置[^5] **官方文档参考**: [Spring Boot 3.2 Documentation - Using @SpringBootApplication](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using.boot.using-springbootapplication-annotation) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值