注解行为能力的“四种”划分：

| 注解划分                                               | 能力注册接口               | 示例注解            | 类型扩展    | 能力归属 |
| -------------------------------- | ------------------ | ------------ | ----- | ---- |
| 构建行为注解（加在类上的注解）                   | beanBuilderAdd             | `@Controller`     |  支持    |  IOC  |
| 注入行为注解（加在类、字段、参数上的注解） | beanInjectorAdd            | `@Inject`            |  支持    | IOC   |
| 拦截行为注解（加在函数上的注解）                | beanInterceptorAdd       | `@Transaction`             |  /        | AOP   |
| 提取行为注解（加在函数上的注解）                | beanExtractorAdd         | `@CloudJob`       | /        |  AOP  |




注解行为能力的注册，要在容器扫描之前完成（否则就错过时机了，[应用生命周期](/article/240)可以再看看）。常见的注册时间为：

* 应用启动初始化时

```java
public class App{
    public static void main(String[] args){
        Solon.start(App.class, args, app->{
            //例
            app.context().beanBuilderAdd(...);
        });
    }
} 
```

* 插件启动时

```java
public class PluginImpl implements Plugin{
    @Override
    public void start(AppContext context) {
        //例
        context.beanBuilderAdd(...);
    }
}
```

### 1、定义构建行为能力注解，比如 @Controller

注解类：

```java
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Controller {
}
```

注解类能力注册：

```java
//注册 @Controller 构建器
context.beanBuilderAdd(Controller.class, (clz, bw, anno) -> {
    //内部实现，可参考项目源码
    Solon.app().factories().createLoader(bw).load(Solon.app());
});
```

应用示例：

```java
@Controller
public class DemoController{
    @Mapping("/hello")
    public String hello(){
        return "Hello world!";
    }
}
```

### 2、定义字段或参数注入行为能力的注解，比如 @Inject

注解类：

```java
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Inject {
    String value() default "";
    boolean required() default true;
    boolean autoRefreshed() default false;
}
```

注解类能力注册：

```java
//注册 @Inject 注入器
context.beanInjectorAdd(Inject.class, ((vh, anno) -> {
    //内部实现，可参考项目源码
    beanInject(vh, anno.value(), anno.required(), anno.autoRefreshed());
}));
```

应用示例：

```java
@Component
public class DemoService{
    //注入字段
    @Inject
    UserMapper userMapper;
}

@Configuration
public class DemoConfig{
    //注入到参数。只支持与：@Bean 配合
    @Bean
    public DataSource ds(@Inject("${db1}") HikariDataSource ds){
        return ds;
    }
}
```

### 3、定义函数拦截行为能力的注解，比如 @Transaction

注解类：

```java
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Tran {
    TranPolicy policy() default TranPolicy.required;
    TranIsolation isolation() default TranIsolation.unspecified;
    boolean readOnly() default false;
}
```

注解类能力注册：

```java
 //内部实现，可参考项目源码
context.beanInterceptorAdd(Tran.class, new TranInterceptor(), 120);
```

应用示例：

```java 
@Component
public class DemoService{
    //注入字段
    @Inject
    UserMapper userMapper;
    
    @Transaction
    public void addUser(User user){
        userMapper.add(user);
    }
}

```

### 4、定义函数提取行为能力的注解，比如：@CloudJob

注解类：

```java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CloudJob {
    @Alias("name")
    String value() default "";
    @Alias("value")
    String name() default "";
    String cron7x() default "";
    String description() default "";
}
```

注解类能力注册：

```java
 //内部实现，可参考项目源码
context.beanExtractorAdd(CloudJob.class, CloudJobExtractor.instance);
```

应用示例：

```java
@Component
public class JobController{
    @CloudJob(name="user.stat", cron7x="0 0/1 * * * ? *")
    public void userStatJob(){
        //...
    }
}
```

