这是我前天在面试的时候碰到的一个面试题: springboot如何自定义一个starter
首先我们要知道为什么要自定义starter?
以下是我找到较为官方的解释:能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。SpringBoot会自动通过classpath路径下的类发现需要的Bean,并注册进IOC容器。SpringBoot提供了针对日常企业应用研发各种场景的spring-boot-starter依赖模块。所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循“约定大于配置”的理念。
但是在实际应用中呢,我们为什么要用这个东西?
其实从开发流程的角度上讲,很简单,如果我需要开发一个sdk、让别人可以使用,那我总不能让用户引入我的jar包之后再在启动类上添加我sdk需要扫描的bean吧,这就是自定义starter需要解决的一个问题。
正常使用的springboot项目 我们可以通过注解@Service、@Component、@Repository、@Controller来注册bean到ioc容器当中,如果引入一个ip解析的sdk,sdk内的类路径与本地的类路径不一致,那么本地的工程就扫描不到starter内的bean,就不能通过@Autowired或者是@Resource直接使用sdk内部的类方法,那么sdk内部是怎样实现的呢?
以下为sdk内部实现的主要步骤:(以ip解析功能为例,项目工程自己创建)
1、创建需要注册到IOC容器当中的类(如果我们正常创建一个bean实例的话只需要在类上添加@Component即可)
public class IpUtils {
//使用servlet
@Autowired
private HttpServletRequest servletRequest;
@PostConstruct
public void init() {
log.info("该类被实例化 ... ");
log.info("IpUtils被实例化 ... ");
}
public String getIp() {
return servletRequest.getRemoteAddr();
}
}
2、config目录下通过配置完成bean的自动装配
public class IpUtilAutoConfiguration {
@Bean
public IpUtils ipUtils(){
return new IpUtils();
}
}
3、使用spring.factories配置需要加载的自动装配的配置类
在springboot工程下添加MATE-INF目录,然后在该目录下添加spring.factories文件
文件内添加需要自动配置的配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.cloud.ies.provider.config.IpAutoConfiguration,\ com.cloud.ies.provider.config.IpUtilAutoConfiguration
4、此时启动项目,会看到类初始化时打印的日志@PostConstruct
到此,自定义starter完成