1.SpringBoot启动器原理
我们新建一个空的spring boot项目,他都是由启动类上标注了这个注解@SpringBootApplication
我们猜想为什么他就能启动呢?我们点进@SpringBootApplication注解,可以看到
@EnableAutoConfiguration
点进AutoConfigurationImportSelector.class
总结:
发现 META-INF/spring.factories文件中,都是配置类
2.自定义starter
因此,我们仿照上天原理,自己写一个,架构如图,
场景:做个日志配置starter,只要在加了注解(@LogAnnotation())就能记录日志。
第一步,新建一个spring boot项目,取名为:spring-boot-starter-log,这是大致的项目结构图
第二步,
新建注解LogAnnotation类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {
String module() default "test";
}
第三步,新建配置类
@Configuration
@Import(LogSelector.class)
public class LogAutoConfiguration {
@Bean
public Object getObj(){
System.out.println("自动生成Object对象到spring bean工厂");
return new Object();
}
}
第四步,新建文件,spring.factories,里面写第二步新建配置类信息
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.hsq.log.LogAutoConfiguration
第五步:文件LogAop类
@Aspect
@Order(-1)
public class LogAop {
@Autowired
@Qualifier("getObj")
private Object getObj;
@Around("@annotation(la)")
public Object logRecord(ProceedingJoinPoint proceedingJoinPoint, LogAnnotation la) {
Long start = System.currentTimeMillis();
try {
Object proceed = proceedingJoinPoint.proceed();
System.out.println(la.module() + "模块的" +
proceedingJoinPoint.getSignature().getName() +
"方法,执行的耗时时间为:" +
(System.currentTimeMillis() - start) + "ms");
System.out.println(getObj);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
}
第六步,新建LogSelector类
public class LogSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{
"com.hsq.log.aop.LogAop"
};
}
}
到这已经完成启动stater启动的配置了
测试,新建springboot-demo项目,maven中导入web,导入spring-boot-starter-log
在controller中
@RestController
@RequestMapping("/hello")
public class MyTestController {
@LogAnnotation()
@RequestMapping("/test")
public String getTest() throws InterruptedException {
Thread.sleep(2000);
return "我正在测试自定义springboot的starter的启动器";
}
@LogAnnotation()
@RequestMapping("aa")
public String getString() {
return "aaa";
}
}
访问url,查看控制台信息。