一个应用程序从 “启动” 到最后 “停止”，这一整个过程即为“应用生命周期”。“应用生命周期”中的关键点，可称为“时机点”。

SolonApp 的应用生命周期如下图所示（像个机器人）。其中，时机点包括有：一个初始化函数时机点 + 六个应用事件时机点 + 三个插件生命时机点 + 两个容器生命时机点：

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


重要提醒：

* 启动过程完成后，项目才能正常运行（启动过程中，不能把线程卡死了）
* AppBeanLoadEndEvent 之前的事件，需要启动前完成订阅！！！（否则，时机错过了）

### 1、一个初始化函数时机点

```java
import org.noear.solon.Solon;
import org.noear.solon.annotation.SolonMain;

@SolonMain
public class App{
    public static void main(String[] args){
        Solon.start(App.class, args, (app)->{
            //应用初始化时机点
        });
    } 
}
```

### 2、六个应用事件时机点

#### 事件说明

| 事件         | 说明          |  备注 |
| -------- | -------- | -------- | 
| 6.AppInitEndEvent     | 应用初始化完成事件     |  只支持手动订阅 |
| 8.AppPluginLoadEndEvent     | 应用插件加载完成事件     |  只支持手动订阅  |
| b.AppBeanLoadEndEvent     | 应用Bean加载完成事件（即扫描完成）     |   |
| e.AppLoadEndEvent     | 应用加载完成事件（即启动完成）     |   |
| | ::运行 |   |
| g.AppPrestopEndEvent     | 应用预停止事件     |   |
| j.AppStopEndEvent     | 应用停止事件     |   |



#### 事件订阅示例 

* AppInitEndEvent (时机点“b”之前的事件需要手动订阅)，还有些在类扫描之前发出的事件，也需要提前订阅

```java
import org.noear.solon.Solon;
import org.noear.solon.annotation.SolonMain;
import org.noear.solon.core.event.AppInitEndEvent;

@SolonMain
public class App{
    public static void main(String[] args){
       Solon.start(App.class, args, app->{
            app.onEvent(AppInitEndEvent.class, e->{
                //...
            });
        });
    }
}
```

* AppLoadEndEvent

```java
import org.noear.solon.annotation.Component;
import org.noear.solon.core.event.AppLoadEndEvent;
import org.noear.solon.core.event.EventListener;

@Component
public class  AppLoadEndEventListener implements EventListener<AppLoadEndEvent>{
    @Override
    public void onEvent(AppLoadEndEvent event) throws Throwable {
        //event.app(); //获取应用对象
    }
}
```

* AppStopEndEvent，v2.1.0 后支持

```java
import org.noear.solon.annotation.Component;
import org.noear.solon.core.event.AppStopEndEvent;
import org.noear.solon.core.event.EventListener;

@Component
public class  AppStopEndEventListener implements EventListener<AppStopEndEvent>{
    @Override
    public void onEvent(AppStopEndEvent event) throws Throwable {
        //event.app(); //获取应用对象
    }
}
```

### 3、三个插件生命时机点

插件的本质，即在应用生命周期中获得关键执行时机的接口。从而有效获得应用扩展能力。

* 插件接口 Plugin

```java
import org.noear.solon.core.AppContext;

public interface Plugin {
    void start(AppContext context) throws Throwable;
    default void prestop() throws Throwable{}
    default void stop() throws Throwable{}
}
```

* 执行时机


| 接口 | 执行时机 | 说明 |
| -------- | -------- | -------- |
| 7.start     | 在应用初始化完成后执行     | 启动     |
| f.prestop     | 在 ::stop 前执行     | 预停止     |
| h.stop     | 在 Solon::stop 时执行     | 停止（启用安全停止时，prestop 后等几秒再执行 stop）     |


### 4、两个容器生命时机点

| 接口 | 执行时机 | 说明 |
| -------- | -------- | -------- |
| d.start     | 在扫描完成之后执行     | 启动     |
| i.stop     | 在 Solon::stop 时执行，在插件（h.stop）后执行     | 停止     |





