今天单独研究源码的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一致,不过更明显的是表明采用的是接口哪个具体的实现类,在多实现可以指定