通过访问修饰符禁止注入

Prohibit injection via access modifier

考虑立面

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 吗?

只要您没有 Java 9 模块系统,就无法做到这一点。

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