阅读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)

 

posted @ 2022-07-17 12:13  小大宇  阅读(208)  评论(0编辑  收藏  举报