【问题标题】:Equivalent to @Inject @Active of CDI in Spring相当于Spring中CDI的@Inject @Active
【发布时间】:2017-09-01 07:48:02
【问题描述】:

使用 CDI,您可以执行以下操作:

@Inject @Active
UserFactory userFactory;

代码的意思是:我想要一个只返回活跃用户的 userFactory。

Spring的等价方式是什么?我做了我的研究,但我发现最近的是 Spring 配置文件。它看起来像:

@Autowired @Profiles("active")
UserFactory userFactory;

问题是只能同时激活一个配置文件,对吗?如果是这样,它在我看来更像是 CDI 中的 @Alternative,它并没有解决我提到的问题。

【问题讨论】:

  • 也许你正在寻找@Qualifier
  • 你是什么意思 userFactory 应该只返回活动用户列表?活动字段是某个数据库中的列吗?还是在java运行时存储在内存中?
  • 您可以拥有任意数量的活动配置文件。但是您可能想查看@Qualifier(我怀疑@Active 也是如此)。
  • @yaswanth 是的,这就是重点。接口是工厂。当然,UserFactory 会产生用户。但是有很多种用户:活跃用户,禁用用户,等等等等。 Rest 服务不关心如何获取这些用户。其余服务也不关心应该传递哪些参数。如果我必须写 UserFactory.getFactory("active"),我会不高兴。通过使用注解,Spring 容器将为我选择实现。也许它会选择 new GetActiveUserFromDBFactory() 或 new GetActiveUserFromCache()。谁在乎?

标签: java spring cdi


【解决方案1】:

Spring 也可以使用限定符(用@Qualifier 定义)。可能@Active 已经是@Qualifier,因此可用于确定使用哪一个。

@Component
@Active
public ActiveUserFactory implements UserFactory { ... }

然后在你想使用这个的地方再次添加@Active 限定符。

@Autowired
@Active
private UserFactory userFactory;

如果您不想创建注释,您也可以使用普通的 @Qualifer("active") 例如。

如需更详细的解释,您可能需要查看the reference guide

【讨论】:

  • 也许 @Qualifier("active") 是更正确的 Spring 方式。我只是想补充一点。
  • 不,您可以使用@Qualifier 创建限定符注释。参考指南中也对此进行了说明(我会将链接添加到文档中)。
猜你喜欢
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 2017-11-11
  • 2014-12-20
  • 2017-11-08
  • 2018-09-28
  • 1970-01-01
相关资源
最近更新 更多