禁止通过访问修饰符注入

时间:2017-10-13 12:51:38

标签: java cdi visibility code-injection

考虑一个门面

public interface LoggingFacade {
    void log(String logMessage);
}

使用相应的bean

public class LoggingBean implements LoggingFacade {
    @Inject
    private LoggingService loggingService;

    @Override
    public void log(String logMessage) {
        loggingService.log(logMessage);
    }
}

public class LoggingService {
    public void log(String logMessage) {
        // some logic and logging
    }
}

他们都在同一个包里。我希望每个程序员都能调用外观而不是直接调用服务(在其他包中)。所以我尝试将一个受保护的构造函数添加到LoggingService

public class LoggingService {
    protected LoggingService() {
    }

    public void log(String logMessage) {
        // some logic and logging
    }
}

可悲的是,这并不禁止在其他类中使用{注入} LoggingService。或者换句话说

public class MyClass {
    @Inject
    private LoggingService loggingService;

    public void foo() {
        loggingService.log("Hello");
    }
}

的工作原理。您是否知道如何禁止使用LoggingService,以便每个用户都必须拨打LoggingFacade

1 个答案:

答案 0 :(得分:0)

只要您没有Java 9模块系统,就无法执行此操作。

使用Java 9,您可以定义一个不导出LoggingService的单独模块。