spring+cloud_alibaba简单学习二

今天单独研究源码的Sentine(哨兵)项目,源码地址再开传送门

https://github.com/spring-cloud-incubator/spring-cloud-alibaba 

这个子项目和我们用的springboot项目有点不一样,不管,先分析

1永远第一步,看pom.xml文件

前面引入的ali的jar没研究,看不懂,还是熟悉boot的jar,AOP,actuator(监控),autoconfigure(自动配置注解驱动),web(支持web),test(测试),嗯,都是最基本的,没啥多余的注解,代码不多,一个一个分析

2.

注解不熟悉的朋友,下面讲解解惑

@Target:注解的作用目标,此注解出现在1.5JDK版本后,目前的方法有下列几种

        @Target(ElementType.TYPE)   //接口、类、枚举、注解

        @Target(ElementType.FIELD) //字段、枚举的常量

        @Target(ElementType.METHOD) //方法

        @Target(ElementType.PARAMETER) //方法参数

        @Target(ElementType.CONSTRUCTOR)  //构造函数

        @Target(ElementType.LOCAL_VARIABLE)//局部变量

        @Target(ElementType.ANNOTATION_TYPE)//注解

        @Target(ElementType.PACKAGE) ///包

@Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
  • SOURCE:源码级别保留,编译后即丢弃。
  • CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。
  • RUNTIME: 运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用。

@Documented 注解

功能:指明修饰的注解,可以被例如javadoc此类的工具文档化,只负责标记,没有成员取值。

@Inherited注解

功能:允许子类继承父类中的注解。

注意!:

@interface意思是声明一个注解,方法名对应参数名,返回值类型对应参数类型。
3.
BlockClassRegistry类里有concurrenthashmap创建,不熟悉此map的这里也可以跟着熟悉下

此类出现在1.5版本,作为解决hashmap线程不安全的但hashtable和synchronizedMap单线程效率过低的问题,默认并发级别16个,在多线程环境下将写的部分线程上锁,对于读采取的cache做法(读操作可能读到不是最新结果),适应于读操作大于写操作的时候,在写大于等于的时候效率都低于单线程方式,并且不允许null的键值

4.

SentinelAutoConfiguration类又有了几个新的注解

第一个注解

@ConditionalOnProperty(name = "spring.cloud.sentinel.enabled", matchIfMissing = true)

点开源码,查其他文章得到:

public @interface ConditionalOnProperty {
    //数组,获取对应property名称的值,与name不可同时使用。 作用:value单独使用时:当对应property名称的值为false时,该configuration不生效;当对应property名称的值为除false之外的值时,该configuration生效
    String[] value() default {};
 
    //字符串,property名称的前缀,可有可无,可以与name组合使用
    String prefix() default "";
 
    //数组,property完整名称或部分名称(可与prefix组合使用,组成完整的property名称),与value不可同时使用。 作用与value一样
    String[] name() default {};
 
    //可与name、value(name和value不能同时存在)组合使用,比较获取到对应property名称的值与havingValue给定的值是否相同:如果相同,该configuration生效,反之,不生效 
    String havingValue() default "";
 
        //缺少该property时是否可以加载。如果为true,没有该property也会正常加载;反之报错
    boolean matchIfMissing() default false;
 
    //不需要管它
    boolean relaxedNames() default true;

}

第二个注解@EnableConfigurationProperties(SentinelProperties.class)

https://blog.csdn.net/u010502101/article/details/78758330这个有详细的介绍,有空可以自己写的研究,在项目看不到的原因是@SpringBootApplication注解中已经包含了@ComponentScan和@EnableAutoConfiguration注解,所以见的不多

第三个注解

@PostConstruct

1.@PostConstruct说明

     被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。

2.@PreDestroy说明

     被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。(详见下面的程序实践)

第四个注解

@ConditionalOnMissingBean 主要是针对不同环境加载不同的bean类型

有兴趣的同学可以https://blog.csdn.net/xcy1193068639/article/details/81517456这篇博客

第五个注解

@Qualifier,方法和!@autowird一致,不过更明显的是表明采用的是接口哪个具体的实现类,在多实现可以指定
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/qq_40650378/article/details/84377736