Confluence插件改造:能否用Setter注入替代构造注入OutboundWhitelist?
Confluence插件OutboundWhitelist注入替代方案
在Confluence的OSGi插件环境中,构造注入@ComponentImport的OutboundWhitelist并非唯一可行方案,你可以通过以下方式实现Setter或字段注入,避免修改构造函数破坏现有代码:
方案1:OSGi @Reference注解实现Setter注入
Confluence基于OSGi容器,使用OSGi原生的@Reference注解可直接实现Setter注入,这是最适配的替代方案,代码示例如下:
import org.osgi.service.component.annotations.Reference; private OutboundWhitelist outboundWhitelist; @Reference public void setOutboundWhitelist(OutboundWhitelist outboundWhitelist) { this.outboundWhitelist = outboundWhitelist; }
该注解由OSGi容器自动处理,会在组件实例化后完成依赖注入,无需改动原有构造逻辑。
方案2:OSGi @Reference字段注入
如果OutboundWhitelist字段无需声明为final,也可直接在字段上使用@Reference注解:
import org.osgi.service.component.annotations.Reference; @Reference private OutboundWhitelist outboundWhitelist;
关键说明
- 你之前使用
@Inject、@Autowired无效的原因:Confluence插件默认用OSGi容器管理组件,而非Spring容器,Spring的依赖注入注解在原生OSGi环境下不生效。 - 确保你的插件类已标注OSGi的
@Component注解(来自org.osgi.service.component.annotations包),否则@Reference注解不会被容器识别处理。
【需避免的构造注入代码】
private final OutboundWhitelist outboundWhitelist; public YourMacro(@ComponentImport OutboundWhitelist outboundWhitelist) { this.outboundWhitelist = outboundWhitelist; }
【调整后的可行Setter注入代码】
import org.osgi.service.component.annotations.Reference; private OutboundWhitelist outboundWhitelist; @Reference public void setOutboundWhitelist(OutboundWhitelist ow) { this.outboundWhitelist = ow; }
内容的提问来源于stack exchange,提问作者user21903432
相关产品推荐
相关产品推荐

