= 平台扩展
== 添加自定义应用启动器
所谓应用启动器就是指当应用启动成功后需要进行的附加操作，例如系统初始化检查等，具体实现步骤如下:

=== 编写启动器类
[source,java]
----
package io.sc.platform.security.jpa.initializer;

import io.sc.platform.core.initializer.ApplicationInitializer;
import org.springframework.context.ApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

public class AdministratorRoleAndUserInitializer implements ApplicationInitializer { <1>
	private JdbcTemplate jdbcTemplate;

	@Override
	public void init(ApplicationContext applicationContext) {                       <2>
		this.jdbcTemplate =applicationContext.getBean(JdbcTemplate.class);
	}

	@Override
	public void execute() throws Exception {                                        <3>

	}
}
----
<1> 启动器类必须实现 ApplicationInitializer 接口
<2> 启动器初始化，由平台自动调用，并将 spring application context 作为参数传入
<3> 启动器初始化的具体操作

=== 添加 SPI 服务实现文件
image::platform-extension/001.png[,80%]

== 添加自定义安装项
所谓安装项就是指当应用启动安装程序后，安装程序向导中的某一步，具体实现步骤如下:

=== 编写安装项类
[source,java]
----
package io.sc.platform.security.jpa.installer;

import io.sc.platform.installer.InstallerItem;
import io.sc.platform.installer.InstallerProgress;
import io.sc.platform.jdbc.service.DatasourceService;
import org.springframework.context.ApplicationContext;
import org.springframework.core.Ordered;

import java.util.*;

public class AdministratorInstallerItem implements InstallerItem { <1>
	@Override
	public int getOrder() { return 2000; }      <2>

	@Override
	public String getTemplateLoaction() {
		return "io/sc/platform/security/jpa/view/installer_administrator.html";
	}

	@Override
	public void install(Map<String, String> config, InstallerProgress installerProgress, ApplicationContext applicationContext) throws Exception {
		......  <3>
	}
}
----
<1> 每个安装器都需要实现 InstallerItem 接口
<2> 返回安装器的顺序
<3> 具体安装时的操作

=== 添加 SPI 服务实现文件
image::platform-extension/002.png[,80%]