2020/04/13
22:00
起初是为了能在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注解的时候在手动赋值,也是可以的。
不得不说注释真的很重要啊!!!