阅读COLA源代码------新掌握的知识(持续学习)
可乐框架源代码地址:https://github.com/alibaba/COLA
* DTO是顶层父类,它有Command与Response两种
* Command是一种特殊的DTO,Query是一种特殊的Comand。
* Response分为SingleResponse、PageResponse
* logback日志。root节点用于默认指定级别,大于等于某级别的时候才会往Console或者File中输出日志。logger节点使用additivity=false脱离root节点,自己指定appender-ref往哪里输出,及其输出的界别。
* logback日志。ROOT配置的是全局,对全局生效。如果配置的是INFO,那么对于所有类,输出的日志级别只要大于INFO即会输出到appender中。自定义logger的可重新定义级别阙值。
* 依赖管理:<depencyManagement> 只是声明依赖,并不实现引入。因此子项目需要显示声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的。只有在子项目中写了该依赖,并且没有指定具体的版本,才会从父项目中继承该,并且version和scope都读取自父pom。如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
* @Entity注解在定义的时候,使用@Component注解加入Spring容器。并且如果指定@Scope(value="ConfigurableBeanFactory.SCOPE_PROTOTYPE"),每次创建的@Bean都是新的实例。
* 单元测试中,使用@SpringBootApplication可以模拟Spring容器环境。
* META-INF/spring.factories下配置某个Configration类。这个类下有ConditionalOnMissingBean来创建某个对象。以后引入这个starter的时候,就能有这个功能了。
* SpringBoot可以使用META-INF/spring.factories中的EnableAutoConfiguration开启@Configuration,并使用@ConditionalOnMissingBean初始化对象。
* SpringBoot如果不使用spring.factories文件初始化starter,那么可以使用@SpringBootApplication(scanBasePackages = { 包 } )加入Spring容器。
* Spring.getBean(name) Spring.getBean(Clz) Spring.getBean(name,Clz)
* @EnableAspectJAutoProxy 开启AOP注解。配置在@Configuration类上。
* @SpringBootTest单元测试,上面的classes配置,用于配置指定的环境。
(1)如果单元测试中有一个类是Application.class,且上面的注解是@SpringBootApplication,说明这个类模拟的是一个完整Spring容器运行环境。
(2)如果是零零散散的几个类,那么就把这几个类加入到Spring测试容器中。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
//@SpringBootTest(classes = {Demo.class,CatchLogAutoConfiguration.class})
public class CatchLogTest ...
@Resource
private Demo demo;
* AOP切面不要影响主流程的执行,使用try catch 并使用log.error记录错误日志
* 如何获取父类的Class类型
Student.class.getGenericSuperclass() cn.test.Person<cn.test.Test>
Student.class.getSuperclass() class cn.test.Person
* COLA异常处理流程
REQUEST :打印方法名与参数
EXCEPTION:如果方法的返回值是Response的直接子类(getGenericSuperclass)或者是Response,那么就处理成失败的Response。否则,返回null。
RESPONSE:打印返回JSON数据和花费毫秒
* 扩展点
流程
注册
项目启动,扫描所有Extension注解对象,解析该Bean实现的接口名称, 以及注解上可封装成BizScenario【BizId+UseCase+Scenario】对象的数据
ExtensionCoordinate持有ExtensionPointName(ExtPt接口名称,继承ExtensionPointI) 与bizScenarioIdentity(业务用例的实例标识)。
与该KEY(ExtensionCoordinate)匹配的VALUE正是使用了该@Extension注解的ExtensionPointI实例对象
所有的ExtensionCoordinate与对应的ExtPt对象,全都存放在ExtensionRepository中的Map《ExtensionCoordinate,ExtentionPointI》中
定位
ExtensionExecutor通过DTO中的BizScenario与ExtPt接口名称,能在ExtensionRepository中找到对应的 使用了@Extension注解的ExtensionPointI实例对象
调用ExtensionExcutor的execute方法,通过lamda表达式,执行该@Extension对应的ExtensionPointI实例对象的方法
* ThreadPoolTaskExecutor 环境:使用@EnableAsync启动异步后,使用@Async(某线程池)。注意点:如果某个方法上没有@Async,调用了@Async的方法,这不会生效!想异步执行,需要直接调用@Async修饰的方法。
* 校验参数是List<SomeObject>这种情况的时候,在类上加上@Validated注解,在参数上加上@Valid注解,就能够校验参数是List<SomeObject>这种情况,SomeObject中定义例如@NotNull或者@NotBlank注解。
* Maven的dependency#scope属性。默认compile编译,引入它们并且打包也会带上。 provided:仅仅用于编译,打包的时候不带上,需要WEB环境导入该JAR.
* Maven的depencyManagement标签,这里不能随便声明版本号。一旦第三方JAR使用了该依赖的JAR,第三方JAR会优先使用depencyManagement里声明的版本号,请小心指明!
* MyBatisPlus配置文件,配置在yml文件中,可以配置Mapper.xml的位置。而@MapperScan注解扫描的是Java的Mapper类。一个是XML,一个是Java,注意区别。
* 父项目中pom中得depencyManagement标签中的JAR,子项目在用了后,会自动去父项目中找到版本号。但是第三方工程再调用这个子项目的时候,会找不到版本号。
* 对象的属性既可以来自于配置文件,又可以来自于Java。例如 (若属性冲突,以配置文件为准)
@Data
public class UserDomain {
private String username;
private String password;
private Integer age;
}
@Configuration
public class UserConfiguration ...
@Bean
@ConfigurationProperties("com.alibaba.cola.user")
public UserDomain userDomain(){
UserDomain userDomain = new UserDomain();
userDomain.setAge(25);
return userDomain;
}
}
##applicaition.yml
com:
alibaba:
cola:
user:
username: jay
password: root
## 实际Spring容器中的UserDomain:
UserDomain(username=jay, password=root, age=25)