西瓜的随笔

-人类是因为记录才进入文明-

2020/04/13
22:00
technology

@AliasFor使用注意

起初是为了能在netty的处理中能直接注入对象,所以需要将 Channel 交由spring管理。所以有了以下注解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
@Scope
public @interface NettyComponent {

    @AliasFor(
            annotation = Component.class
    )
    String value() default "";

    @AliasFor(
            value = "scopeName",
            annotation = Scope.class
    )
    String scopeName() default ConfigurableBeanFactory.SCOPE_PROTOTYPE;

    @AliasFor(
            value = "proxyMode",
            annotation = Scope.class
    )
    ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;

}

使用 @Component 注解将通道注册为bean,然后通过@Scope 设置bean的生成策略为 ConfigurableBeanFactory.SCOPE_PROTOTYPE,即 每次注入的时候都会创建一个新的实例,以此达到每个连接的通道都不同的目的。

但是使用的时候,发现不管连接几次,还是一个通道,每次返回的都是那一个实例。

最后翻看到@AliasFor源码,看到这样一个注释:

原因找到了,在使用@NettyComponent自定义注解时,为 scopeName() 默认值为 ConfigurableBeanFactory.SCOPE_PROTOTYPE,导致和原注解@Scope的默认值 ” ” 不一致,所以不起作用。

最后直接将 @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

加在使用的Channel 上,问题就解决了。

或者也可以将@NettyComponent中 scopeName() 的默认值去掉,和@Scope保持一致,在使用@NettyComponent注解的时候在手动赋值,也是可以的。

不得不说注释真的很重要啊!!!