【问题标题】:Java specify defaultJava 指定默认值
【发布时间】:2013-04-19 14:45:41
【问题描述】:

我正在尝试创建一个工厂类来在运行时决定需要注入什么。

我创建了一个生产者工厂:

public class AuthorizationServiceFactory {

    @Inject
    private AuthorizationServiceImpl authorizationService;

    @Produces
    public AuthorizationService getService() {
        //decide here
    }
}

授权服务是一个接口:

public interface AuthorizationService {
    //methods here
}

我只有一个接口实现(我计划有更多,但我正在简化以使其工作):

public class AuthorizationServiceImpl implements AuthorizationService {
    //implementation here
}

在我的其他课程中,我尝试注入,如下所示:

@Inject
protected AuthorizationService authorizationService;

它给了我一个Ambiguous dependencies for type [AuthorizationService] with qualifiers [@Any] at injection point blablabla...

我意识到它有两种可能性,生产者工厂和实施本身。我尝试用@Default 注释工厂方法,用@Alternative 注释另一个类,但是我需要在工厂中注入一个 AuthorizationServiceImpl 并且它说它不能用于注入。

Unsatisfied dependencies for type [AuthorizationServiceImpl] with qualifiers [@Default] at injection point blablabla...

有没有办法指定工厂方法是它如何产生接口并且仍然能够注入一个实例以便工厂返回它而不创建一些注释接口?

更多信息,我之所以这样做,是因为我希望工厂方法根据数据库值生成正确的 AuthorizationService。

【问题讨论】:

    标签: jakarta-ee cdi


    【解决方案1】:

    您应该阅读 CDI Alternatives,它可以完全满足您的需求,而无需工厂。您实际上引入了一个“替代”限定符来描述非默认实现并允许某人在 beans.xml 中激活它。

    【讨论】:

    • 我想根据系统切换(在数据库或属性文件中)选择替代方案,而不更改打包的应用程序。
    • 那么也许您需要尝试使用限定符来限定注入 bean 的所有实例。
    猜你喜欢
    • 2012-01-07
    • 2019-11-20
    • 2016-02-22
    • 1970-01-01
    • 2015-04-19
    • 2011-11-24
    • 1970-01-01
    • 2017-05-01
    相关资源
    最近更新 更多