一个注解会被启用，是因为容器扫描时对它们做了处理。所有要注册一个注解能力，必须要在容器扫描开始之前完成。


### 1、应用生命周期

开发自定义注解，了解此图非常重要。须要在<mark>**[时机点9]**</mark>之前，完成注解能力注册。

<img src="/img/9d65c1f7bb72475cbe4c34cd44182836.jpg" width="723" />

### 2、合适的可控时机点


* 比如，时机点5

```java
public class DemoApp{
    public void static main(String[] args){
        Solon.start(DemoApp.clas, args, app->{
            //...时机点5
            app.context().beanInterceptorAdd(DemoAop.class, new DemoInterceptor());
        });
    }
}
```

* 比如，时机点6（借用 SolonBuilder，提前注册事件）

```java
public class DemoApp{
    public void static main(String[] args){
        Solon.start(DemoApp.clas, args, app->{
            //...时机点5
            app.onEvent(AppInitEndEvent.class, e->{
                //...时机点6
            });
            
            app.onEvent(AppLoadEndEvent.class, e->{
                //...时间点e
            });
        });
    }
}
```


* 比如，时机点7，通过插件机制。（如果是独立插件，请另参考 [《插件扩展机制》](/article/58)）

定义一个插件

```java
public class DemoPluginImp implements Plugin {
    @Override
    public void start(AppContext context) {
        //..时机点7
        context.beanInterceptorAdd(DemoAop.class, new DemoInterceptor());
    }
}
```

通过插件声明配置，借用[时机点4]声明插件

```
solon.plugin=xxx.xxx.DemoPluginImp
```







