# 注解配置 > 核心`1.8.0`增加了注解配置的形式,自此,已经基本趋向于摒弃代码配置的形式了。 注解配置存在两个主要注解:`@SimpleRobotApplication` 和 `@SimpleRobotConfiguration` ## **@SimpleRobotApplication** 这是最主要的注解,使用这个注解来标记一个类作为启动器的起始类,比如这样: ```java @SimpleRobotApplication public class Test1 { // 啥也没有也无所谓 } ``` 此注解存在两个参数: | 参数名 | 类型 | 描述 | 默认值 | | --- | --- | --- | --- | | resources | String | 配置文件所在的resources文件路径 | "/simple-robot-conf.properties" | | application | Class<? extends Application> | 所使用的真正启动器所处的class位置。如果指定了Application接口的类型本身,则说明直接使用当前标注了这个注解的类来生成代理。(此时不需要实现接口) | Application.class | 参数`resources`可以指定一个配置文件的文件相对路径,而关于配置文件的一些参数映射请参考[文件配置](./%E6%96%87%E4%BB%B6%E9%85%8D%E7%BD%AE.md) 。 参数`application`可以指定一个已经实现了`Application`接口,或者组件自行定义的一些`xxxApp`接口的启动器类。如果没有指定,则会默认使用当前类来进行启动。 ## **@SimpleRobotConfiguration** 此注解可以用于启动器类上,来代替代码配置与一部分文件配置。 此注解仅存在一个参数: | 参数名 | 类型 | 描述 | 默认值 | | --- | --- | --- | --- | | value | @ConfigurationProperty\[\] | 额外的配置信息。此信息会覆盖文件读取到的信息。 | {} | 上述参数类型中的`@ConfigurationProperty` 也是一个注解类型,此注解类型存在两个必填参数: ### **@ConfigurationProperty** | 参数名 | 类型 | 描述 | | --- | --- | --- | | key | String | 配置键 | | value | String | 配置值 | 没错,这个注解的参数形式就是常见的`key-value`格式,此注解的`key`与`value`的参数与格式与文件配置一致。 它们是这么用的: ```java @SimpleRobotApplication(resources = "/conf.properties") @SimpleRobotConfiguration({ @ConfigurationProperty(key = "core.bots", value = ":http://47.100.38.59:8877"), @ConfigurationProperty(key = "core.logLevel", value = "DEBUG"), @ConfigurationProperty(key = "core.language", value = "zh_CN") }) public class Test1 { // TODO something.. } ``` 上述示例中,其结果相当于读取一个内容如下的配置文件: ```properties core.bots=:http://47.100.38.59:8877 core.logLevel=DEBUG core.language=zh_CN ``` ## **使用** 既然知道了注解的含义,那么写好了之后,怎么使用他们呢? 很简单,以前启动项目是使用的`XxxxApplication.run(new Test1())` 的形式,传入一个实例对象进行启动,而此时只需要将这个实例对象替换为`class`对象即可。举个例子: >[success] 使用`CQ HTTP API`组件进行举例 ```java @SimpleRobotApplication(resources = "/conf.properties") @SimpleRobotConfiguration({ @ConfigurationProperty(key = "core.bots", value = ":http://47.100.38.59:8877"), @ConfigurationProperty(key = "core.logLevel", value = "DEBUG"), @ConfigurationProperty(key = "core.language", value = "zh_CN") }) public class Test1 { public static void main(String[] args) throws NoSuchMethodException { // 创建CQ HTTP API组件的项目启动器实例 CoolQHttpApplication application = new CoolQHttpApplication(); // 启动... application.run(Test1.class, args); } } ``` ## 判定逻辑 此处介绍注解启动的具体逻辑,以便理解并更好的使用。 当你使用了`XxxxxApplication.run(XXX.class, args)` 启动之后,其具体的判定逻辑如下: ### 1. **此类是否存在 `@SimpleRobotApplication` 注解?** #### 1A. **不存在** 那么这个类必须是一个能够实例化的,并且实现了旧版本的`XxxApp`接口的类,并将其实例化,然后就会像以前一样,等同于`run(new Xxx(), args)` #### 1B. **存在** 如果存在,则会获取`@SimpleRobotApplication`并判断是否需要读取配置文件,然后判断是否存在`application`参数,并指定一个真正的启动器所在类。(如果没有则指定当前类) 再判断是否存在`@SimpleRobotConfiguration`注解,如果存在,则会在文件配置读取后覆盖重复的数据。 再判断当前类或者`application`参数中提到的类是否是`Application<CONFIG>`接口的子类,如果是,则启动过程中依旧会执行其`before`和`after`。如果不是则不会获取实例。