最近在开发的时候,由于对init方法的调用时机的误解,导致实例初始化时retry字段未未赋值,为0,直接造成线上某接口在调用其他服务失败时重试机制失效而导致接口超时,还好没有酿成大祸。本人也是吓出一身冷汗。所以此次些这边文章的目的也是为了归纳总结开发中的知识盲点,分享给大家,希望小伙伴们能引以为鉴。
我的误区是实例初始化后会自动调用init方法,但是在java中并没有规定在调用了构造方法后会自动调用init方法,是我没有记忆牢固,把知识混淆了。其实这个功能是有spring框架的@Bean注解提供的,在使用@Bean注解时配置initMethod属性为init即可(我使用了@Bean,但是没有初始化initMethod值,悲剧-_-!),那么下面我用一个例子来演示下该情况。
PS:@Bean可以用在方法上,但不能用在类上
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
@AliasFor("name")
String[] value() default {};
@AliasFor("value")
String[] name() default {};
Autowire autowire() default Autowire.NO;
String initMethod